最近遇到一个中文实体分析的问题,之前也接触了一些关于中文文本处理的方法和工具,如jieba分词,分词用着还行,但是这次遇到实体分析就有点懵逼了!!!还好找到了斯坦福的一个开源工具包StanfordCoreNLP。下面就来介绍怎么玩,只针对中文,如果对其它的用法感兴趣,开源访问这里。
开始安装:
首先要下载两个包,这个应该是斯坦福大学训练好的关于处理中文自然语言处理的模型,两个文件1G左右。
地址:StanfordCore NLP文件,我下载时是这个版本stanford-corenlp-full-2017-06-09;
中文处理包,DOWNLOAD ,不知道这个文件要不要配置Java环境,因为我之前安装了Java环境的,我运行时没有出错。
上面两文件下载完成后,将StanfordCore NLP文件解压,然后再将 中文处理包 复制到StanfordCore NLP文件解压后的文件根目录下即可。
最后安装Python的stanfordnlp库,pip install stanfordnlp
OK!!都安装好了,跑起来吧!!!
from stanfordcorenlp import StanfordCoreNLP
nlp = StanfordCoreNLP(r'D:\360Downloads\stanford-corenlp-full-2017-06-09/', lang='zh')
sentence = '我是重庆工商大学的一名学生'
# print(nlp.word_tokenize(sentence))
# print(nlp.pos_tag(sentence))
print(nlp.ner(sentence))
# print(nlp.parse(sentence))
# print(nlp.dependency_parse(sentence))
首先导入所需要的库,再看到nlp的量参数,第一个是你上面StanfordNLP文件解压后的路径,第二个是指定中文,当然还可以指定其他的语言,自己参考源码!
结果:(中文实体的结果)
[('我', 'O'), ('是', 'O'), ('重庆', 'ORGANIZATION'), ('工商', 'ORGANIZATION'), ('大学', 'ORGANIZATION'), ('的', 'O'), ('一', 'NUMBER'), ('名', 'O'), ('学生', 'O')]
可以看出 “重庆工商大学” 这个实体是能判断出来的,'ORGANIZATION'表示实体。
这个是中文分词用的,和jieba类似,不知道那个更好,有时间可以测试一下;
nlp.word_tokenize(sentence)
这个应该是词性标签,结巴也有;
print(nlp.pos_tag(sentence)
这个是解析语法的,结巴好像没有;
nlp.parse(sentence)
这个是解析语法关系的,结巴不知道没有。
nlp.dependency_parse(sentence)
之后又测试了一些例子,效果还不错,不得不说人家真的是斯坦福出来的
最后判断出中文实体来了,怎么把他们有效的结合到一起:
res = nlp.ner(sentence)
tag = 0
name = ''
labels = []
for i in range(len(res)):
if res[i][1] != 'ORGANIZATION':
if tag != 0:
labels.append(name)
name = ''
tag = 0
else:
tag = 1
name += res[i][0]
print(res)
print(labels)