模糊匹配两个字符串uring r

时间:2016-10-28 06:21:20

标签: r text match fuzzy

我有两个向量,每个向量包含一系列字符串。例如,

V1=c("pen", "document folder", "warn")
V2=c("pens", "copy folder", "warning")

我需要找到最匹配的两个。我直接使用levenshtein距离。但这还不够好。就我而言,钢笔和钢笔应该是一样的。文件夹和复制文件夹可能是一回事。警告和警告实际上是一样的。我正在尝试使用像tm这样的软件包。但我不太确定哪些功能适合这样做。谁能告诉我这件事?

2 个答案:

答案 0 :(得分:1)

这是Levenshtein distance的维基。它测量需要采取多少删除/更改/插入操作来转换字符串。模糊匹配的方法之一是最小化该值。

这是一个例子。我拖了一下订单,让它不那么无聊:

V1 <- c("pen", "document folder", "warn")
V2 <- c("copy folder", "warning", "pens")

apply(adist(x = V1, y = V2), 1, which.min)
[1] 3 1 2

输出装置,V2的位置对应于V1的最接近的变换,按V1的顺序。

data.frame(string_to_match = V1, 
           closest_match = V2[apply(adist(x = V1, y = V2), 1, which.min)])
  string_to_match closest_match
1             pen          pens
2 document folder   copy folder
3            warn       warning

答案 1 :(得分:1)

根据我的经验,余弦匹配对于这类工作来说是一个很好的选择:

V1 <- c("pen", "document folder", "warn")
V2 <- c("copy folder", "warning", "pens")   
result <- sapply(V1, function(x) stringdist(x, V2, method = 'cosine', q = 1))
rownames(result) <- V2
result
                  pen document folder      warn
copy folder 0.6797437       0.2132042 0.8613250
warning     0.6150998       0.7817821 0.1666667
pens        0.1339746       0.6726732 0.7500000

当距离足够近时,你必须定义一个截止,距离越低它们匹配的程度越多。您还可以使用Q参数来说明应该将多少个字母组合相互比较。例如:

result <- sapply(V1, function(x) stringdist(x, V2, method = 'cosine', q = 3))
rownames(result) <- V2
result
                  pen document folder      warn
copy folder 1.0000000       0.5377498 1.0000000
warning     1.0000000       1.0000000 0.3675445
pens        0.2928932       1.0000000 1.0000000