原理:
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')