当前位置:   article > 正文

知识图谱 — pyhanlp实现命名体识别(附命名体识别代码)_如何用hpnlp实现自定义命名实体识别

如何用hpnlp实现自定义命名实体识别

上篇文章将到了使用jieba、pyhanlp、smoothnlp工具进行文本分词,这篇文章在上篇分词的基础上接着讲解命名体识别,感兴趣的朋友请点我进入到上篇文章查看分词工具的使用。本文在最后有本人一些不成熟的命名体识别方法。

一、什么是实体?

        怎么样,被这么一问是不是不知道如何回答。实体的特性必有确定性,这样就可以把实体理解成一个确定的实例。就比如 “王者荣耀“ 它其实就是一个确确实实存在的实例,而单单拿 ”王者“ 或者 ”荣耀“ 来说,我们不能一下子确定是什么。 这就是实体的概念。

二、什么是命名体识别?

        命名体识别简称NER,命名实体一般指的是文本中具有特定意义或者指代性强的实体,通常包括 人名地名机构名日期时间专有名词等,简单来说就是找句子中的人名、地名、机构名称、日期时间和专有名词实体,是组成知识图谱三元组重要且必不可少的步骤。

三、命名体识别类别划分

        通常分为三大类七小类:

                三大类为:实体类、时间类、数字类

                七小类为:人名、地名、组织机构、时间、日期、货币、百分数

四、使用pyhanlp实现简单命名体识别

        这里结合了我自己的不成熟想法。既然是要识别像人名、地名、组织机构等等的实体,那么我们可以针对分词后这些实体的词性进行抽取,然后转换成实体。这样是不是就达到了实体抽取的效果呢?(当然这也只是自己的看法)下面直接上代码:

  1. from pyhanlp import *
  2. # doc.txt内容为 :赵露思是一名演员
  3. with open("doc.txt", "r", encoding="utf-8") as file:
  4. txt = file.read()
  5. # 人名识别
  6. nlp = HanLP.newSegment().enableNameRecognize(True)
  7. # 分词
  8. cut_word = nlp.seg(txt)
  9. print(cut_word)
  10. #定义实体列表
  11. entity_list = []
  12. for word in cut_word:
  13. if word.toString().find("nr") >= 0:
  14. entity = word.toString()
  15. entity_list.append(ww.split('/')[0])
  16. print(entity)
  17. # 结果输入如下所示,将nr也就是人名实体提取,这样就达到了实体抽取的效果。
  18. # [赵露思/nr, 是/vshi, 一/m, 名演员/n]
  19. # ['赵露思']

        以上是nr的抽取,其实针对其他类别实体,如地名、机构组织公司名称一样的处理方式,只要分析到以上实体的词性,而且需要保证正确的分词,所以这就显得分词的重要性。但在实际情况下不是所有的实体使用分词工具都会正确的分词,这样就会导致分词跟我们预想的结果不一样,从而导致命名体识别的准确性。

五、添加词组到词典

        上面说到如果文本分词不准确,会影响这块命名体识别的准确性,有一个办法可以提高分词的准确性,但是缺点是需要人工维护。就拿我代码中的工具pyhanlp举例,它其实是有一个词库的。我的pyhanlp是在Anaconda3下安装的所以我的目录是:C:\Users\dell\Anaconda3\Lib\site-packages\pyhanlp\static\data\dictionary\custom

         我们可以看到有多个词典,我们根据要添加的词组选择不同的词库。本文案例是要添加到人名词库中,所以我们打开人名词典。按照格式添加,比如要添加小明这个人名词组,那么你需要添加一行为:小明 nr 1 

        添加完之后就可以利用我以上的代码进行命名体识别。

六、总结

        这个方法确实很片面,很多同事说这样需要人为的去维护这个词典,成本过高。如果需要分析一个文档中的实体,首先需要拿到这个文档,找到文档中的关键字,如果分词没有完全分出来的话,需要我们去词典里面添加词组。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号