3

目的: 我想使用具有复合词或bigrams作为一些关键字的字典创建一个术语文档矩阵

网络搜索: 作为文本挖掘和 中的tm包的新手R,我上网了解如何做到这一点。以下是我找到的一些相关链接:

背景: 其中,我更喜欢NGramTokenizerRWeka包中使用的解决方案R但我遇到了一个问题。在下面的示例代码中,我创建了三个文档并将它们放在一个corpus中。请注意,Docs 1and2每个都包含两个单词。 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人付出代价。我有什么误解吗?1jedi0

4

2 回答 2

3

我遇到了同样的问题,发现 TM 包中的标记计数函数依赖于一个名为wordLengths的选项,它是两个数字的向量——要跟踪的标记的最小和最大长度。默认情况下,TM 使用的最小字长为 3 个字符 ( wordLengths = c(3, Inf))。您可以通过在对DocumentTermMatrix的调用中将其添加到控制列表中来覆盖此选项,如下所示:

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

但是,您的“绝地”单词长度超过 3 个字符。虽然,您可能在尝试弄清楚如何计算 ngram 时更早地调整了选项的值,所以还是试试这个。另外,查看bounds选项,它告诉 TM 丢弃比指定值更少或更频繁的单词。

于 2015-07-26T12:19:19.537 回答
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

如果有人在上面的代码中发现了我没有考虑的“陷阱”,请告诉我。我也希望能深入了解我在上面的观察中NGramTokenizer返回character(0)的原因。

于 2015-01-19T20:33:18.247 回答