我需要處理一個損壞的數據庫,其中的名稱一次存儲了重音符號,一次存儲了非ASCII字符。特別是我有以下兩條記錄:從字符串中刪除帶重音符的字符
record_1 = u'Tim Münster'
record_2 = u'Tim Mnster'
有沒有可能找到這樣的重複記錄?
我需要處理一個損壞的數據庫,其中的名稱一次存儲了重音符號,一次存儲了非ASCII字符。特別是我有以下兩條記錄:從字符串中刪除帶重音符的字符
record_1 = u'Tim Münster'
record_2 = u'Tim Mnster'
有沒有可能找到這樣的重複記錄?
通過與re.sub(r'[^a-zA-Z ]', '', record_1)
進行比較,可以刪除錯誤的重複項。
您可以刪除非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"
確實沒有必要在你的'join' –
@TomFenech中使用'[]',我仍然不習慣在日常情況下使用生成器表達式。列表解析[雖然可能會稍快](https://stackoverflow.com/questions/11964130/list-comprehension-vs-generator-expressions-weird-timeit-results) – goncalopp
@TomFenech其實['str.join'是與列表一起使用時,速度更快,內存效率更高](http://stackoverflow.com/a/9061024/846892)。 –
查找重複的紀錄─
我會做這樣的事情:
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
你可以使用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
這似乎微不足道。你可以用'「」.join簡單地刪除非ascii字符([如果ord(x)<128])([x for s in s)'(hacky,但是有效),並使用set操作來檢查重複項。你卡在哪裏? – goncalopp
@goncalopp看起來像一個答案可疑!爲什麼不把它作爲一個發佈? –
@TomFenech我想這似乎太容易成爲他正在尋找的 – goncalopp