我发现了类似的主题:Levenshtein distance on diacritic characters,但它是PHP,我用Python编写。问题仍然存在。例如: levenshtein(kot,kod)= 1 levenshtein(się,sie)= 2,这是错误的。 关于如何解决这个问题的任何想法?
答案 0 :(得分:0)
首先,您必须确保字符串都是unicode。对于Python 3,您可以自动获得,但在Python 2中,您必须首先将字符串解码为unicode
类型。例如sys.argv[1].decode('utf-8')
,如果您知道控制台中的编码是UTF-8。您可以尝试使用sys.stdin.encoding
猜测此编码。
之后你可能需要规范化unicode。例如,unicode字符串u'\u00c7'
和u'\u0043\u0327'
具有相同的表示形式,但它们将比较为不相等,并且具有非零的levenshtein距离。要规范化字符串,您可以使用unicodedata.normalize
函数。
Python 2中的脚本可能如下所示:
import unicodedata
import sys
# import or define your levenshtein function here
def decode_and_normalize(s):
return unicodedata.normalize('NFKC', s.decode('utf-8'))
s1 = decode_and_normalize(sys.argv[1])
s2 = decode_and_normalize(sys.argv[2])
print levenshtein(s1, s2)
毕竟,如果角色在Basic Multilingual Plane之外,你可能仍会遇到问题。在这个问题上,请查看此stackoverlow question。