python公司名称相似度分析_使用Python完成公司名称和地址的模糊匹配_百 ...
python公司名称相似度分析_使⽤Python完成公司名称和地址
的模糊匹配
正如题⽬中说的⼀样,这个程序的⽬的是实现公司名及的模糊匹配,也可以迁移到房产信息、电话号码之类的字段上。本来的应⽤场景是反团伙欺诈以及失联客户的修复,⼤概的意思就是说多个相同公司的同事都在我公司借贷的欺诈可能性要⾼于其他客户,以及的房产信息和电话号码可能不完全相同,但有⼀定的相似性,我们需要把这些客户出来,但是⼜不能⽤精确匹配。因为存在问题的房产信息和电话可能只是相似,⽽不是完全相同;对于公司名和地址来说,就更糟糕⼀些,即使是真实的信息,但同⼀个公司的叫法可能会多种多样,如果⿇烦⼀些,还要建⼀个同义词库。⽽我们做的⼯作还没有那么全⾯,只是提取出了公司名中的关键词。
⽽做评分卡模型也需要⽤到这个思想。因为评分卡的其中⼀个字段就是所在城市等级,这就需要从原始数据的地址中提取出城市信息,但地址的格式⼜不够标准,因为信息是客户⼈⼯填写的,举个例⼦,“⼭东省济南市”也有可能被写成“⼭东济南”,所以⼀个正则表达式就不⾜以解决这个字段提取的问题了。
总结⼀下,模糊匹配的两个应⽤场景:
1)构建反欺诈知识图谱
2)评分卡提取所需字段
地址处理的基本思路就是建⽴⼀个标准库,对地址逐个进⾏对⽐,再返回结果和置信度,所以词库的建⽴是地址处理的关键。
下⾯是解决问题的过程:
第⼀步,希望可以提取出公司名中的关键字。⾸先,要分析⼀下数据库中公司名的形式:“浙江杭州⽴多林贸易有限公司”,“汇川区万全兄弟购物中⼼”,“温州雪龙集团有限公司北京销售分公司”……
经过分析,可以看出,公司名⼤致分为3个部分:1、省市区名称;2、关键词+公司属性;3、分公司或分局等信息。
⾸先,需要使⽤python连接到数据库,取出公司名字段:
1、下载并安装psycopg2模块,下载链接如下:
安装完毕后,输⼊下⾯语句,连接数据库:
import psycopg2
#录⼊数据
t(database="testdb", user="postgres", password="postgres", host="10.180.157.168", port="1975")
cur=conn.cursor()
needinfo=['brhs_unitname','dict_unit_province','dict_unit_city','dict_unit_arer','brhs_unit_address']
aaa_t_jk_dhzh_brhs limit 1000;")
selects=cur.fetchall()
enterprise_datas=pd.DataFrame(selects,columns=needinfo)
2、根据上⾯的分析,下⼀步就要先将省市区提取出来。提取省市区的常规做法是建⽴⾏政区划库,类似于jieba分词中的txt词典。在解决这个问题时,我和同事两个⼈的思路不尽相同。在使⽤jieba对公司
名进⾏分词后,⼀种思路是建⽴⼀个最简词库,词库中的词都是⾏政区划的最简称,例如“宁夏”、“内蒙古”等,如果字典中的词在分词中,则取出该分词;另⼀种思路是,使⽤全称词库,例如“宁夏回族⾃治区”、“内蒙古⾃治区”等,如果分词后的词可以和其完全匹配,则取出该分词,否则,按照⼀定的规则,将字典中的词去掉“省”、“市”、“⾃治区”后,再和分词进⾏匹配。经过讨论,最后,⾏政区划库的形式如下图所⽰:
region_nosuffix
city_suffix
province_nosuffix
province_suffix
东城
东城区
北京直辖区
北京直辖区
北京
北京市
西城
西城区
北京直辖区
北京直辖区
北京
北京市
朝阳
朝阳区
北京直辖区
北京直辖区
北京
北京市
3、使⽤python建⽴词典,分别建⽴以下⼏个词典:
#建⽴字典
ad_excel('~\district_new_nosuffix.xlsx',sheetname='slice').fillna('') ##建⽴pcr字典
district_dict_pcr=defaultdict(lambda:defaultdict(lambda:defaultdict(int)))
district_dict_pcr[district.ix[num,'province_nosuffix']][district.ix[num,'city_nosuffix']]
[district.ix[num,'region_nosuffix']]=district.ix[num,'region_code']
district_dict_pcr=dict(district_dict_pcr)
##建⽴rcp字典
district_dict_rcp=defaultdict(list)
for num in range(len(district)):
district_dict_rcp[district.ix[num,'region_nosuffix']].extend([district.ix[num,'province_suffix'],district.ix[num,'city_suffix'],district.ix
district_dict_rcp=dict(district_dict_rcp)
##建⽴cp字典
district_dict_cp=defaultdict(list)
for num in range(len(district)):
if district_dict_cp[district.ix[num,'city_nosuffix']]==[]:
district_dict_cp[district.ix[num,'city_nosuffix']].extend([district.ix[num,'province_suffix'],district.ix[num,'city_suffix']])
district_dict_cp=dict(district_dict_cp)
##建⽴pp字典
district_dict_pp=defaultdict(str)
for num in range(len(district)):
district_dict_pp[district.ix[num,'province_nosuffix']]=district.ix[num,'province_suffix']
district_dict_pp=dict(district_dict_pp)
4、使⽤分词包对公司名进⾏分词,并标出词性
显然,需要提取出⾏政区,我们需要词性为ns的词,但分词后发现,Jieba⾃带的词典中,我们需要的省市区的词性并⾮全部为ns,⽽其他词,如“⼤望路”等我们不需要的词却可能为”ns”,于是,需要创建专⽤分词词典,并标注其词性为ns,替换默认的词典。
def word_flag(words):
''' 提取flag是u'ns'的word '''
result=defaultdict(list)
output=pseg.cut(words)
for word,flag in output:
result[flag].append(word)
return result[u'ns']
5、提取出三级⾏政区划
前⾯已经提到过,由于书写的不规范,导致同⼀个⾏政区划,写法可能不同。例如,“⼭西省太原市⼩店区”,既有可能被写成“⼭西太原
⼩店区”,也有可能被写成“太原市⼩店区”,还可能直接被写成“⼩店区”,所以,提取时,要分多种情况:
def geo_checker(word):
if (u'省' in word or u'⾃治区' in word):
place(u'省','').replace(u'⾃治区','')
try:
district_dict_pcr[word]
return district_dict_pp[word]
except KeyError:
return u'未知省份'
elif (u'地区' in word or u'⾃治州' in word or u'盟' in word):
place(u'地区','').replace(u'⾃治州','').replace(u'盟','')
try:
district_dict_cp[word]
return district_dict_cp[word]
except KeyError:
return u'未知城市'
贸易公司名字elif (u'⾃治县' in word or u'矿区' in word or u'⾃治旗' in word):
place(u'⾃治县','').replace(u'矿区','').replace(u'⾃治旗','')
try:
district_dict_rcp[word]
return district_dict_rcp[word]
except KeyError:
return u'未知区县'
elif u'县' in word :
place(u'县','')
try:
district_dict_rcp[word]
return district_dict_rcp[word]
except KeyError:
return u'未知区县'
elif u'市' in word:
if (u'天津' in word or u'北京' in word or u'重庆' in word or u'上海' in word): place(u'市','')
try:
except KeyError:
return u'未知省份'
if u'区' in word:
place(u'区','') try:
district_dict_rcp[word]
return district_dict_rcp[word] except KeyError:
return u'未知区县'
place(u'市','') try:
district_dict_cp[word]
return district_dict_cp[word] except KeyError:
try:
district_dict_rcp[word]
return district_dict_rcp[word] except KeyError:
return u'未知城市或区县'
elif u'区' in word:
place(u'区','') try:
district_dict_cp[word]
return district_dict_cp[word] except KeyError:
try:
district_dict_rcp[word]
return district_dict_rcp[word] except KeyError:
return u'未知城市或区县' else:
try:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。