人工智能火热,NLP技术也蓬勃发展,今天主要讲述NLP中的一项基础任务NER的实现。
首先介绍一下NER(命名实体识别,Named-entity recognition)是NLP的一项子任务,旨在实现从文本中抽取实体,实体一般包括:人名,地名,机构名,数量表达式,时间表达式等。在特定的领域,实体也会有所差异,比如:生物医学,研究实体就可以是药名,病名。
目标:实现基础的NER需要得到实体种类下的实体。
借助工具:哈工大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) #命名实体识别
我们可以看到程序已经对各个词汇进行了标注,有关LTP的命名实体识别的标注含义:Nh-人名,Ni-机构名,Ns-地名
如果想要获得实体列表,就可以从对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工具放在一块写的,但是由于时间等原因,最后决定还是分开来写。
欢迎大家的批评指正,多多交流,多多学习。