Python には、アクセントを考慮した編集距離がありますか。たとえば、次のプロパティを保持する場所
d('ab', 'ac') > d('àb', 'ab') > 0
Python には、アクセントを考慮した編集距離がありますか。たとえば、次のプロパティを保持する場所
d('ab', 'ac') > d('àb', 'ab') > 0
レーベンシュタイン モジュールの場合:
In [1]: import unicodedata, string
In [2]: from Levenshtein import distance
In [3]: def remove_accents(data):
...: return ''.join(x for x in unicodedata.normalize('NFKD', data)
...: if x in string.ascii_letters).lower()
In [4]: def norm_dist(s1, s2):
...: norm1, norm2 = remove_accents(s1), remove_accents(s2)
...: d1, d2 = distance(s1, s2), distance(norm1, norm2)
...: return (d1+d2)/2.
In [5]: norm_dist(u'ab', u'ac')
Out[5]: 1.0
In [6]: norm_dist(u'àb', u'ab')
Out[6]: 0.5
Unicode では、アクセント付き文字を基本文字と結合アクセント文字に分解できます。たとえば、結合するグラブ アクセントが後に続くようにà
分解します。a
正規化フォーム NFKD を使用して両方の文字列を変換します。これは、アクセント付き文字を分解し、互換性のある文字を正規の形式に変換します。次に、挿入と削除よりも置換をランク付けする編集距離メトリックを使用します。