2014-04-17 126 views
1

我需要處理一個損壞的數據庫,其中的名稱一次存儲了重音符號,一次存儲了非ASCII字符。特別是我有以下兩條記錄:從字符串中刪除帶重音符的字符

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

有沒有可能找到這樣的重複記錄?

+0

這似乎微不足道。你可以用'「」.join簡單地刪除非ascii字符([如果ord(x)<128])([x for s in s)'(hacky,但是有效),並使用set操作來檢查重複項。你卡在哪裏? – goncalopp

+0

@goncalopp看起來像一個答案可疑!爲什麼不把它作爲一個發佈? –

+0

@TomFenech我想這似乎太容易成爲他正在尋找的 – goncalopp

回答

0

通過與re.sub(r'[^a-zA-Z ]', '', record_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" 
+0

確實沒有必要在你的'join' –

+0

@TomFenech中使用'[]',我仍然不習慣在日常情況下使用生成器表達式。列表解析[雖然可能會稍快](https://stackoverflow.com/questions/11964130/list-comprehension-vs-generator-expressions-weird-timeit-results) – goncalopp

+0

@TomFenech其實['str.join'是與列表一起使用時,速度更快,內存效率更高](http://stackoverflow.com/a/9061024/846892)。 –

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 
0

你可以使用ascii_letterswhitespacestring模塊:

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