2015-01-19 8 views
3

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

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

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

Проблема:NGramTokenizer решения в вышеуказанных ссылках не правильно сосчитать Юниграмма ключевого слова в 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 для двух других. Я что-то недопонимаю?

ответ

1

Я заметил, что 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 

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

3

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

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

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

+0

Thnx для указателя на 'wordlengths' в элементе управления. Я думал, что что-то подобное происходит, когда я не могу найти слово «телевидение», но мог, когда я заменил его «телевидением» на протяжении моих данных. – CallumH