英文实体识别的python实现
英文实体识别主要的工具有nltk和Stanford NER:
- nltk是用python编写的自然语言处理框架。
- Stanford NER是用java编写的实体识别工具,通过加载不同的语言模型可以支持不同的语言识别。
下面分别用这两个实现实体识别。
nltk
安装
安装nltk
pip install nltk
pip install numpy
安装数据
>>> import nltk
>>> nltk.download() # 选择下载全部,耗时比较长
使用
nltk通过内置的函数进行实体识别,参考这里。
import nltk
text = "University of California is located in California, United States"
words = nltk.word_tokenize(text) # 分词
tags = nltk.pos_tag(words) # 词性识别
ners = nltk.ne_chunk(tags, binary=False) # 实体识别
print ners
output:
(S
(ORGANIZATION University/NNP)
of/IN
(GPE California/NNP)
is/VBZ
located/VBN
in/IN
(GPE California/NNP)
,/,
(GPE United/NNP States/NNPS))
Stanford NER
官方给出的python接口有两种:
配置使用环境
Stanford NER使用java,所以首先要安装好java环境,*需要安装java8*。配置好JAVAHOME
环境变量。
java安装路径一般是:/usr/lib/jvm/java....
环境变量:
sudo vim /etc/profile
在最后添加:
JAVA_HOME=/usr/lib/jvm/java... # 安装路径
PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
export JAVA_HOME
export JRE_HOME
export PATH
保存后重载:
source /etc/profile
然后下载Stanford NER,并解压。
pyner(linux系统)
pyner需要开启Stanford NER server,然后通过http或tcp/ip4调用
安装pyner
$ git clone https://github.com/dat/pyner.git
$ cd pyner
$ sudo python setup.py install
开启Stanford NER server
$ cp stanford-ner.jar stanford-ner-with-classifier.jar
$ jar -uf stanford-ner-with-classifier.jar classifiers/english.all.3class.distsim.crf.ser.gz
$ java -mx500m -cp stanford-ner-with-classifier.jar edu.stanford.nlp.ie.NERServer -port 9191 -loadClassifier classifiers/english.all.3class.distsim.crf.ser.gz -outputFormat inlineXML
使用pyner调用
>>> import ner
>>> tagger = ner.SocketNER(host='localhost', port=9191)
>>>print tagger.get_entities("University of California is located in California, United States")
output:
{'ORGANIZATION': ['University of California'], 'LOCATION': ['California', 'United States']}
nltk.tag.stanford module
这里是使用nltk的接口模块,实际还是调用的Stanford NER进行处理,参考这里。
安装
安装nltk和前面一样,不过这里下载好Stanford NER后需要配置一个STANFORD_MODELS
环境变量指向模型文件夹。
如F:\stanford_ner_model\stanford-ner-2015-12-09\classifiers
。
使用python调用
from nltk.tag import StanfordNERTagger
from nltk.tokenize import word_tokenize
# StanfordNERTagger类接收两个参数:模型文件和Stanford NER的jar文件
st = StanfordNERTagger('F:\stanford_ner_model\stanford-ner-2015-12-09\classifiers\english.all.3class.distsim.crf.ser.gz','F:\stanford_ner_model\stanford-ner-2015-12-09\stanford-ner-3.6.0.jar')
text = "University of California is located in California, United States"
tokenized_text = word_tokenize(text)
classified_text = st.tag(tokenized_text)
for tree in classified_text:
if tree[1] != 'O':
print tree
output:
(u'University', u'ORGANIZATION')
(u'of', u'ORGANIZATION')
(u'California', u'ORGANIZATION')
(u'California', u'LOCATION')
(u'United', u'LOCATION')
(u'States', u'LOCATION')
效果比较
比较上面三个输出,可以发现,pyner的输出已经分类,并且合并了连续实体;nltk.tag.stanford module可以分辨连续实体但未合并;nltk不能分辨连续实体。
Comments