我想知道你的字符串是否几乎相似。例如,像Mohan Mehta' Mohan Mehta'应该匹配Mohan Mehte'反之亦然。另一个例子,像' Umesh Gupta'应该匹配Umash Gupte'。
基本上一个字符串是正确的,另一个字符串是错误拼写的。我的所有字符串都是人的名字。
有关如何实现这一目标的任何建议。
解决方案不必100%有效。
答案 0 :(得分:17)
如果您需要stdlib中的内容,可以使用difflib.sequencematcher:
from difflib import SequenceMatcher
s_1 = 'Mohan Mehta'
s_2 = 'Mohan Mehte'
print(SequenceMatcher(a=s_1,b=s_2).ratio())
0.909090909091
fuzzywuzzy是您可以安装的众多库之一,它使用带有python-Levenshtein的difflib模块。您还应该查看Approximate_string_matching
上的wikipage答案 1 :(得分:8)
另一种方法是使用" phonetic algorithm":
语音算法是一种通过发音对单词进行索引的算法。
例如使用soundex算法:
>>> import soundex
>>> s = soundex.getInstance()
>>> s.soundex("Umesh Gupta")
'U5213'
>>> s.soundex("Umash Gupte")
'U5213'
>>> s.soundex("Umesh Gupta") == s.soundex("Umash Gupte")
True
答案 2 :(得分:3)
你想要的是string distance。有很多种,但我建议从Levenshtein distance开始。
答案 3 :(得分:3)
您可能需要查看NLTK(自然语言工具包),特别是nltk.metrics包,它实现了各种字符串距离算法,包括已经提到的Levenshtein距离。
答案 4 :(得分:1)
您可以分割字符串并检查它是否包含至少一个正确的名字/姓氏。
答案 5 :(得分:-2)
// calculate the similarity between 2 strings
public static double similarity(String s1, String s2) {
String longer = s1, shorter = s2;
if (s1.length() < s2.length()) { // longer should always have greater length
longer = s2; shorter = s1;
}
int longerLength = longer.length();
if (longerLength == 0) { return 1.0; /* both strings are zero length */ }
/* // If you have StringUtils, you can use it to calculate the edit distance:
return (longerLength - StringUtils.getLevenshteinDistance(longer, shorter)) /
(double) longerLength; */
return (longerLength - editDistance(longer, shorter)) / (double) longerLength;
}
// Example implementation of the Levenshtein Edit Distance
// See http://rosettacode.org/wiki/Levenshtein_distance#Java
public static int editDistance(String s1, String s2) {
s1 = s1.toLowerCase();
s2 = s2.toLowerCase();
int[] costs = new int[s2.length() + 1];
for (int i = 0; i <= s1.length(); i++) {
int lastValue = i;
for (int j = 0; j <= s2.length(); j++) {
if (i == 0)
costs[j] = j;
else {
if (j > 0) {
int newValue = costs[j - 1];
if (s1.charAt(i - 1) != s2.charAt(j - 1))
newValue = Math.min(Math.min(newValue, lastValue),
costs[j]) + 1;
costs[j - 1] = lastValue;
lastValue = newValue;
}
}
}
if (i > 0)
costs[s2.length()] = lastValue;
}
return costs[s2.length()];
}