最近为了处理公司名称的分词问题,开始接触分词算法,其中隐马尔可夫模型是分词的核心(使用的分词是HanLP、词性表)。处理公司名称的真正困难在于“行业”与“公司名称”之间的有效分离。即隐马尔可夫模型处理的部分。至于地区和公司类别,则取决于字典匹配。
HANLP的机构名称训练语料库没有很好地覆盖机构名称的类型,需要从外部导入行业表达的字典。网上没有相关词典资源可供下载,选择使用公司内的词典标注词性并导入。
据初步统计,组织形式和运营类型约63种,逻辑判断可进一步优化的超过16种。包括:“部”“系”“社”“中心”向前截取两个字;“分”字向后截断一个字符。HanLP基本上涵盖了大部分业务类型,缺少的部分有:“Sub”、“Department”短语、合作和联合。
《数学之美》一书认为,如今人工智能的发展依赖于基于统计学的数据收集和分析。也就是说,目前语音识别、机器翻译等功能都依赖于收集大量数据,然后总结出规律模式进行应用(AI资源网站)。
重要概念记录:
最大熵模型;
在预测随机事件的分布概率时,应满足所有已知条件,对未知情况不作主观臆断。此时概率分布最均匀,预测的风险最小。
维特比算法:
步骤1:从点S开始,对于所有处于状态1的节点,假设存在a,计算S到每个节点的最短距离。第二步:计算下一个状态下S到所有B节点的最短距离。时间复杂度O(axb)。
之后重复步骤二,直到达到最后一个状态,得到S到最后一点的最短路径。每一步的复杂度等于相邻两个状态节点的个数
产品是成比例的。若网络宽度设为D,则任何一步的复杂度都不超过O(DxD),因此算法的复杂度为O(NxDxD)。
关于隐马尔可夫模型和维特比算法,推荐博文。
要了解维特比算法,首先要了解动态规划方法。动态规划类似于穷举法,不同的是存储了每一层所有可能的路径,这样在判断一个新层节点的路径时,就不必从起点遍历,直接从存储空间中获得所需的路径信息。也就是说,与穷举法相比,动态规划法通过花费额外的空间减少了计算量,降低了算法的时间复杂度。空间换时间。
另一个需要了解的算法是AC算法,与KMP算法类似,需要先掌握KMP再了解AC。但网络上大多数博客和书籍都没能解释清楚,阮逸峰的博客(博客链接)值得推荐。当然,如果英语阅读无障碍,直接阅读大神参考的英文博文(原文链接)更有趣。
要引入自定义词典,只需使词典遵循HANLP识别的格式即可。但是,在操作过程中出现了一个问题。不能通过配置文件引入字典,但可以将条目追加到原始字典。推测分词不能识别自定义词典的编码格式。实际尝试后发现,并不是编码问题,而是无法通过配置文件在HanLP源代码中添加字典,只能在通过Maven引入HanLP jar包时使用。
另一方面,对于一些添加到词典中的词,分词机在分词过程中无法识别。例如,词条“环境保护与净化事务”完全可以进行识别和切分,但如果去掉“事务”二字,变成“环境保护与净化事务”,就无法识别,然后再根据自己的核心词典进行匹配。造成这种情况的原因
有待探索。
由于分词依赖于统计结果,自定义词典的词频设置被称为关键部分。但是,不能简单地通过将词频设置为较高的数字来实现目标。像“一一一”这样的短语,当词典中“一容”和“一”的词频相同时,就会造成切分冲突。因此,分词不得不扫描所有加载的词典,然后进行综合权衡。但是,如果扫描后赋予两个词的权重相同,那么最终的切分结果就会不准确。这也是基于统计概率的分词方法必须面对的缺点,不到100的准确率。因此,在实际工作过程中,会出现切分结果与自定义字典不匹配的情况。
工作中涉及的分词和公司名称由行政区划+字号+行业+组织形式四部分组成。其中,“行政区划”和“行业”需要导入具体词典,组织形式可以直接手工录入。至于“字号”部分,由于企业命名规则对这部分没有严格限制,会出现大量随意创造的新词,因此无法通过扫描字典识别,只能在分词算法中对这部分进行改进。我的方法是获取分词结果中每个词的词性(在HanLP中每个分词都是一个术语,是一个存储在链表中的对象,每个对象都有一个存储词性的自然属性),进行逻辑判断,存储在不同的StringBuilder对象中,然后手动拼接分词结果。