本文来自腾讯疾控中心原地址。如何有效匹配公司名称/
转自dataxon微信官方账号
在项目中,两个独立的系统需要匹配公司名称来实现数据通信。一个体系有40万家公司,另一个体系有3600家公司。如果两个系统以SQL LIKE的形式直接链接,发现只能匹配到1100多个公司名称。如果剩下的2500家左右的公司需要通过纯人工的方式进行人工匹配,不仅工作量大而且效率低。
通过对不良案例的分析,发现公司名称不匹配主要存在两个问题:
公司的简称往往是人们根据习惯约定的,没有标准的形式。比如深圳市腾讯计算机系统有限公司的简称就是腾讯。通过字符串包含很容易将缩写与公司全称的一部分匹配起来。而很多公司的缩写是其他形式的,比如中国银行中国银行中国石化中国石油化工股份有限公司中国石化,都是由公司全称的不同部分拼接而成,直接通过字符串的模糊匹配很难达到很好的效果。另外,有些公司可能会有各种简称,比如中国东方航空股份有限公司,有的简称东航,有的简称东航。
总之,各种缩写使得匹配时很难正确识别字符串。传统的解决方案通常是维护公司全称和简称之间的映射关系,作为共同的知识库。但是,如果我们仅仅依靠公共知识库来解决这个问题,由于公司数量众多,并且随着时间的推移而发生变化,维护和更新公共知识库将成为一个大问题。
比如深圳市阅文教育咨询有限公司简称阅文,但是当你以LIKE的形式把阅文拿到系统里进行匹配的时候,你会发现一共有35家公司的全称是阅文文子字符串,其中有一些如下:
北京大岳文化传播有限公司。
成都岳跃文化传播有限公司
杭州艺悦文化传媒有限公司
北京丁岳文献信息技术有限公司
深圳华月文化传媒有限公司
上海沁悦文化科技发展有限公司
这些匹配的公司全称往往包含语义碎片化的匹配子串,而直接包含匹配无法进行语义分割,导致匹配错误率随着缩写词的减少而增加。
基于上述问题,处理公司名称匹配的工作主要分为两部分:
数据清洗,主要是通过分词对公司全称进行拆解,并结合可能的简称形式;
模糊匹配,主要基于最短编辑距离算法,计算待猜短名和待匹配短名的匹配得分,然后通过筛选匹配得分最高的,找到最佳匹配结果。
以下是对各部分工作的详细介绍:
公司名称一般由四部分组成:地区、关键字(x)、行业和公司后缀(Org_Suffix)。例如,深圳王湾博通科技有限公司就位于深圳。王湾博通是关键词,技术是行业词,有限公司是公司的后缀,所以我们可以用RXIO来表达这家公司的名称结构。其他结构的公司名称也可以用类似的方式表示,例如:
在实现方面,使用了分词工具jieba[1]提供的词性标注功能。因为词性标注需要提前分词然后识别每个词的词性,所以这一块的准确性和使用的分词工具、分词模式有一定的关系。例如,上海李静信息技术有限公司在分词后,将词性标注为【上海/ns李静/x资讯/n科技/n有限/n】,那么其结构就很容易表达为RXIIO,效果如下图所示:
通过对每个标记进行分词和词性标注,可以将不同的标记分为四类:RXIO。其中公司后缀O类型数量有限,可以通过建立公司后缀词库来识别。R类可以用带词性ns(代表地名)的token直接分类。关键词X型和行业I型的识别比较模糊,所以我没有严格区分。我主要是结合词性和自定义行业词库来完成关键词和行业的分类。用上面的方法清洗完所有公司的全称后,就可以得到一个正式的数据,如图:
有了公司全称的正式表示,接下来就是猜测它可能的缩写结构了。比如中国移动有限公司的缩写是中国移动,可以表示为RXO=R[1-1]X,其中R[1-1]代表取第一个区域分段的第一个字;比如中国联通有限公司的缩写是中国联通,可以表示为RXO=RX,所以我们得到RXO,这是公司全称的形式。有两种可能的缩写形式:R[1]X和RX。以此类推,通过统计一些公司全称对应的简称形式,可以得到一个规则,来表达可能对应不同形式结构的公司全称的简称形式:
与此同时,新的规则可以不断地加入其中。将这些规则应用到步骤中得到的数据中,正式表示所有公司的全称,就可以得到一个可能的缩写形式,对应每个公司的全称,如图所示:
有了公司简称的所有可能组合,就可以用levenshtein算法计算它们的匹配度。如果匹配分数达到一定阈值,则可以认为是匹配的。
常用的levenshtein算法有最短编辑距离算法和余弦相似度算法,这里使用最短编辑距离算法进行匹配。最短编辑算法介绍如下:
最小编辑距离算法给出两个字符串x和y,并使用以下三个操作将字符串x更改为字符串y:
插入操作,成本为1;
成本为1的删除操作;
替换,代价为2,这里是Levenshtein编辑距离,其他算法中的替换代价与其他两类运算(1)相同;
比如“意图”变成“执行”,有三个替换,一个删除,一个插入,那么这两个词的最短编辑距离就是8(如下图)。
更多参考:
具体编程实现请参考:
计算出最短的编辑距离后,就可以根据它们的字符串长度计算出相似度。公式如下:
相关代码如下:
通过相似度计算公式,可以计算出一个公司名称所有可能的缩写形式与待匹配公司名称的相似度,然后取得分最高的一个作为两家公司的最终匹配得分。效果如下:
在查看匹配分数的时候,我们会发现有些公司的匹配结果明显错误,但是他们的匹配分数却很高。比如深圳市林云科技有限公司的简称,猜测林云科技与云药科技相似度最高,匹配度为92分。而云耀网络(上海)有限公司和云耀科技的匹配分只有83分。
显然,用最短的编辑距离来计算公司名称的相似度,根本就忽略了公司名称不同部分的不同权重,导致技术与云远程关键词的匹配一样重要,甚至更重要。
鉴于仅使用最短编辑算法进行匹配无法体现语义相似度,在匹配中引入了公司名称各部分的权重计算。在相同的编辑距离下,如果权重较高的词匹配,匹配度会更高。如云耀网络科技(上海)有限公司、深圳林云科技有限公司在分词中标注了关键词、行业词、地方名词,如图:
匹配时,分别计算各部分的匹配分数,然后根据8:133601的权重分布计算最终的加权匹配分数。这就纠正了直接匹配的不足,使得关键词匹配分数越高,公司最终匹配分数越高:
与SQL LIKE的原始形式仅匹配1100家公司相比,该方案增加了456家匹配分数为100的公司,789家匹配分数超过90的公司和1810家匹配分数超过80的公司。
该方案主要基于字符串模糊匹配的语义分裂和加权匹配,其效果取决于早期分词和形式分类的质量。如果公司名称不能按照语义正确拆分归类到不同的类别,后期的加权匹配效果会大打折扣。
随着人工智能的发展,基于深度学习的语义匹配已经成为NLP中的基础技术,我们也可以参考这项技术。
本文需要解决的是公司简称与全称的匹配问题。传统的字符串模糊匹配通常在匹配字符数相差很大的情况下(简称一般2 ~ 6个字符长,全名一般10个字符以上)得分较低。针对这一问题,本文总结了一些提高匹配率的途径和方法,主要包括以下四个步骤: