英文实体识别的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接口有两种:

  • pyner: a Python interface to Stanford NER.
  • NLTK contains an interface to Stanford NER.

配置使用环境

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
Write a Comment