【问题标题】:Package tm stop-word parameter包 tm 停用词参数
【发布时间】:2012-01-26 08:18:44
【问题描述】:

我正在尝试使用包 tm 过滤以下文档中的停用词。

library(tm)
documents <- c("the quick brown fox jumps over the lazy dog", "i am the walrus")
corpus <- Corpus(VectorSource(documents))
matrix <- DocumentTermMatrix(corpus,control=list(stopwords=TRUE))

但是,当我运行此代码时,我仍然会在 DocumentTermMatrix 中得到以下内容。

colnames(matrix)
[1] "brown"  "dog"    "fox"    "jumps"  "lazy"   "over"   "quick"  "the"    "walrus"

“The”在包tm 使用的列表中被列为停用词。我对stopwords 参数做错了什么,还是tm 包中的错误?

编辑:我联系了 Ingo Feinerer,他指出这在技术上不是错误:

首先处理用户提供的选项,然后处理所有剩余的选项 选项。因此停用词删除是在标记化之前完成的(如 已经由 Vincent Zoonekynd 在 stackoverflow.com 上编写),它给出了 正是你的结果。

因此,解决方案是在stopwords参数之前显式列出默认的分词选项,例如:

library(tm)
documents <- c("the quick brown fox jumps over the lazy dog", "i am the walrus")
corpus <- Corpus(VectorSource(documents))
matrix <- DocumentTermMatrix(corpus,control=list(tokenize=scan_tokenizer,stopwords=TRUE))
colnames(matrix)

【问题讨论】:

  • 感谢您的问题和答案......尽管它们在我的问题中根本不起作用。似乎 TM 中的停用词目前只是一个令人头疼的问题。

标签: r nlp


【解决方案1】:

您也可以在创建术语矩阵之前尝试从语料库中删除停用词。

text_corpus <- tm_map(text_corpus, removeWords, stopwords("english"))
dtm <- DocumentTermMatrix(text_corpus)

这通常对我有用。

【讨论】:

    【解决方案2】:

    这是一个错误:您可能希望将其报告给软件包作者。 termFreq 函数将各种过滤器应用于文本,但并不总是以正确的顺序。在您的示例中,代码尝试在标记化之前删除停用词,即在文本被切割成单词之前 - 一旦我们知道单词是什么,它应该在之后。

    【讨论】:

    • 如何让control 列表在词被标记后应用于它们?
    • 在修复错误之前,最简单的解决方法是 Sacha 的回答。将标记器添加到控制列表(在停用词之前:顺序很重要)也可能有效,但它看起来不必要地复杂。
    • 在我看来,这要简单得多:您将所有操作保存在一行代码中,而不是将它们分散到几行代码中。这样可以更轻松地一目了然地了解正在应用哪些转换(尤其是在应用多个转换时)。
    【解决方案3】:

    一个快速的解决方法是在之后运行它:

    matrix <- matrix[,!colnames(matrix)%in%stopwords()]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-22
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      • 2021-09-27
      • 2015-01-10
      • 2012-02-12
      • 1970-01-01
      相关资源
      最近更新 更多