在我的项目中,我有一个使用场景,需要将一个
我一直在探索模糊匹配字符串相似性的东西,这些东西使用基于编辑距离的算法,例如“levenshtein、jaro 和 jaro-winkler”相似性。
虽然它们工作得很好,但是如果一个字符串是另一个字符串的"缩写",我想要更高的相似度得分。是否有任何算法/实现可以用于此?
注意:
在这种情况下,如果可能的话,我希望分数尽可能高(>90%)。我也可以接受一些误报,因为它们不会在进一步的计算中造成太大问题。但是,如果我们匹配s1和s2,使得s1完全包含在s2中(或反之亦然),它们的相似度分数应该更高。
编辑: 我的用例的进一步示例
对我来说,空格是多余的。这意味着
此外,
一个简单的算法是从较短字符串的第一个字符开始,并查看它是否存在于较长字符串中。然后检查第二个字符,直到满足条件,即第一个字符串完全包含在第二个字符串中。对我来说,这是100%的匹配。
其他如
key
字符串与许多字符串进行相似性比较。如果这个值大于某个阈值,我认为这些字符串与我的key
相似,并且基于这个列表,我进行进一步的计算/处理。我一直在探索模糊匹配字符串相似性的东西,这些东西使用基于编辑距离的算法,例如“levenshtein、jaro 和 jaro-winkler”相似性。
虽然它们工作得很好,但是如果一个字符串是另一个字符串的"缩写",我想要更高的相似度得分。是否有任何算法/实现可以用于此?
注意:
language: python3
packages explored: fuzzywuzzy, jaro-winkler
例子:
using jaro_winkler similarity:
>>> jaro.jaro_winkler_metric("wtw", "willis tower watson")
0.7473684210526316
>>> jaro.jaro_winkler_metric("wtw", "willistowerwatson")
0.7529411764705883
using levenshtein similarity:
>>> fuzz.ratio("wtw", "willis tower watson")
27
>>> fuzz.ratio("wtw", "willistowerwatson")
30
>>> fuzz.partial_ratio("wtw", "willistowerwatson")
67
>>> fuzz.QRatio("wtw", "willistowerwatson")
30
在这种情况下,如果可能的话,我希望分数尽可能高(>90%)。我也可以接受一些误报,因为它们不会在进一步的计算中造成太大问题。但是,如果我们匹配s1和s2,使得s1完全包含在s2中(或反之亦然),它们的相似度分数应该更高。
编辑: 我的用例的进一步示例
对我来说,空格是多余的。这意味着
wtw
被认为是"willistowerwatson"和"willis tower watson"的缩写。此外,
stove
是"STack OVErflow"或"STandardOVErview"的有效缩写。一个简单的算法是从较短字符串的第一个字符开始,并查看它是否存在于较长字符串中。然后检查第二个字符,直到满足条件,即第一个字符串完全包含在第二个字符串中。对我来说,这是100%的匹配。
其他如
wtwx
到"willistowerwatson"的示例可能给出80%的得分(这可以基于某些编辑距离逻辑)。即使我能找到一个可以为缩写相似性提供True
或False
的软件包也会很有帮助。