Как преобразовать текстовые поля в числовое / векторное пространство для 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 с некоторой ручной человеческой работой. Потому что, если это просто расстояние редактирования, алгоритм узнает самое большее, как работает расстояние редактирования.

Другие вопросы по тегам