我不相信标准库提供了任何计算两个字符串之间距离的东西,我似乎无法在Boost StringAlgo中找到任何东西。那么,我还可以使用其他库吗?
我对算法不太挑剔。 Jaro-Winkler也很好,Levenshtein也是如此,我乐于接受建议,我不想编写某人已编码的内容。
答案 0 :(得分:8)
您没有使用实际距离指标定义您的问题,因此我认为它必须满足“Metric (mathematics)”中的条件:
集合X上的度量是一个函数(称为距离函数或简称距离) d:X×X→R (其中R是实数的集合)。对于X中的所有x,y,z,此函数需要满足以下条件:
- d(x,y)≥0(非负性或分离公理)
- d(x,y)= 0当且仅当x = y(不可分辨的同一性或重合公理)
- d(x,y)= d(y,x)(对称)
- d(x,z)≤d(x,y)+ d(y,z)(次加性/三角不等式)。
假设我们将d
定义为:
{ 0 if x = y
d(x, y) = {
{ 1 otherwise
因此满足前三个条件:
d(x, y) ≥ 0
d(x, y) = 0 iff x = y
d(x, y) = d(y, x) = 0 for x = y
和d(x, y) = d(y, x) = 1 for x ≠ y
对于最后一个条件,有两种情况:
d(x, z) = 0
。右侧唯一可以想到的值是0
,1
和2
,其中任何一个都符合条件。d(x, z) = 1
。假设右侧不大于或等于1。这意味着它必须为零。然后,右侧的两个术语都必须是0
,这意味着x = y
和y = z
。第二个条件意味着x = z
,这意味着d(x, z) = 0
。这是一个矛盾,因此右侧必须大于或等于一。然后我们可以将指标定义为:
int d(std::string x, std::string y) {
if (x == y) {
return 0;
} else {
return 1;
}
}
答案 1 :(得分:6)
您可以尝试SimString。
SimString是一个用于快速近似字符串检索的简单库。 近似字符串检索在数据库中查找字符串 与查询字符串的相似性不小于阈值。查找 不仅相同但相似的字符串,近似字符串检索 有各种应用,包括拼写纠正,灵活 字典匹配,重复检测和记录链接。
SimString支持余弦,Jaccard,骰子和重叠系数 相似性措施。 SimString使用字母n-gram作为特征 计算字符串相似度。
或SimMetric库。
SimMetrics是一个相似度量标准库,例如从编辑距离 (Levenshtein,Gotoh,Jaro等)其他指标,(例如Soundex, 查普曼)。英国谢菲尔德大学提供的工作由(AKT)资助 IRC赞助的IRC,授权号为GR / N15764 / 01。
或libdistance库,其中包含Levenshtein,Dameru,Needleman-Wunsch,Hamming,Bloom Filter,Jaccard和Minkowski距离的实现。
Phonetic algorithms也可能是有意义的。
答案 2 :(得分:0)
This related question contains a code snippet展示了Levenshtein的距离。它也是implemented for MySQL in this C code。