接下来一段时间依然没有放弃从文本本身出发,阅读了一些字符串实体识别方面的文章,想到了一个新办法。
针对公司名称,如”南京华为技术有限公司“,每个位置出现的词是比较有规律,于是我将其分为4个部分,第一部分是地理位置,如”北京“,”上海“,第二部分是核心关键字,如”华为“,”百度“,第三部分我称作特征词,如”在线“、”科技“,”教育“等表达一个公司从事的行业或者某种特征,第四部分是后缀,如”公司“、”股份有限公司“。
那么问题又来了,如何把一个公司名称的每一部分识别出来?一开始我想到的还是TF/IDF,折腾了一阵发现其实不可行,核心词和特征词的边界太模糊,而且有些公司名称实在是奇葩,导致第一批结果效果很差。
接着折腾,抛弃TF/IDF,尝试用更笨一些的办法:直接分词。使用mmseg作为分词工具,用它自带的词库,分完以后发现不行,比如”北京文博通教育文化发展有限公司“直接被切成了”北京 文 博 通 教育 文化 发展 有限 公司“,完全不知道改以什么样的粒度来切词。
接着想,觉得mmseg自带的词库用在在公司名称上不太合适,毕竟名称不同于自然语言,于是尝试自己建立词库,我的想法很简单,针对第一、第三、第四部分分别建立3个词库,然后用这些词库分别切,能切出来的就划分到相应地位置上去,然后剩下的就是核心关键词。于是开始手工建立词库,工程比较繁琐,就是在现有几十万的公司名称里面找,手工把想要的词提取出来入库,好在这个过程并不需要把全部公司都过一遍,花了一下午时间,过完了n千个以后,接下来就发现剩下的名称里面所含的词基本已经在库里了,这时候第一部分的词库就是全中国地省份、城市、地区,约一千多,第三部分约500多个词、第四部分只有200多,比想象中要少。
切完词以后,肉眼过一遍发现还是挺靠谱的,于是把切剩下的当成核心关键词,也入库。
然后开始建向量,我的想法是将每个公司名分成4个维度建立特征向量,每一个维度都是标称值,每两个表示公司名称的向量算一下余弦相似度,把相似度高的当成是一个公司。
结果出来以后,发现比之前的直接提取核心关键词比对强多了,但是准确率还是很低。
其实在算余弦相似度的时候我已经开始怀疑公司别名聚合这个事不是从文本本身出发就能搞定了的,对中文字符串做实体识别几乎是一个无解的问题,这样做出来的准确度肯定高不了。接下来必须从别的角度出发,引入更多的特征值。