我正在寻找 R 中的快速解决方案来确定两个句子之间的单词级编辑距离。更具体地说,我想确定最少的单词添加、替换或删除次数,以将句子 A 转换为句子 B。例如,如果句子 A 是“非常漂亮的汽车”,而句子 B 是“漂亮的红色汽车”,则结果应该是 2(1 个删除和 1 个添加)。
我知道 R 中存在用于字符级编辑距离的现有解决方案(例如,本机adist()
和stringdist()
来自包'stringdist'),但我没有找到单词级的解决方案。
我正在寻找 R 中的快速解决方案来确定两个句子之间的单词级编辑距离。更具体地说,我想确定最少的单词添加、替换或删除次数,以将句子 A 转换为句子 B。例如,如果句子 A 是“非常漂亮的汽车”,而句子 B 是“漂亮的红色汽车”,则结果应该是 2(1 个删除和 1 个添加)。
我知道 R 中存在用于字符级编辑距离的现有解决方案(例如,本机adist()
和stringdist()
来自包'stringdist'),但我没有找到单词级的解决方案。
怎么样
intersect(strsplit(levels(factor("very nice car"[1]))," ")[[1]],strsplit(levels(factor("nice red car"[1]))," ")[[1]])
> [1] "nice" "car"
length(intersect(strsplit(levels(factor("very nice car"[1]))," ")[[1]],strsplit(levels(factor("nice red car"[1]))," ")[[1]]))
> [1] 2
当然,您可以制作自己的功能,甚至可以使用list
:
my_function <- function (x, prsep = " ")
{
if (isTRUE(length(x) != 0) == TRUE && isTRUE(is.na(x)) ==
FALSE) {
if (isTRUE(is.list(x)) == TRUE) {
for (i in 1:length(x)) ifelse(isTRUE(length(x[[i]]) !=
0) == TRUE, x[[i]] <- strsplit(x[[i]], prsep)[[1]],
NA)
return(x)
}
else if (isTRUE(is.list(x)) == FALSE) {
Lt <- list()
for (i in 1:length(x)) Lt[[length(Lt) + 1]] <- strsplit(levels(factor(x[i])),
prsep)[[1]]
return(Lt[[1]])
}
}
else {
x
}
}
所以你只需要
intersect(my_function("very nice car"," "), my_function("nice red car"," "))