上篇文章将到了使用jieba、pyhanlp、smoothnlp工具进行文本分词,这篇文章在上篇分词的基础上接着讲解命名体识别,感兴趣的朋友请点我进入到上篇文章查看分词工具的使用。本文在最后有本人一些不成熟的命名体识别方法。
一、什么是实体?
怎么样,被这么一问是不是不知道如何回答。实体的特性必有确定性,这样就可以把实体理解成一个确定的实例。就比如 “王者荣耀“ 它其实就是一个确确实实存在的实例,而单单拿 ”王者“ 或者 ”荣耀“ 来说,我们不能一下子确定是什么。 这就是实体的概念。
二、什么是命名体识别?
命名体识别简称NER,命名实体一般指的是文本中具有特定意义或者指代性强的实体,通常包括 人名、地名、机构名、日期时间、专有名词等,简单来说就是找句子中的人名、地名、机构名称、日期时间和专有名词实体,是组成知识图谱三元组重要且必不可少的步骤。
三、命名体识别类别划分
通常分为三大类七小类:
三大类为:实体类、时间类、数字类
七小类为:人名、地名、组织机构、时间、日期、货币、百分数
四、使用pyhanlp实现简单命名体识别
这里结合了我自己的不成熟想法。既然是要识别像人名、地名、组织机构等等的实体,那么我们可以针对分词后这些实体的词性进行抽取,然后转换成实体。这样是不是就达到了实体抽取的效果呢?(当然这也只是自己的看法)下面直接上代码:
from pyhanlp import *
# doc.txt内容为 :赵露思是一名演员
with open("doc.txt", "r", encoding="utf-8") as file:
txt = file.read()
# 人名识别
nlp = HanLP.newSegment().enableNameRecognize(True)
# 分词
cut_word = nlp.seg(txt)
print(cut_word)
#定义实体列表
entity_list = []
for word in cut_word:
if word.toString().find("nr") >= 0:
entity = word.toString()
entity_list.append(ww.split('/')[0])
print(entity)
# 结果输入如下所示,将nr也就是人名实体提取,这样就达到了实体抽取的效果。
# [赵露思/nr, 是/vshi, 一/m, 名演员/n]
# ['赵露思']
以上是nr的抽取,其实针对其他类别实体,如地名、机构组织公司名称一样的处理方式,只要分析到以上实体的词性,而且需要保证正确的分词,所以这就显得分词的重要性。但在实际情况下不是所有的实体使用分词工具都会正确的分词,这样就会导致分词跟我们预想的结果不一样,从而导致命名体识别的准确性。
五、添加词组到词典
上面说到如果文本分词不准确,会影响这块命名体识别的准确性,有一个办法可以提高分词的准确性,但是缺点是需要人工维护。就拿我代码中的工具pyhanlp举例,它其实是有一个词库的。我的pyhanlp是在Anaconda3下安装的所以我的目录是:C:\Users\dell\Anaconda3\Lib\site-packages\pyhanlp\static\data\dictionary\custom
我们可以看到有多个词典,我们根据要添加的词组选择不同的词库。本文案例是要添加到人名词库中,所以我们打开人名词典。按照格式添加,比如要添加小明这个人名词组,那么你需要添加一行为:小明 nr 1
添加完之后就可以利用我以上的代码进行命名体识别。
六、总结
这个方法确实很片面,很多同事说这样需要人为的去维护这个词典,成本过高。如果需要分析一个文档中的实体,首先需要拿到这个文档,找到文档中的关键字,如果分词没有完全分出来的话,需要我们去词典里面添加词组。