在R中获得两个单词之间的距离

时间:2014-01-23 18:47:58

标签: regex r

说我在文件中有一行:

string <- "thanks so much for your help all along. i'll let you know when...."

我想返回一个值,指示单词know是否在help的6个单词内。

3 个答案:

答案 0 :(得分:3)

这基本上是蜡笔作为基本功能的答案的粗略实现:

withinRange <- function(string, term1, term2, threshold = 6) {
  x <- strsplit(string, " ")[[1]]
  abs(grep(term1, x) - grep(term2, x)) <= threshold
}

withinRange(string, "help", "know")
# [1] TRUE

withinRange(string, "thanks", "know")
# [1] FALSE

我建议您了解可用的文本工具,并使用它们编写这样的函数。注意泰勒的评论:如果实施,这可以匹配多个术语(“你”将匹配“你”和“你的”)导致有趣的结果。您需要确定如何处理这些情况以获得更有用的功能。

答案 1 :(得分:2)

你无法单独从正则表达式获得这个。我建议使用空格作为分隔符进行拆分,然后循环或使用内置函数对两个项进行数组搜索并减去索引的差异(数组位置)。

编辑:好的,我想了一下,也许这会对你有用作为正则表达式:

\bhelp(\s+[^\s]+){1,5}+\s+know\b

这需要相同的“空间是分隔符”概念。首先匹配帮助然后贪婪地达到5“单词”然后寻找“知道”(因为“知道”将是第6个)。

答案 2 :(得分:0)

拆分你的字符串:

> words <- strsplit(string, '\\s')[[1]]

构建索引向量:

> indices <- 1:length(words)

名称索引:

> names(indices) <- words

计算单词之间的距离:

> abs(indices["help"] - indices["know"]) < 6
FALSE

编辑在函数中

 distance <- function(string, term1, term2) {
    words <- strsplit(string, "\\s")[[1]]
    indices <- 1:length(words)
    names(indices) <- words
    abs(indices[term1] - indices[term2])
 }

 distance(string, "help", "know") < 6

编辑加号

索引单词有很大的优势,一旦完成,你就可以处理很多关于文本的统计数据。