3

我有一堆公司名称要匹配,例如我要匹配这个字符串:A&A PRECISION

A&A PRECISION ENGINEERING

但是,我使用的几乎所有相似性度量:例如 Hamming 距离、Levenshtein 距离、Restricted Damerau-Levenshtein 距离、Full Damerau-Levenshtein 距离、最长公共子串距离、Q-gram 距离、余弦距离、Jaccard 距离 Jaro 和 Jaro-Winkler 距离

匹配:B&B PRECISION相反。

任何想法哪个度量会更加强调子字符串的精确性及其匹配的序列并且不太关心字符串的长度?我认为正是由于字符串的长度,指标总是会错误地选择。

4

1 回答 1

1

如果你真的想“......更加强调子字符串及其序列的精确性......”,那么这个函数可以工作,因为它测试一个字符串是否是另一个字符串的子字符串:

library(data.table)

x <- c("A&A PRECISION", "A&A PRECISION ENGINEERING", "B&B PRECISION")
y <- x

我们想扩大网格。为此,我会CJ使用data.table. 然后,我们将检查每一对,看看 x 是否是 y 的子串(反过来就不行了):

CJ(x, y)[, similarity := apply(.SD, 1, function(x) x[2] %like% x[1]), .SDcols = c("x", "y")][x != y, ]
                           x                         y similarity
1:             A&A PRECISION A&A PRECISION ENGINEERING       TRUE
2:             A&A PRECISION             B&B PRECISION      FALSE
3: A&A PRECISION ENGINEERING             A&A PRECISION      FALSE
4: A&A PRECISION ENGINEERING             B&B PRECISION      FALSE
5:             B&B PRECISION             A&A PRECISION      FALSE
6:             B&B PRECISION A&A PRECISION ENGINEERING      FALSE

请记住,您需要确保字符串尽可能整洁才能使其正常工作,即使那样它也可能会失败。

我会检查一些东西来清理你的字符串:

  • 删除多个空格,
  • 删除字符串开头/结尾的空格
  • 确保相同的编码
  • 确保相同的CASE

你可以用这个stringi包来实现。

于 2019-11-09T17:32:22.520 回答