目的: 我想使用具有复合词或双连词作为某些关键字的字典来创建术语-文档矩阵。

网络搜索: 作为文本挖掘和 tm 中的 R 包的新手,我访问了网络以找出如何执行此操作。以下是我找到的一些相关链接:

  • FAQS on the tm-package website
  • finding 2 & 3 word phrases using r tm package
  • counter ngram with tm package in r
  • findassocs for multiple terms in r

  • 背景: 其中,我更喜欢使用 NGramTokenizerRWeka 包中的 R 的解决方案, 但我遇到了 问题。在下面的示例代码中,我创建了三个文档并将它们放在一个语料库中。请注意,Docs 12 每个都包含两个词。 Doc 3 只包含一个词。我的字典关键字是两个二元词组和一个一元词组。

    问题: 上述链接中的 NGramTokenizer 解决方案没有正确计算 Doc 3 中的 unigram 关键字。
    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。我有什么误解吗?

    最佳答案

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

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

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

    关于R 和 tm 包 : create a term-document matrix with a dictionary of one or two words?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28033034/

    10-12 18:57