Python中的Levenshtein距离-民族字符的错误结果

Python中的Levenshtein距离-民族字符的错误结果,python,diacritics,levenshtein-distance,Python,Diacritics,Levenshtein Distance,我发现了类似的主题:,但它是PHP,我用Python编写。尽管如此,问题仍然是一样的。例如: levenshteinkot,kod=1 levenshteinsię,sie=2,这是错误的。 有没有办法解决这个问题 首先,您必须确保字符串都是unicode格式。对于Python3,您可以自动执行该操作,但是在Python2中,您必须首先将字符串解码为unicode类型。例如sys.argv[1]。如果您知道控制台中的编码是utf-8,请解码“utf-8”。你可以试着猜测这个编码 之后,您可能需要

我发现了类似的主题:,但它是PHP,我用Python编写。尽管如此,问题仍然是一样的。例如: levenshteinkot,kod=1 levenshteinsię,sie=2,这是错误的。
有没有办法解决这个问题

首先,您必须确保字符串都是unicode格式。对于Python3,您可以自动执行该操作,但是在Python2中,您必须首先将字符串解码为unicode类型。例如sys.argv[1]。如果您知道控制台中的编码是utf-8,请解码“utf-8”。你可以试着猜测这个编码

之后,您可能需要规范化unicode。例如,unicode字符串u'\u00c7'和u'\u0043\u0327'具有相同的表示形式,但它们会比较为不相等,并且具有非零的levenshtein距离。要规范化字符串,可以使用unicodata.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)

毕竟,如果角色在外面,你可能仍然会遇到问题。关于这个问题,请看这个。

您使用的是Python 2.7吗?您是否将字符串输入或强制转换为unicode,例如usię或unicoderaw_输入?Python 2.7,编码utf-8和sys.argv。嗯,我刚刚发现任何带有民族特征的东西都比普通的lensię=4长。为什么我也试过:word1=unicodesys.argv[1]和/或word1=sys.argv[1]word1=unicodeOrd1,它停止了计算,因为word抛出了一个异常,我需要两个参数,只给了一个。谢谢,它工作了!我不能因为名声太小而放弃投票。不管怎样,现在我正在尝试稍微改变Leveshtein距离算法,使带有国家字符的单词和没有国家字符的单词被视为平等的。例如:levenshteinsię、sie=0、levenshteinjąkać、jakać=0等等。我创建了一个国家替换列表:[“ę”、“e”]、[“ą”、“a”]…],但出现了一个错误:Unicode equal comparison未能将这两个参数转换为Unicode-将它们解释为不相等。怎么解决这个问题?@user4598392我想你还是可以接受这个答案的。要在Python2中使用unicode文本,请将u置于字符串之前。因此,替换将是[[u'ę',u'e'],[u'ą',u'a']…];请结束话题,因为问题已经解决了。