【问题标题】:Stemming words in r does not work as expectedr 中的词干无法按预期工作
【发布时间】:2015-04-08 15:18:45
【问题描述】:

我正在尝试在 R 中做一个非常简单的词,并得到一些非常出乎意料的东西。在下面的代码中,“完整”变量是“NA”。为什么我不能完成单词easy的词干?

library(tm) 
library(SnowballC)
dict <- c("easy")
stem <- stemDocument(dict, language = "english")
complete <- stemCompletion(stem, dictionary=dict)

谢谢!

【问题讨论】:

    标签: r tm snowball


    【解决方案1】:

    您可以使用tm:::stemCompletion 查看stemCompletion() 函数的内部结构。

    function (x, dictionary, type = c("prevalent", "first", "longest", "none", "random", "shortest")){
    if(inherits(dictionary, "Corpus")) 
      dictionary <- unique(unlist(lapply(dictionary, words)))
    type <- match.arg(type)
    possibleCompletions <- lapply(x, function(w) grep(sprintf("^%s",w), dictionary, value = TRUE))
    switch(type, first = {
      setNames(sapply(possibleCompletions, "[", 1), x)
    }, longest = {
      ordering <- lapply(possibleCompletions, function(x) order(nchar(x), 
          decreasing = TRUE))
      possibleCompletions <- mapply(function(x, id) x[id], 
          possibleCompletions, ordering, SIMPLIFY = FALSE)
      setNames(sapply(possibleCompletions, "[", 1), x)
    }, none = {
      setNames(x, x)
    }, prevalent = {
      possibleCompletions <- lapply(possibleCompletions, function(x) sort(table(x), 
          decreasing = TRUE))
      n <- names(sapply(possibleCompletions, "[", 1))
      setNames(if (length(n)) n else rep(NA, length(x)), x)
    }, random = {
      setNames(sapply(possibleCompletions, function(x) {
          if (length(x)) sample(x, 1) else NA
      }), x)
    }, shortest = {
      ordering <- lapply(possibleCompletions, function(x) order(nchar(x)))
      possibleCompletions <- mapply(function(x, id) x[id], 
          possibleCompletions, ordering, SIMPLIFY = FALSE)
      setNames(sapply(possibleCompletions, "[", 1), x)
    })
    

    }

    x 参数是您的词干词,dictionary 是非词干词。唯一重要的是第五行;它对字典术语列表中的词干进行简单的正则表达式匹配。

    possibleCompletions <- lapply(x, function(w) grep(sprintf("^%s",w), dictionary, value = TRUE))
    

    因此它失败了,因为它找不到“easi”和“easy”的匹配项。如果您的字典中还有“最简单”这个词,那么这两个词都匹配,因为现在有一个字典词的开头四个字母相同。

    library(tm) 
    library(SnowballC)
    dict <- c("easy","easiest")
    stem <- stemDocument(dict, language = "english")
    complete <- stemCompletion(stem, dictionary=dict)
    complete
         easi   easiest 
    "easiest" "easiest" 
    

    【讨论】:

    • 感谢您的解释!我想我现在应该研究一下 stem 函数,为什么它实际上会将“easy”这个词变成“easi”。
    【解决方案2】:

    wordStem() 似乎做到了..

    library(tm) 
    library(SnowballC)
    dict <- c("easy")
    > wordStem(dict)
    [1] "easi"
    

    【讨论】:

    • 词干有效。我的观点是 stemCompletion 没有。我希望 stemCompletion 函数将轻松替换 easi 。我认为它应该是错误的吗?
    • 是的,看起来它只是因为“简单”而失败。尝试dict &lt;- c("easy", "easiest", "easier") 并重新运行。似乎它只是无法弄清楚“容易”
    • @cory 就是这样。详情见我的回答
    猜你喜欢
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 2013-12-23
    相关资源
    最近更新 更多