【发布时间】:2014-01-23 18:47:58
【问题描述】:
假设我在文件中有一行:
string <- "thanks so much for your help all along. i'll let you know when...."
我想返回一个值,指示单词 know 是否在 help 的 6 个单词内。
【问题讨论】:
假设我在文件中有一行:
string <- "thanks so much for your help all along. i'll let you know when...."
我想返回一个值,指示单词 know 是否在 help 的 6 个单词内。
【问题讨论】:
这本质上是蜡笔作为基本功能的答案的非常粗略的实现:
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
我建议您对可用的文本工具有一个基本的了解,并使用它们来编写这样的函数。注意 Tyler 的评论:正如实现的那样,这可以匹配多个术语(“you”将匹配“you”和“your”)导致有趣的结果。您需要确定如何处理这些情况才能获得更有用的功能。
【讨论】:
withinRange(string, "you", "know") 角落案例,但发帖人可能根本不在乎。 your 应该算吗? +1
R!
您将无法仅从正则表达式中获得此信息。我建议使用空格作为分隔符进行拆分,然后循环或使用内置函数对您的两个术语进行数组搜索并减去索引(数组位置)的差异。
编辑:好的,我想了一下,也许这对你来说是一个正则表达式模式:
\bhelp(\s+[^\s]+){1,5}+\s+know\b
这采用了相同的“空格是分隔符”的概念。首先匹配寻求帮助,然后贪婪地匹配最多 5 个“单词”,然后寻找“知道”(因为“知道”将是第 6 个)。
【讨论】:
拆分你的字符串:
> 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
编辑加
索引单词有很大的优势,一旦完成,您就可以对文本进行大量统计。
【讨论】: