大家好,今天跟大家介绍一下自然语言处理中对中文处理的工具—ltp,以及相关知识。
目前国内有多个开源的中文语言处理工具可供直接调用实现命名实体识别,比如复旦大学研发的fudanNLP,中科院的NLPIR分词系统(又名ICTCLAS2013)和哈工大的LTP。
因为从一开始接触自然语言处理就是用Python进行基本的操作,恰好哈工大的LTP提供python接口,所以就直接用python调用其封装成的pyltp的模块实现命名实体识别。
- pyltp安装
- 实现的功能
一、pyltp安装
整个安装过程参考此博客:
https://blog.csdn.net/junruitian/article/details/84929624
二、实现功能
写在前面的话:
1、修改model路径。
2、文件编码采用utf-8
3、依存句法分析中,句子长度要求少于1024字,分词结果少于256词
分句
分局,就是将一片文本分割为独立的句子,不需要加载模型。
# -*- coding: utf-8 -*-
from pyltp import SentenceSplitter
#分句,也就是将一片文本分割为独立的句子
def sentence_splitter(sentence='你好,今天天气怎么样。有没有好好学习?'):
sents = SentenceSplitter.split(sentence) # 分句
print ('\n'.join(sents))
#测试分句子
sentence_splitter()
结果如下:
分词
注意分词模型是:cws.model
# -*- coding: utf-8 -*-
from pyltp import Segmentor
#分词
def segmentor(sentence='你好,今天天气怎么样。有没有好好学习?希望这篇文章可以给你帮助!'):
segmentor = Segmentor() # 初始化实例
segmentor.load('E:\Python\pyltp\ltp\ltp\ltp_data\cws.model') # 加载模型
words = segmentor.segment(sentence) # 分词
#默认可以这样输出
# print '\t'.join(words)
# 可以转换成List 输出
words_list = list(words)
for word in words_list:
print (word)
segmentor.release() # 释放模型
return words_list
#测试分词
segmentor()
结果:
词性标注
# -*- coding: utf-8 -*-
from pyltp import Segmentor
from pyltp import Postagger
#分词
def segmentor(sentence='你好,今天天气怎么样。有没有好好学习?希望这篇文章可以给你帮助!'):
segmentor = Segmentor() # 初始化实例
segmentor.load('E:\Python\pyltp\ltp\ltp\ltp_data\cws.model') # 加载模型
words = segmentor.segment(sentence) # 分词
#默认可以这样输出
# print ('\t'.join(words))
# 可以转换成List 输出
words_list = list(words)
segmentor.release() # 释放模型
return words_list
def posttagger(words=segmentor()):
postagger = Postagger() # 初始化实例
postagger.load('E:\Python\pyltp\ltp\ltp\ltp_data\pos.model') # 加载模型
postags = postagger.postag(words) # 词性标注
for word,tag in zip(words,postags):
print (word+'/'+tag)
postagger.release() # 释放模型
#测试标注
posttagger()
结果如下:
词性标注文档;参考此处:LTP3.3文档
命名实体的识别
依存句法分析
由于这两处代码比较繁琐,涉及较多,可以在整个文档中自己学习。整个代码如下:
from pyltp import SentenceSplitter
from pyltp import Segmentor
from pyltp import Postagger
from pyltp import SementicRoleLabeller
from pyltp import NamedEntityRecognizer
from pyltp import Parser
#分词
def segmentor(sentence='你好,今天天气怎么样。有没有好好学习?希望这篇文章可以给你帮助!'):
segmentor = Segmentor() # 初始化实例
segmentor.load('E:\Python\pyltp\ltp\ltp\ltp_data\cws.model') # 加载模型
words = segmentor.segment(sentence) # 分词
#默认可以这样输出
print ('\t'.join(words))
# 可以转换成List 输出
words_list = list(words)
segmentor.release() # 释放模型
return words_list
def posttagger(words):
postagger = Postagger() # 初始化实例
postagger.load('E:\Python\pyltp\ltp\ltp\ltp_data\pos.model') # 加载模型
postags = postagger.postag(words) # 词性标注
for word,tag in zip(words,postags):
print (word+'/'+tag)
postagger.release() # 释放模型
return postags
#分句,也就是将一片文本分割为独立的句子
def sentence_splitter(sentence='你好,今天天气怎么样。有没有好好学习?希望这篇文章可以给你帮助!'):
sents = SentenceSplitter.split(sentence) # 分句
print ('\n'.join(sents))
#命名实体识别
def ner(words, postags):
recognizer = NamedEntityRecognizer() # 初始化实例
recognizer.load('E:\Python\pyltp\ltp\ltp\ltp_data\\ner.model') # 加载模型
netags = recognizer.recognize(words, postags) # 命名实体识别
for word, ntag in zip(words, netags):
print (word + '/' + ntag)
recognizer.release() # 释放模型
return netags
#依存语义分析
def parse(words, postags):
parser = Parser() # 初始化实例
parser.load('E:\Python\pyltp\ltp\ltp\ltp_data\\parser.model') # 加载模型
arcs = parser.parse(words, postags) # 句法分析
print ("\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs))
parser.release() # 释放模型
return arcs
#角色标注
def role_label(words, postags, netags, arcs):
labeller = SementicRoleLabeller() # 初始化实例
labeller.load('E:\Python\pyltp\ltp\ltp\ltp_data\\srl') # 加载模型
roles = labeller.label(words, postags, netags, arcs) # 语义角色标注
for role in roles:
print(role.index, "".join(["%s:(%d,%d)" % (arg.name, arg.range.start, arg.range.end) for arg in role.arguments]))
labeller.release() # 释放模型
#测试分句子
print('******************测试将会顺序执行:**********************')
sentence_splitter()
print('###############以上为分句子测试###############')
#测试分词
words = segmentor('我在昆明上学,但是家在甘肃,今年由于疫情,暂时还不可以返校')
print('###############以上为分词测试###############')
#测试标注
tags = posttagger(words)
print('###############以上为词性标注测试###############')
#命名实体识别
netags = ner(words,tags)
print('###############以上为命名实体识别测试###############')
#依存句法识别
arcs = parse(words,tags)
print('###############以上为依存句法测试###############')
#角色标注
roles = role_label(words,tags,netags,arcs)
print('###############以上为角色标注测试###############')