原理:
1、使用jieba分詞,取出不重要的高頻詞('股份','有限','公司'等),簡化待查公司名,防止影響相似度。
2、使用FuzzyWuzzy計算待處理公司與標準公司名的相似度,取出最相似的(基於編輯距離Levenshtein Distance)
import jieba
import pandas as pd
tokenizer = jieba.dt
data=pd.read_excel(r"C:\Users\data\單詞相似度.xlsx",sheet_name='待處理公司名')
m=[]
for x in set(data['待處理字段']):
for y in tokenizer.cut(x):
m.append(y)
pd.Series(m).value_counts()
import pandas as pd
from fuzzywuzzy import fuzz
data1=pd.read_excel(r"C:\Users\data\單詞相似度.xlsx",sheet_name='待處理公司名')
data2=pd.read_excel(r"C:\Users\data\單詞相似度.xlsx",sheet_name='標準公司名')
#根據分詞後統計的高頻詞設置過濾列表stopwords,簡化字符串,處理同義詞
def sinple(x):
temp=x
for stopwords in ['有限','責任','公司','投資','證券','集團','(',')','管理','基金','私募','資產','控股','股份','資本','金控','國際','科技','建設','開發','發展','融資','租賃']:
temp=temp.replace(stopwords,'')
temp=temp.replace('農村商業銀行','農商行')
return temp
# print(sinple('廣州越秀融資租賃有限公司'))
#給定一個待處理公司名,在標準公司名列表中找最相近的字符串
def findWord(word,list):
maxRatio=0
target=''
for x in list:
#先計算簡化版的相似度,再加上未簡化的相似度作爲小數位
ratio=fuzz.ratio(sinple(word),sinple(x))+fuzz.ratio(word,x)/100
if ratio>maxRatio:
maxRatio=ratio
target=x
return word,target,maxRatio
# findWord('廣州國邦融資租賃有限公司 ',data2['company_nm'])
#輸入一個待處理列表,爲每一行找到最相近的字符串,並給出相似度,輸出dataframe
def findlist(targetList,fromList):
data=pd.DataFrame(columns=('target', 'result', 'ratio'))
index=0
for x in set(targetList):
row=findWord(x,fromList)
index+=1
data.loc[index]={'target':row[0],'result':row[1],'ratio':row[2]}
return data
data=findlist(data1['item_client'],data2['company_nm'])
data.to_csv(r'c:\Users\data\單詞相似度.csv')