Как преобразовать текстовые поля в числовое / векторное пространство для SVM в 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, используя эту полезную виньетку в качестве руководства. При этом я могу предположительно представить одно из полей в векторном пространстве.
- Но как я могу использовать эту библиотеку для управления обоими текстовыми полями одновременно?
- Должен ли я объединить два строковых поля в одно поле?
- Является ли 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)
1 ответ
Один из способов встраивания документов в одно и то же пространство - это изучение словарного запаса из обеих колонок:
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
с некоторой ручной человеческой работой. Потому что, если это просто расстояние редактирования, алгоритм узнает самое большее, как работает расстояние редактирования.