【问题标题】:How to count documents in which two words appear in close proximity in R?如何计算 R 中两个单词非常接近的文档?
【发布时间】:2016-08-25 08:04:15
【问题描述】:

我想计算两个字符串出现在设定距离内的文档,彼此相距不超过 10 个单词。让我们说“德国*”和“战争”。 我不想计算它们总共出现的次数,而只想计算该集合出现的文档数(如果出现一次,则计为一个)。

我知道如何计算包含单词的文档。但是我不确定是否需要提取 10-grams 并查看这两个单词是否出现然后对每个文档进行计数,或者是否有更有效的方法。

【问题讨论】:

  • 文档有多大?我的第一个想法是将列表中的每个文档作为一个字符串保存,然后将所有从德语到战争的 grep 作为正则表达式。然后将结果拆分为单词并计数。
  • 它们相当大(最大 500MB)。
  • 所以我猜每一行文档都用不同的字符串?然后grep你的关键词。那我猜你的数据会小很多。在此之后,如果字符串彼此靠近,您可以加入它们并计算德语和战争之间的单词。
  • @Melvin 你能分享一些你的数据结构中的文本吗?

标签: r text tm collocation


【解决方案1】:

Hereafter 是一个小函数,用于测试文本中两个单词是否接近 100 个字符。

isclose = function(text){
  test <- FALSE
  limit <- 100 # Interval in char counts
  match1 <- gregexpr('war', text)[[1]]
  match2 <- gregexpr('German', text)[[1]]

  for(i in 1:length(match1)){
    for(j in 1:length(match2)){
      if(abs(match1[i]-match2[j]) < limit) test <- TRUE
    }
  }
  return(test)
}

它工作正常,但应该改进以计算字数而不是字符数。

【讨论】:

  • 我现在正在使用正则表达式来查找它,并且效果很好,例如:\b?:ameri[k|c]a[a-z]*\W+(?:\w+\W+){1,10}?[s|c]igaret[a-z]*|[s|c]igaret[a-z]*\W+(?:\w+\W+){1,10}?ameri[k|c]a[a-z]*)\b 用于美国和香烟
  • 你能发一个 MWE 吗?
猜你喜欢
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 2014-05-12
  • 1970-01-01
  • 2012-11-30
  • 2015-09-18
  • 1970-01-01
相关资源
最近更新 更多