【问题标题】:R count how often words from a list appear in a sentenceR计算列表中单词在句子中出现的频率
【发布时间】:2015-08-02 20:28:58
【问题描述】:

目前正在参加 MOOC 并尝试进行一些情绪分析,但在使用 R 代码时遇到了问题。

我有一个坏词列表和一个好词列表。例如我的坏话是 c("dent", "broken", "wear", "cracked") 等。

我的数据框中有一个描述列表,我想做的是计算列表中出现了多少我的坏词以及每一行出现了多少我的好词。

例如假设这是我的数据框

desc = c("this screen is cracked", "minor dents and scratches", "100% good",     "in perfect condition")
id = c(1,2,3,4)
df = data.frame(id, desc)
bad.words = c("cracked", "scratches", "dents")

我想要的是创建一个总和列来计算每个坏词在描述中出现的频率

所以希望我的最终 df 看起来像

id    desc                        sum
1     "this screen is cracked"    1
2     "minor dents and scratches" 2
3     "100% good"                 0
4     "in perfect condition"      0

我目前拥有的是

df$sum <- grepl(paste( bad.words, collapse="|"), df$desc)

只有在出现单词时才会让我判断是真还是假

【问题讨论】:

  • sum(grepl(paste(bad.words, collapse="|"), description))?如果是这样,是的,尝试一下,但结果似乎不正确,因为所有列的值都相同
  • 最终的目标是尝试使用正则表达式,这样crack也可以匹配cracked和/或cracks
  • 试图让它更清楚一点,因为它仍然无法与 sapply 一起使用
  • 可能是colSums(sapply(df$desc, function(x) sapply(bad.words, function(y) sum(grepl(y,x)))))sapply(strsplit(as.character(df$desc), ' '), function(x) sum(x %in% bad.words))

标签: r sentiment-analysis


【解决方案1】:

如果您要求和,vapply()sapply() 更合适。你可以这样做

library(stringi)
df$sum <- vapply(df$desc, function(x) sum(stri_count_fixed(x, bad.words)), 1L)

这给了

df
#   id                      desc sum
# 1  1    this screen is cracked   1
# 2  2 minor dents and scratches   2
# 3  3                 100% good   0
# 4  4      in perfect condition   0

【讨论】:

    【解决方案2】:

    因为您可能会尝试不同的单词列表,例如 good.words、bad.words、really.bad.words;我会写一个函数。我喜欢 lapply,但 vapply 和其他人也可以。

    countwords <- function(x,comparison){
      lapply(x,function(x,comparewords){
        sum(strsplit(x,' ')[[1]] %in% comparewords)
      },comparewords = comparison)
    }
    df$good <- countwords(df$desc,good.words)
    df$bad <- countwords(df$desc,bad.words)
    

    tm 包也很有用,在您满足于学习并转向生产速度之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      相关资源
      最近更新 更多