最近在做电影评论中人名识别的相关工作,对这一块思考了很久,因为评论中的人名称呼不一,“一人多名”是很普遍的,前期使用了hanlp的HMM模型、CRF模型匹配出的“nr”都是比较正常的人名,后期使用了nlpir模型但还是有些缺漏,对于赘词“小”“大”“老”“哥”等基本都匹配不出。后面使用了哈工大的LTP,发觉效果明显提升,由于是在Ubuntu上进行代码编写,在安装pyltp时频频报错,确实令人心灰意冷,后来另辟蹊径采用ltp接口,但是在速度上受限以及输入上诸多规范,就在想要放弃的时候,突然成功安装Windows上的pyltp,在此非常感谢这位博主:http://blog.csdn.net/mebiuw/article/details/52496920,以下也是借鉴这位博主的内容并加入自己的内容
语言技术平台(LTP) 是由哈工大社会计算与信息检索研究中心历时11年的持续研发而形成的一个自然语言处理工具库,其提供包括中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注等丰富、 高效、精准的自然语言处理技术。LTP制定了基于XML的语言处理结果表示,并在此基础上提供了一整套自底向上的丰富而且高效的中文语言处理模块(包括词法、句法、语义等6项中文处理核心技术),以及基于动态链接库(Dynamic Link Library, DLL)的应用程序接口,可视化工具,并且能够以网络服务(WebService)的形式进行使用。
选择适合自己的版本,下载后直接安装即可
将python路径加入Path中。右键单击 【我的电脑】,选择菜单属性命令,在弹出的对话框中选择 【高级系统设置】 标签,然后点击【环境变量】 按钮。选中【系统变量】中的“Path”选项,单击【编辑】按钮,将弹出如下图所示的对话框。在【变量值】文本框中的末尾添加“;C:\Python27”(这里是你的安装路径),单击【确定】按钮。
因为LTP平台是基于C++,在安装pyltp的过程中会报错:
Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat). Get it from http://aka.ms/vcpython27
所以需要先安装这个软件,前往这个链接:https://www.microsoft.com/en-us/download/details.aspx?id=44266 下载安装即可
在已经安装好pip的前提下,打开cmd,进入如下路径:
输入
pip install pyltp
看到下面的就成功啦!
Successfully installed pyltp
接下来就是下载ltp的相关模型,可在此百度云选择下载:https://pan.baidu.com/share/link?shareid=1988562907&uk=2738088569#list/path=%2F
注意点:模型的路径最好不要有中文,不然模型加载不出
# -*- coding: utf-8 -*-
from pyltp import SentenceSplitter
from pyltp import Segmentor
from pyltp import Postagger
from pyltp import NamedEntityRecognizer
from pyltp import Parser
def sentence_splitter(sentence):
"""
分句,也就是将一片文本分割为独立的句子
:param sentence:几句话
:return: 单个单个句子
"""
single_sentence = SentenceSplitter.split(sentence) # 分句
print '\n'.join(single_sentence)
def word_splitter(sentence):
"""
分词
:param sentence:
:return:
"""
segmentor = Segmentor() # 初始化实例
segmentor.load('D:\Python code\ltp_model\ltp_data_v3.4.0\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
def word_tag(words):
"""
词性标注
:param words: 已切分好的词
:return:
"""
postagger = Postagger() # 初始化实例
postagger.load('D:\Python code\ltp_model\ltp_data_v3.4.0\pos.model') # 加载模型
postags = postagger.postag(words) # 词性标注
for word, tag in zip(words, postags):
print word+'/'+tag
postagger.release() # 释放模型
return postags
def name_recognition(words, postags):
"""
命名实体识别
:param words:分词
:param postags:标注
:return:
"""
recognizer = NamedEntityRecognizer() # 初始化实例
recognizer.load('D:\Python code\ltp_model\ltp_data_v3.4.0\\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):
"""
依存句法分析
:param words:
:param postags:
:return:
"""
parser = Parser() # 初始化实例
parser.load('D:\Python code\ltp_model\ltp_data_v3.4.0\parser.model') # 加载模型
arcs = parser.parse(words, postags) # 句法分析
print "\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs)
parser.release() # 释放模型
# 测试分句子
# sentence_splitter('你好,你觉得这个例子从哪里来的?当然还是直接复制官方文档,然后改了下这里得到的。')
# 测试分词
# word_splitter('你好,你觉得这个例子从哪里来的?当然还是直接复制官方文档,然后改了下这里得到的。')
# 测试词性标注
# word_tag(word_splitter('你好,你觉得这个例子从哪里来的?当然还是直接复制官方文档,然后改了下这里得到的。'))
# 测试命名实体识别
# words = word_splitter('我家在昆明,我现在在北京上学。中秋节你是否会想到李白?')
# tags = word_tag(words)
# name_recognition(words, tags)
# 测试句法分析
# parse(words, tags)