1. 程式人生 > 程式設計 >使用Python完成公司名稱和地址的模糊匹配的實現

使用Python完成公司名稱和地址的模糊匹配的實現

github主頁

匯入:

>>> from fuzzywuzzy import fuzz
>>> from fuzzywuzzy import process

1)

>>> fuzz.ratio("this is a test","this is a test!")
out  97
>>> fuzz.partial_ratio("this is a test","this is a test!")
out  100

fuzz.ratio()對位置敏感,全匹配。fuzz.partial_ratio()對位置敏感,搜尋匹配。

2)

>>> fuzz._process_and_sort(s,force_ascii,full_process=True)

對字串s排序。force_ascii:True 或者False。為True表示轉換為ascii碼。如果full_process為True,則會將字串s轉換為小寫,去掉除字母和數字之外的字元(發現不能去掉-字元),剩下的字串以空格分開,然後排序。如果為False,則直接對字串s排序。

>>> fuzz._token_sort(s1,s2,partial=True,force_ascii=True,full_process=True)

給出字串 s1,s2的相似度。首先經過 fuzz._process_and_sort()函式處理。partial為True時,再經過fuzz.partial_ratio()函式。partial為False時,再經過fuzz.ratio()函式。

>>> fuzz.token_sort_ratio("fuzzy wuzzy was a bear","wuzzy fuzzy was a bear")
out  100

partial為False的_token_sort()

fuzz.partial_token_sort_ratio(s1,full_process=True)

就是partial為True時的Fuzz._token_sort()

3)

>>> fuzz.token_set_ratio("fuzzy was a bear","fuzzy fuzzy was a bear")
out  100
fuzz._token_set(s1,full_process=True)

當partial為False時,就是 fuzz.token_set_ratio()函式。

fuzz.partial_token_set_ratio(s1,full_process=True)

partial為True的fuzz._token_set()函式。

4)

fuzz.QRatio(s1,full_process=True)

full_process為True時,經過utils.full_process()函式。然後經過fuzz.ratio()函式。對順序敏感。

fuzz.UQRatio(s1,full_process=True)

就是 force_ascii為False的fuzz.QRatio()函式。

fuzz.WRatio(s1,full_process=True)

使用另一種不同演算法計算相似度。對順序敏感。

UWRatio(s1,full_process=True)

是force_ascii為False的fuzz.WRatio()函式。

總結:如果計算相似度的字串只有字母和數字,直接可以用ratio()和partial_ratio()。但如果還有其他字元,而且我們想要去掉這些沒用字元,就用下邊的。下邊的函式都對順序不敏感,但token_sort_ratio()系列是全字元匹配,不管順序。而token_set_ratio()只要第二個字串包含第一個字串就100,不管順序。

5)

>>> choices = ["Atlanta Falcons","New York Jets","New York Giants","Dallas Cowboys"]
>>> process.extract("new york jets",choices,limit=2)
  [('New York Jets',100),('New York Giants',78)]
>>> process.extractOne("cowboys",choices)
  ("Dallas Cowboys",90)
>>> process.extract(query,processor=default_processor,scorer=default_scorer,limit=5)

query是字串,choices是陣列,元素是字串。 processor是對輸入比較的字串的處理函式,預設是fuzzywuzzy.utils.full_process(),即將字串變為小寫, 去掉除字母和數字之外的字元(發現不能去掉-字元),剩下的字串以空格分開。scorer計算兩個字串相似度的函式,預設fuzz.WRatio()。 limit是輸出個數。

輸出為陣列,元素為元組,元祖第一個匹配到的字串,第二個為int型,為score。對輸出按照score排序。

>>> process.extractWithoutOrder(query,score_cutoff=0)

score_cutoff為一個閾值,當score小於該閾值時,不會輸出。返回一個生成器,輸出每個大於 score_cutoff的匹配,按順序輸出,不排序。

>>> process.extractBests(query,score_cutoff=0,limit=5)

process.extractBests()和process.extract()都呼叫了process.extractWithoutOrder(),只不過process.extractBests()能傳輸 score_cutoff。

>>> process.extractOne(query,score_cutoff=0)

也呼叫了process.extractWithoutOrder(),只不過輸出一個score最高的值。

process.dedupe(contains_dupes,threshold=70,scorer=fuzz.token_set_ratio)

contains_dupes是陣列,元素為字串。

取出相似度小於 threshold的字串,相似度大於 threshold的字串取最長一個。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。