两个字符串的最佳相似性距离度量

Best similarity distance metric for two strings

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

A&A PRECISION ENGINEERING

然而,几乎所有我使用的相似性度量:像汉明距离、Levenshtein 距离、Restricted Damerau-Levenshtein 距离、Full Damerau-Levenshtein 距离、最长公共子串距离、Q-gram 距离、余弦距离、Jaccard 距离 Jaro、和 Jaro-Winkler 距离

匹配:B&B PRECISION

知道哪个指标会更加强调子字符串的精确性和匹配的序列,而不太关心字符串的长度吗?我认为是因为字符串的长度,指标总是会选择错误。

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

library(data.table)

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

我们想扩大网格。为此,我会在 data.table 中使用 CJ 函数。然后,我们将检查每一对并查看 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 包来实现。