-1

我正在尝试训练支持向量机来帮助检测字符串之间的相似性。我的训练数据由两个文本字段和一个包含 0 或 1 以表示相似性的第三个字段组成。最后一个字段是在编辑距离操作的帮助下计算的。我知道在继续之前我需要将两个文本字段转换为数值。我希望找出实现这一目标的最佳方法是什么?

训练数据如下所示:

ID          MAKTX_Keyword       PH_Level_04_Keyword   Result
266325638   AMLODIPINE          AMLODIPINE              0
724712821   IRBESARTANHCTZ      IRBESARTANHCTZ          0
567428641   RABEPRAZOLE         RABEPRAZOLE             0
137472217   MIRTAZAPINE         MIRTAZAPINE             0
175827784   FONDAPARINUX        ARIXTRA                 1
456372747   VANCOMYCIN          VANCOMYCIN              0
653832438   BRUFEN              IBUPROFEN               1
917575539   POTASSIUM           POTASSIUM               0
222949123   DIOSMINHESPERIDIN   DIOSMINHESPERIDIN       0
892725684   IBUPROFEN           IBUPROFEN               0

我一直在尝试使用text2vec库,使用这个有用的小插图作为指南。这样做,我大概可以表示向量空间中的一个字段。

  • 但是我怎样才能使用这个库来同时管理两个文本字段呢?
  • 我应该将两个字符串字段连接成一个字段吗?
  • text2vec是最好的方法吗?

将用于管理其中一个字段的代码:

library(text2vec)
library(data.table)

preproc_func = tolower
token_func = word_tokenizer

it_train = itoken(Train_PRDHA_String.df$MAKTX_Keyword, 
                  preprocessor = preproc_func, 
                  tokenizer = token_func, 
                  ids = Train_PRDHA_String.df$ID, 
                  progressbar = TRUE)
vocab = create_vocabulary(it_train)

vectorizer = vocab_vectorizer(vocab)
t1 = Sys.time()
dtm_train = create_dtm(it_train, vectorizer)
print(difftime(Sys.time(), t1, units = 'sec'))

dim(dtm_train)
identical(rownames(dtm_train), Train_PRDHA_String.df$id) 
4

1 回答 1

0

将文档嵌入同一空间的一种方法是从两列中学习词汇:

preproc_func = tolower
token_func = word_tokenizer
union_txt = c(Train_PRDHA_String.df$MAKTX_Keyword, Train_PRDHA_String.df$PH_Level_04_Keyword)
it_train = itoken(union_txt, 
                  preprocessor = preproc_func, 
                  tokenizer = token_func, 
                  ids = Train_PRDHA_String.df$ID, 
                  progressbar = TRUE)
vocab = create_vocabulary(it_train)
vectorizer = vocab_vectorizer(vocab)

it1 = itoken(Train_PRDHA_String.df$MAKTX_Keyword, preproc_func, 
             token_func, ids = Train_PRDHA_String.df$ID)
dtm_train_1 = create_dtm(it1, vectorizer)

it2 = itoken(Train_PRDHA_String.df$PH_Level_04_Keyword, preproc_func, 
             token_func, ids = Train_PRDHA_String.df$ID)
dtm_train_2 = create_dtm(it2, vectorizer)

之后,您可以将它们组合成一个矩阵:

dtm_train = cbind(dtm_train_1, dtm_train_2)

但是,如果您想解决重复检测问题,我建议您使用char_tokenizerwith ngram > 1(say ngram = c(3, 3))。并检查伟大的stringdist包。我想你收到Result了一些人工的工作。因为如果只是编辑距离,算法最多会学习编辑距离是如何工作的。

于 2017-07-05T12:36:32.453 回答