R and tm package: создать матрицу термин-документ со словарем из одного или двух слов?

Цель: я хочу создать матрицу термин-документ, используя словарь, который содержит составные слова или биграммы, как некоторые из ключевых слов.

Поиск в Интернете: будучи новичком в области интеллектуального анализа текста и пакета tm в R, я пошел в Интернет, чтобы выяснить, как это сделать. Ниже приведены некоторые ссылки, которые я нашел:

Предпосылки: из них я предпочел решение, в котором используется NGramTokenizer в RWeka пакете в R, но я столкнулся с проблемой. В приведенном ниже примере кода я создаю три документа и помещаю их в корпус. Обратите внимание, что Docs 1 и 2 содержат по два слова. Doc 3 содержит только одно слово. Ключевые слова моего словаря - это две биграммы и униграмма.

Проблема: Решение NGramTokenizer в приведенных выше ссылках неправильно подсчитывает ключевое слово unigram в Doc 3.

library(tm)
library(RWeka)

my.docs = c('jedi master', 'jedi grandmaster', 'jedi')
my.corpus = Corpus(VectorSource(my.docs))
my.dict = c('jedi master', 'jedi grandmaster', 'jedi')

BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 1, max = 2))

inspect(DocumentTermMatrix(my.corpus, control=list(tokenize=BigramTokenizer,
                                                  dictionary=my.dict)))

# <<DocumentTermMatrix (documents: 3, terms: 3)>>
# ...
# Docs  jedi  jedi grandmaster  jedi master
#    1     1                 0            1
#    2     1                 1            0
#    3     0                 0            0

Я ожидал, что строка для Doc 3 даст 1 для jedi и 0 для двух других. Я что-то недопонимаю?


person b_ron_    schedule 19.01.2015    source источник


Ответы (2)


Я столкнулся с той же проблемой и обнаружил, что функции подсчета токенов из пакета TM полагаются на параметр под названием wordLengths, который представляет собой вектор из двух чисел - минимальной и максимальной длины токенов, которые нужно отслеживать. из. По умолчанию TM использует минимальную длину слова в 3 символа (wordLengths = c(3, Inf)). Вы можете переопределить этот параметр, добавив его в список control при вызове DocumentTermMatrix следующим образом:

DocumentTermMatrix(my.corpus,
                   control=list(
                       tokenize=newBigramTokenizer,
                       wordLengths = c(1, Inf)))

Однако ваше слово «джедай» содержит более трех символов. Хотя вы, вероятно, изменили значение параметра ранее, пытаясь выяснить, как считать нграммы, так что все же попробуйте это. Также обратите внимание на параметр bounds, который указывает TM отбрасывать слова реже или чаще, чем указанные значения.

person alkoln    schedule 26.07.2015
comment
Thnx для указателя на wordlengths в элементе управления. Я думал, что что-то подобное происходит, когда я не мог найти слово tv, но смог, когда я заменил его на телевидение во всех своих данных. - person CallumH; 20.02.2016

Я заметил, что NGramTokenizer возвращает character(0), когда в качестве входных данных отправляется строка из одного слова, а NGramTokenizer просят вернуть униграммы и биграммы.

NGramTokenizer('jedi',  Weka_control(min = 1, max = 2))
# character(0)

Я не уверен, почему это результат, но я считаю, что такое поведение является причиной того, что ключевое слово jedi не было учтено в Doc 3. Однако в моей ситуации работает простое if-then-else решение: как для набора образцов, так и для моего фактического набора данных.

library(tm)
library(RWeka)    

my.docs = c('jedi master', 'jedi grandmaster', 'jedi')
my.corpus = Corpus(VectorSource(my.docs))
my.dict = c('jedi master', 'jedi grandmaster', 'jedi')

newBigramTokenizer = function(x) {
  tokenizer1 = NGramTokenizer(x, Weka_control(min = 1, max = 2))
  if (length(tokenizer1) != 0L) { return(tokenizer1)
  } else return(WordTokenizer(x))
} # WordTokenizer is an another tokenizer in the RWeka package.

inspect(DocumentTermMatrix(my.corpus, control=list(tokenize=newBigramTokenizer,
                                                 dictionary=my.dict)))

# <<DocumentTermMatrix (documents: 3, terms: 3)>>
# ...
# Docs jedi jedi grandmaster jedi master
#   1    1                0           1
#   2    1                1           0
#   3    1                0           0

Пожалуйста, дайте мне знать, если кто-нибудь обнаружит ошибку, которую я не рассматриваю в приведенном выше коде. Я также был бы признателен за любое понимание того, почему NGramTokenizer возвращает character(0) в моём наблюдении выше.

person b_ron_    schedule 19.01.2015