实体知识+字典树辅助jieba的分词(并对三国演义进行简单分析)

版权声明:本文为博主原创文章,欢迎转载但请声明来源。 https://blog.csdn.net/blmoistawinde/article/details/82377843

      在做中文NLP的时候,分词可谓是基础中的基础。然而这个基础部分的内容直到今天还是让人不省心,在实际应用中【尤其是在人名等实体的识别上】总是显得漏洞百出。下面以python上比较流行的一个中文分词库jieba为例,看看它的一次表现:

import jieba
print(" ".join(jieba.cut("""玄德谢别二客,便命良匠打造双股剑。
云长造青龙偃月刀,又名“冷艳锯”,重八十二斤。
张飞造丈八点钢矛。各置全身铠甲。
共聚乡勇五百余人,来见邹靖。邹靖引见太守刘焉。""")))

玄德谢 别二客 , 便命 良匠 打造 双股 剑 。
云长造 青龙 偃月 刀 , 又名 “ 冷艳 锯 ” , 重 八十二斤 。
张飞 造丈 八点 钢矛 。 各置 全身 铠甲 。
共聚 乡勇 五百余 人 , 来见 邹靖 。 邹靖引 见 太守 刘焉 。

      这里它犯了多次错误(“玄德谢”,”云长造”,”邹靖引”),并且对同一人名也会有前后不一致的情况(“邹靖”,”邹靖引”)。假设我要对文章中的人物出场频次进行统计,那么基于这种分词的方法看来是完全靠不住的。

      这时我就有一种想法:如果能够基于现有的知识(三国演义中已知的人名和字号),对分词结果再进行一次干预,矫正其中的结果,是不是就可以解决这个问题了呢?

      这个想法还有一个另外的好处:在古文中,同一个人物会以姓名、字号甚至是代称等多种不同形式出现,而我们希望在统计时能够把它们归入同一个人(实体)名下。实体知识就能够帮助我们完成这种归化。‘

      实践证明这个想法是可行的。其主要思路是,利用字典树(Trie)预先扫描文本,并把识别到的实体替换为一个标准词(这里我用了”人占位符”),再使用jieba的add_word使得标准词一定会被分词器识别出来,最后再在分词结果中把标准词按照位置换回原文或者标准实体名。

      首先简单提一下这里用python构建字典树的思路。这里采用嵌套字典的形式【与这篇文章的结构相似:飘逸的python - 实现trie树】。但是与上面不同的一点是,这里为了匹配到实体,我们要在字典树的叶结点[这里我起名为leaf]上挂上实体【或者多个实体,如果他们共享一个名字的话】,大致是这样:

>>> trie["刘"]["备"]
{'leaf':{'刘备'}}
>>> trie["玄"]["德"]
{'leaf':{'刘备'}}
>>> trie["子"]["上"]      #数据库中有两个人字“子上”
{'leaf': {'司马昭', '纪陟'}}

      下面还是用我喜欢的jupyter notebook展开具体思路:

猜你喜欢

转载自blog.csdn.net/blmoistawinde/article/details/82377843