摘要:近期由于數據庫中保存的一些類似小區名稱,街道名稱存在簡寫,錯別字等不規范的現象,需要將不規范的書寫進行糾錯改正。編輯距離距離是一種計算兩個字符串間的差異程度的字符串度量。
近期由于數據庫中保存的一些類似小區名稱,街道名稱存在簡寫,錯別字等不規范的現象,需要將不規范的書寫進行糾錯改正。在進行糾錯的過程中用到了【編輯距離】的計算方式來與對照表進行精確匹配。
1.Levenshtein距離是一種計算兩個字符串間的差異程度的字符串度量(string metric)。我們可以認為Levenshtein距離就是從一個字符串修改到另一個字符串時,其中編輯單個字符(比如修改、插入、刪除)所需要的最少次數。
2.jaro距離
3.jaro-winkler距離
注:其中的相似度 = 1 - 距離
由于jaro的distance中存在局部可視窗口的概念,即使有相同的子串出現,但是超過可視窗口的長度依舊不會計算,但是業務的數據大多數帶有寫比較長的前綴,就會影響最終匹配的準確度,所以將可視窗口的長度放大至比較字符串的最長串的長度,所以將包中的部分源碼修改,python代碼如下:
def count_matches(s1, s2, len1, len2): assert len1 and len1 <= len2 # search_range = max(len2//2-1, 0) # print ("search_range",search_range) search_range = len2 num_matches = 0 flags1 = [0] * len1 flags2 = [0] * len2 for i, char in enumerate(s1): lolim = max(i - search_range, 0) hilim = min(i + search_range, len2 - 1) for j in range(lolim, hilim + 1): if not flags2[j] and char == s2[j]: flags1[i] = flags2[j] = 1 # where_matched[i] = j num_matches += 1 break return num_matches, flags1, flags2 # , where_matched def count_half_transpositions(s1, s2, flags1, flags2): half_transposes = 0 k = 0 for i, flag in enumerate(flags1): if not flag: continue while not flags2[k]: k += 1 if s1[i] != s2[k]: half_transposes += 1 k += 1 return half_transposes def count_typos(s1, s2, flags1, flags2, typo_table): assert 0 in flags1 typo_score = 0 for i, flag1 in enumerate(flags1): if flag1: continue # Iterate through unmatched chars row = s1[i] if row not in typo_table: # If we don"t have a similarity mapping for the char, continue continue typo_row = typo_table[row] for j, flag2 in enumerate(flags2): if flag2: continue col = s2[j] if col not in typo_row: continue # print "Similarity!", row, col typo_score += typo_row[col] flags2[j] = 2 break return typo_score, flags2 def fn_jaro(len1, len2, num_matches, half_transposes, typo_score, typo_scale): if not len1: if not len2: return 1.0 return 0.0 if not num_matches: return 0.0 similar = (typo_score / typo_scale) + num_matches weight = (similar / len1 + similar / len2 + (num_matches - half_transposes // 2) / num_matches) return weight / 3 def string_metrics(s1, s2, typo_table=None, typo_scale=1, boost_threshold=None, pre_len=0, pre_scale=0, longer_prob=False): len1 = len(s1) len2 = len(s2) if len2 < len1: s1, s2 = s2, s1 len1, len2 = len2, len1 assert len1 <= len2 if not (len1 and len2): return len1, len2, 0, 0, 0, 0, False num_matches, flags1, flags2 = count_matches(s1, s2, len1, len2) # If no characters in common - return if not num_matches: return len1, len2, 0, 0, 0, 0, False half_transposes = count_half_transpositions(s1, s2, flags1, flags2) # adjust for similarities in non-matched characters typo_score = 0 if typo_table and len1 > num_matches: typo_score, flags2 = count_typos(s1, s2, flags1, flags2, typo_table) if not boost_threshold: return len1, len2, num_matches, half_transposes, typo_score, 0, 0 pre_matches = 0 adjust_long = False weight_typo = fn_jaro(len1, len2, num_matches, half_transposes, typo_score, typo_scale) # Continue to boost the weight if the strings are similar if weight_typo > boost_threshold: # Adjust for having up to first "pre_len" chars (not digits) in common limit = min(len1, pre_len) while pre_matches < limit: char1 = s1[pre_matches] if not (char1.isalpha() and char1 == s2[pre_matches]): break pre_matches += 1 if longer_prob: cond = len1 > pre_len cond = cond and num_matches > pre_matches + 1 cond = cond and 2 * num_matches >= len1 + pre_matches cond = cond and s1[0].isalpha() if cond: adjust_long = True return (len1, len2, num_matches, half_transposes, typo_score, pre_matches, adjust_long) def metric_jaro(string1, string2): "The standard, basic Jaro string metric." ans = string_metrics(string1, string2) len1, len2, num_matches, half_transposes = ans[:4] assert ans[4:] == (0, 0, False) return fn_jaro(len1, len2, num_matches, half_transposes, 0, 1) def metric_jaro_score(s1,s2): return metric_jaro(s1,s2) print (metric_jaro_score("賽鼎線世紀明珠45號","世紀明珠45號"))
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42818.html
摘要:基于深度學習的語義匹配語義匹配技術,在信息檢索搜索引擎中有著重要的地位,在結果召回精準排序等環節發揮著重要作用。在美團點評業務中主要起著兩方面作用。 寫在前面美團點評這兩年在深度學習方面進行了一些探索,其中在自然語言處理領域,我們將深度學習技術應用于文本分析、語義匹配、搜索引擎的排序模型等;在計算機視覺領域,我們將其應用于文字識別、目標檢測、圖像分類、圖像質量排序等。下面我們就以語義匹配、圖...
摘要:降采樣的目的是為了綜合所有不同清晰度的圖像進行關鍵點提取,這種關鍵點攜帶了不同清晰度的信息,對縮放具有不變性。是對的一種改進,主要特點是快速。的達到維,導致的比較耗時,使用哈爾小波轉換得到的方向,讓的降到維,減少了一半,提高了匹配速度。 尺度不變特征變換(Scale-invariant feature transform, 簡稱SIFT)是圖像局部特征提取的現代方法——基于區域/圖像塊...
摘要:目前許多程序設計語言都支持利用正則表達式進行字符串操作。本文中的正則表達式轉化為關系圖來展示的工具是此文主要參考和學習了老姚的正則表達式迷你書,內容清晰明了,在此非常感謝老姚的精神,致敬。參考文獻老姚著正則表達式迷你書 sharplook作為專業的日志采集分析系統,涉及的技術點,從后到前著實不少,內容也較為復雜。正則作為日志解析的手段,起著舉足輕重的作用,在此小生將晦澀難懂的內容,拆解...
閱讀 2444·2021-11-19 09:59
閱讀 1973·2019-08-30 15:55
閱讀 930·2019-08-29 13:30
閱讀 1330·2019-08-26 10:18
閱讀 3081·2019-08-23 18:36
閱讀 2382·2019-08-23 18:25
閱讀 1156·2019-08-23 18:07
閱讀 430·2019-08-23 17:15