两个字符串的最佳相似性距离度量
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
包来实现。
我有一堆公司名要匹配,比如我要匹配这个字符串: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
包来实现。