从字符串中删除带重音的字符

时间:2014-04-17 10:37:21

标签: python unicode duplicates

我需要处理一个损坏的数据库,其中名称一次用重音符存储,一次不用非ASCII字符。特别是,我有以下两个记录:

record_1 = u'Tim Münster'  
record_2 = u'Tim Mnster'

是否有可能找到这样的重复记录?

4 个答案:

答案 0 :(得分:0)

您可以通过比较re.sub(r'[^a-zA-Z ]', '', record_1)来删除错误的重复项。

答案 1 :(得分:0)

您可以使用

删除非ascii字符
def remove_nonascii(s):
    return "".join(x for x in s if ord(x)<128)

要检查重复项,只需使用set s:

records= set([u'Tim Mnster'])
duplicates_to_check= [u'Tim Münster']
for possible_duplicate in duplicates_to_check:
    if remove_nonascii( possible_duplicate ) in records:
        print possible_duplicate, "is a duplicate"

答案 2 :(得分:0)

查找重复记录 -

我会做这样的事情:

1)从字符串中删除带重音的字符。

import unicodedata

def remove_accents(input_str):
    nkfd_form = unicodedata.normalize('NFKD', input_str)
    only_ascii = nkfd_form.encode('ASCII', 'ignore')
    return only_ascii

2)检查带有删除重音的字符串(record_1)是否等于record_2(使用Levenshtein距离算法),模糊匹配。

from nltk import metrics, stem, tokenize

def normalize(s):
    words = tokenize.wordpunct_tokenize(s.lower().strip())
    return ' '.join([stemmer.stem(w) for w in words])

def fuzzy_match(s1, s2, max_dist=2):
    return metrics.edit_distance(normalize(s1), normalize(s2)) <= max_dist

答案 3 :(得分:0)

您可以使用ascii_letters模块中的whitespacestring

import string
def ascii_or_space(s):
    return "".join(c for c in s if c in string.ascii_letters + string.whitespace)

ascii_or_space(record_1) == record_2
True