【问题标题】:Identifying and grouping synonyms in R在 R 中识别和分组同义词
【发布时间】:2017-07-13 02:02:19
【问题描述】:

我正在尝试识别和汇总给定数据集的同义词。请参阅下面的示例数据。

library(tm)
library(SnowballC)

dataset <- c("dad glad accept large admit large accept dad big large big accept big accept dad dad Happy dad accept glad papa dad Happy dad glad dad dad papa admit Happy big accept accept big accept dad Happy admit Happy Happy glad Happy dad accept accept large daddy large accept large large large big daddy accept admit dad admit daddy dad admit dad admit Happy accept accept Happy daddy accept admit")

docs <- Corpus(VectorSource(dataset))
dtm <- TermDocumentMatrix(docs)
m <- as.matrix(dtm)
sort(rowSums(m),decreasing=TRUE)

结果:

accept    dad  happy  admit  large    big  daddy   glad   papa 
    15     14      9      8      8      6      4      4      2 

我想使用我下载并安装的 wordnet 包查找上述每个单词的同义词。例如,要获得“接受”的同义词,我可以这样做:

library(wordnet)
setDict("C:/Program Files (x86)/WordNet/2.1/dict")

filter <- getTermFilter("ExactMatchFilter", "accept", TRUE)
terms <- getIndexTerms("VERB", 1, filter)
getSynonyms(terms[[1]])

结果:

 [1] "accept"    "admit"     "assume"    "bear"      "consent"   "go for"    "have"      "live with"
 [9] "swallow"   "take"      "take on"   "take over"

现在,我想合并这两个结果集,以便按以下方式对同义词进行分组。 标记给定组的最常用词(排名 1),然后按这些词分组,类似于:

id  word    word_count  syn_group   rank
1   accept  15          1           1
5   admit   8           1           2
2   dad     14          2           1
8   daddy   4           2           2
9   papa    2           2           3
3   happy   9           3           1
7   glad    4           3           2
4   large   8           4           1
6   big     6           4           2

然后可以像这样聚合

id  word    word_count
1   accept  15+8
2   dad     14+4+2
3   happy   9+4
4   large   8+6

最后的结果就是

id  word    word_count
1   accept  23
2   dad     20
3   large   14
4   happy   13

我遇到了几个问题,包括让 GetIndexTerms 遍历单词,无论它们是名词、动词等。希望这一切都有意义吗?任何帮助将非常感激。谢谢。

【问题讨论】:

  • 仅供参考:转到 Wordnet.princeton.edu 并下载适用于您的操作系统的 WordNet 版本。安装好之后,你可以在library(wordnet)之后从GraveDigger的代码中获取。

标签: r wordnet synonym


【解决方案1】:

我们可以使用dplyr做以下事情

library(dplyr)
df %>% 
  group_by(syn_group) %>%
  mutate(sum_word_count = sum(word_count)) %>% 
  filter(rank == 1)

数据:

df <- read.table(text = "id  word    word_count  syn_group   rank
1   accept  15          1           1
5   admit   8           1           2
2   dad     14          2           1
8   daddy   4           2           2
9   papa    2           2           3
3   happy   9           3           1
7   glad    4           3           2
4   large   8           4           1
6   big     6           4           2", header = T)

请下次发布dput 的输出。

编辑:这里有一些代码可以帮助您开始循环遍历单词和词性,并存储同义词。剩下的就是确定当前术语是否是前一个术语的同义词,在这种情况下,您已经拥有同义词,您可以分配一个唯一的同义词组。接下来,您需要存储一些结果。最后,您需要计算排名,也就是seq_along 的同义词和一个grep 来确定排名位置。 cmets 提示您可能希望在哪里包含这些提示的代码。

d <- data.frame(Term = row.names(m), word_count = m[,1])
all_pos <- c("ADJECTIVE", "ADVERB", "NOUN","VERB")
syns <- vector("list", length(all_pos))
for(w in seq(nrow(d))){
  # if sysns of (d$Term[w]) has been calculated skip over current w 
  emf <- getTermFilter("ExactMatchFilter", d$Term[w], TRUE)  
  for(i in seq_along(syns)){
    terms <- getIndexTerms(all_pos[i], 1, emf)
    if(is.null(terms)){
      syns[i] <- NA
    } else{
      syns[[i]] <-  getSynonyms(terms[[1]])
    }
  }
  # store the results of syns for current w 
}

【讨论】:

  • 感谢您的回复。问题是我没有那张桌子(请参阅您的评论),这就是我想要提出的。我得到的只是带有一堆单词和访问 wordnet 的字符向量。还有什么建议吗?再次感谢!
  • @GraveDigger,已编辑以包含足够的信息来帮助您解决此问题。
  • 谢谢!!我对 R 比较陌生,所以不明白你所做的一切,需要花一些时间弄清楚你做了什么以及为什么。
猜你喜欢
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
  • 2018-01-04
  • 1970-01-01
相关资源
最近更新 更多