知识图谱 — pyhanlp实现命名体识别(附命名体识别代码)

上篇文章将到了使用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

知识图谱 — pyhanlp实现命名体识别(附命名体识别代码)_第1张图片

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

知识图谱 — pyhanlp实现命名体识别(附命名体识别代码)_第2张图片

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

六、总结

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

你可能感兴趣的:(知识图谱,命名体识别,python,python,知识图谱,自然语言处理)