R построить матрицу терминов документа, как сопоставить словари, значения которых состоят из фраз, разделенных пробелами

При интеллектуальном анализе текста с использованием R после повторной обработки текстовых данных нам необходимо создать матрицу терминов документа для дальнейшего изучения. Но, как и в китайском, в английском также есть некоторые определенные фазы, такие как «семантическая дистанция», «машинное обучение», если вы разделите их на слова, они будут иметь совершенно разные значения, я хочу знать, как сопоставить заранее определенные словари, чьи значения состоят из терминов, разделенных пробелами, например, содержат «семантическое расстояние», «машинное обучение». если документ «мы могли бы использовать метод машинного обучения для вычисления семантического расстояния слов», при применении этого документа к словарю [«семантическое расстояние», «машинное обучение»] он вернет матрицу 1x2: [семантическое расстояние, 1 ;машинное обучение,1]


person Fiona_Wang    schedule 20.04.2016    source источник


Ответы (1)


Это можно сделать с помощью Quanteda, хотя для этого требуется создание словаря для каждой фразы, а затем предварительная обработка текста для преобразования фраз в токены. Чтобы стать «токеном», фразы должны быть соединены чем-то другим, кроме пробела — здесь символом «_».

Вот несколько примеров текстов, включая фразу в ОП. Я добавил два дополнительных текста для иллюстрации — ниже первая строка матрицы характеристик документа дает запрошенный ответ.

txt <- c("We could use machine learning method to calculate the words semantic distance.",
         "Machine learning is the best sort of learning.",
         "The distance between semantic distance and machine learning is machine driven.")

Текущая подпись для фразы в токен требует, чтобы аргумент phrases был словарем или объектом словосочетаний. Здесь мы сделаем это словарем:

mydict <- dictionary(list(machine_learning = "machine learning", 
                          semantic_distance = "semantic distance"))

Затем мы предварительно обрабатываем текст, чтобы преобразовать словарные фразы в их ключи:

toks <- tokens(txt) %>%
    tokens_compound(mydict)
toks
# tokens from 3 documents.
# text1 :
# [1] "We"                "could"             "use"               "machine_learning" 
# [5] "method"            "to"                "calculate"         "the"              
# [9] "words"             "semantic_distance" "."                
# 
# text2 :
# [1] "Machine_learning" "is"               "the"              "best"            
# [5] "sort"             "of"               "learning"         "."               
# 
# text3 :
# [1] "The"               "distance"          "between"           "semantic_distance"
# [5] "and"               "machine_learning"  "is"                "machine"          
# [9] "driven"            "."    

Наконец, мы можем построить матрицу характеристик документа, сохраняя соответствие всех фраз, использующих шаблон "glob" по умолчанию, для любой функции, включающей символ подчеркивания:

mydfm <- dfm(toks, select = "*_*")
mydfm
## Document-feature matrix of: 3 documents, 2 features.
## 3 x 2 sparse Matrix of class "dfm"
##        features
## docs    machine_learning semantic_distance
##   text1                1                 1
##   text2                1                 0
##   text3                1                 1

(Ответ обновлен для версии >= 0.9.9)

person Ken Benoit    schedule 20.04.2016
comment
Но если в словаре есть ключ с шаблоном регулярного выражения, то «фразетокен» не работает. - person Fiona_Wang; 20.04.2016
comment
Это правильно, к сожалению. Но это сработает, когда я добавлю поддержку словарных значений, состоящих из нескольких слов. - person Ken Benoit; 20.04.2016
comment
Большое спасибо! возможно, это шанс обновить функцию 'phrasetotoken' для работы со словарем, имеющим ключи с шаблоном regexp. - person Fiona_Wang; 21.04.2016
comment
когда я использую 'dictionary = mydict' в функции dfm, она возвращает матрицы 3x2, но все элементы равны 0, почему? - person Fiona_Wang; 25.04.2016
comment
Потому что нет совпадений для ваших значений в mydict, которые представляют собой фразы из двух слов. Вот почему мы преобразовали фразы из двух слов в одно слово, состоящее из слов-элементов, соединенных _, а затем вызвали dfm(txtPhrases, keptFeatures = "*_*"), чтобы выбрать только эти слова для DFM. - person Ken Benoit; 25.04.2016