公司名称分词工作记录

最近要处理公司名称分词问题,开始接触分词算法,其中隐马尔可夫模型是分词的核心(使用的分词器是 HanLP,词性表)。处理公司名称真正的难点在于名称中 “所属行业” 与 “公司字号” 二者间的有效分隔。也就是隐马尔可夫模型处理的部分。至于所属地区以及公司类别,则是依赖字典匹配解决。

HanLP 的机构名称训练语料库对于机构名称种类的覆盖程度不高,需要从外部导入行业表述的字典。网上没有相关的字典资源可供下载,选择使用公司内部的字典加以词性标注并导入。

初步统计,组织形式经营类型约63种,其中能通过逻辑判断进一步优化的16个以上。包括:“部”、“处”、“社” 以及“中心” 向前截取两字符;“分”字向后截取一个字符。HanLP 基本覆盖大部分经营类型,缺少的部分为:“分”、“部”字词组,合作社,联合社。

从《数学之美》一书中了解到,现今人工智能的发展依赖于统计学为基础的数据收集分析。也就是现阶段的语音识别、机器翻译等功能皆依靠对大量数据收集然后总结出规律模式再进行应用(AI资源网站)。

重要概念记录:

最大熵模型

对随机事件的分布概率进行预测时,应当满足全部已知条件,对未知情况不做任何主观假设。此时概率分布最均匀,预测的风险最小。

维特比算法:

第一步:从S点出发,对于状态1的所有节点,假定有 a 个,计算出S到各个节点的最短距离。
第二步:计算出S到下一个状态所有 b 个节点的最短距离。时间复杂度 O(axb)。

此后不断重复步骤二,直到走到最后一个状态,此时得到 S 到末尾点的最短路径。每一步的复杂度都和相邻两个状态节点数目的乘积成正比。
网络宽度设为 D,则任意一步的复杂度不超过 O(DxD) ,由此该算法的复杂度为 O(NxDxD) 。

关于隐马尔可夫模型和维特比算法,推荐博文。

理解维特比算法,首先要理解动态规划法。动态规划与穷举法的方式类似,不同之处在于,将每一层的所有可能路径都进行存储,这样对新的一层节点进行路径判断时,就不需要从出发点进行遍历,直接从存储空间取得需要的路径信息即可。也就是,相比于穷举法,动态规划法通过花费额外空间的方式,减少了计算量,降低了算法的时间复杂度。空间换时间。

另一个需要理解的算法是 AC算法,这个算法和 KMP算法 相似,而且在理解 AC 之前,对 KMP 的掌握必不可少。然而网上的大部分博客以及书籍资料都没能将其讲解得很清晰,阮一峰大神的博客(博客链接)讲解值得推荐。当然,如果英文阅读无障碍的话,直接看大神参考的英文博文更有意思(原文链接)。

对于引入自定义字典,只需要让字典按照 HanLP 识别的格式编写即可。但是在操作过程中遇到一个问题,字典无法通过配置文件引入,而将词条追加进原有字典中是可以的。推测是分词器无法识别自定义字典的编码格式。实际尝试之后,发现并非编码问题,而是无法在 HanLP 源码当中通过配置文件的方式增加词典,只有在通过 maven 方式引入 HanLP 的 jar 包时才能够使用。

另一方面,对于部分追加进字典中的词语,在执行分词过程中,分词器不能将其识别出来。比如,对于词条“环保净化事务”能够完整识别切分,但如果去除“务”字,变为“环保净化事”时,会无法识别,进而按照自带的核心词典进行匹配。出现该情况的原因有待探究。

由于分词器依赖于统计结果进行切分,所以自定义字典的词频设置就称为关键部分。然而并不是简单地将词频设置为较高数字就能达到目的。对于类似“易容易”这样的短语组合,当“易容”与“容易”在字典中的词频相同时,会造成切分冲突。因此分词器还要在加载的所有字典中进行扫描,再进行综合权衡。而如果扫描后对于两个词给出的权重相同,那么最终的切分结果就会不准确。这也是基于统计概率的分词方式所必须面对的缺点,做不到100%准确无误。所以在实际工作过程中,会出现分词结果与自定义字典不匹配的情况。

而工作涉及的分词,公司名称由四部分组成:行政区划+字号+行业+组织形式。其中“行政区划”和“行业”两部分需要导入特定的字典,组织形式直接手动输入即可。而对于“字号”部分,由于企业命名规则中对该部分没有严格的限制,所以会出现大量随意创造的新词语,因此无法依赖扫描字典的方式进行识别,只能够在分词算法中对该部分进行改进处理。我采用的方式是,通过获取分词结果中每个词的词性(HanLP中每个切分出的词为一个term,是一个链表存储的对象,每个对象都有一个nature属性用于存储词性),进行逻辑判断,分别存入不同的 StringBuilder 对象中
,再手动拼接分词结果。

你可能感兴趣的:(工作记录)