pyltp实现NER以及实体统计

∥☆過路亽.° 提交于 2020-08-15 07:09:56

pyltp实现NER以及实体统计

人工智能火热,NLP技术也蓬勃发展,今天主要讲述NLP中的一项基础任务NER的实现。

首先介绍一下NER(命名实体识别,Named-entity recognition)是NLP的一项子任务,旨在实现从文本中抽取实体,实体一般包括:人名,地名,机构名,数量表达式,时间表达式等。在特定的领域,实体也会有所差异,比如:生物医学,研究实体就可以是药名,病名。

目标:实现基础的NER需要得到实体种类下的实体。
借助工具:哈工大LTP

哈工大LTP

怎么去使用LTP?
python3.6+pyltp+ltp_data_v3.4.0
(1)pyltp的使用
a.配置好相应的python环境
b.安装pytlp(命令行:pip install pyltp),安装超时可以镜像下载或者下载好wheel文件本地安装
c.下载模型文件,我使用的版本为ltp_data_v3.4.0,下载地址:模型下载地址
(2)实现NER
准备工作做好后,我们就可以选取测试文本,实现NER,代码如下:






#write by heheyang
# -*- coding: utf-8 -*-
import os
from pyltp import *

LTP_DATA='ltpdata path'#LTPdata的根目录

# 分词
def wordscut(text):
    segmentor = Segmentor()  # 初始化
    wordscut_model_path = os.path.join(LTP_DATA, 'cws.model')
    segmentor.load(wordscut_model_path)  # 加载模型
    words = segmentor.segment(text)  # 分词
    words_list = list(words) # 转换成list
    segmentor.release()  # 释放模型
    return words_list
    
#词性标注
def post_tag(words):
    postag = Postagger()# 初始化
    pos_tag_model_path = os.path.join(LTP_DATA, 'pos.model')
    postag.load(pos_tag_model_path)  # 加载模型
    postags = postag.postag(words)  # 词性标注
    postag.release()  # 释放模型
    return postags

# 命名实体识别
def ner(words, tags):
    ner_temp = NamedEntityRecognizer()# 初始化
    ner_model_path = os.path.join(LTP_DATA, 'ner.model')
    ner_temp.load(ner_model_path)  # 加载模型
    netags = ner_temp.recognize(words, tags)  # 命名实体识别
    for word, ntag in zip(words, netags):
        nertemp = word + ',' + ntag
        print(nertemp, end=" | ")  #结构性输出
    ner_temp.release()  # 释放模型
    return netags

f=open('textpath','r')
wordstemp=f.read()
words = wordscut(wordstemp) #分词
tags = post_tag(words)  #词性标注
netags = ner(words, tags)	#命名实体识别

程序执行结果如下:
NER运行结果

我们可以看到程序已经对各个词汇进行了标注,有关LTP的命名实体识别的标注含义:Nh-人名,Ni-机构名,Ns-地名
NER标签含义
如果想要获得实体列表,就可以从对NER的结果进行程序统计筛选,代码如下:

#write by heheyang
 
#实体统计
import re

def ner_count(wordtags):
    ne_list=[]
    wordtemp=""
    word_tags=wordtags.split("|")
    for wordtag in  word_tags:
        ne=[]
        word_tag=wordtag.split(",")
        if len(word_tag)==2 and word_tag[1]!="O":
            if re.findall("^(B|I)+",word_tag[1]):
                wordtemp+=word_tag[0]    #同一实体的组合
            elif re.findall("^E+",word_tag[1]):
                wordtemp+=word_tag[0]
                tag=re.findall(r"-(.+)",word_tag[1]) #提取实体类型
                ne.append(wordtemp)
                ne.append(tag[0])
                wordtemp=""
            elif re.findall("^S+",word_tag[1]):
                tag=re.findall(r"-(.+)",word_tag[1])
                ne.append(word_tag[0])
                ne.append(tag[0])
            if len(ne)!=0:
                ne_list.append(ne)#实体词汇汇总
    return ne_list
print(ner_count(ner(words, tags)))#打印出实体列表

结果如图:
实体列表
以上完成了pyltp实现NER以及实体统计,最终得到文本的实体列表。
这也算是小白入门,自己整理较久的一篇博客,起初设想的是把几个NLP工具放在一块写的,但是由于时间等原因,最后决定还是分开来写。
欢迎大家的批评指正,多多交流,多多学习。



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!