如何在 R Studio 中为 SVM 将文本字段转换为 numeric/vector space?
How to convert text fields into numeric/vector space for a SVM in R Studio?
我正在尝试训练支持向量机来帮助检测字符串之间的相似性。我的训练数据由两个文本字段和包含 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 库,using this useful vignette 作为指南。这样做,我大概可以表示向量 space 中的字段之一。
- 但是我怎样才能使用这个库同时管理两个文本字段呢?
- 我应该将两个字符串字段连接成一个字段吗?
- 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)
将文档嵌入同一 space 的一种方法是从两列学习词汇:
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_tokenizer
和 ngram > 1
(比如 ngram = c(3, 3)
)。并检查很棒的 stringdist 包。我想您收到了 Result
一些人工工作。因为如果只是编辑距离,算法最多会学习编辑距离是如何工作的。
我正在尝试训练支持向量机来帮助检测字符串之间的相似性。我的训练数据由两个文本字段和包含 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 库,using this useful vignette 作为指南。这样做,我大概可以表示向量 space 中的字段之一。
- 但是我怎样才能使用这个库同时管理两个文本字段呢?
- 我应该将两个字符串字段连接成一个字段吗?
- 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)
将文档嵌入同一 space 的一种方法是从两列学习词汇:
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_tokenizer
和 ngram > 1
(比如 ngram = c(3, 3)
)。并检查很棒的 stringdist 包。我想您收到了 Result
一些人工工作。因为如果只是编辑距离,算法最多会学习编辑距离是如何工作的。