我需要处理一个损坏的数据库,其中名称一次用重音符存储,一次不用非ASCII字符。特别是,我有以下两个记录:
record_1 = u'Tim Münster'
record_2 = u'Tim Mnster'
是否有可能找到这样的重复记录?
答案 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
模块中的whitespace
和string
:
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