作者:白宁超
2016年11月6日19:28:43
摘要:NLTK是由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集的大量公开数据集、模型上提供了全面、易用的接口,涵盖了分词、词性标注(Part-Of-Speech tag, POS-tag)、命名实体识别(Named Entity Recognition, NER)、句法分析(Syntactic Parse)等各项 NLP 领域的功能。而Stanford NLP 是由斯坦福大学的 NLP 小组开源的 Java 实现的 NLP 工具包,同样对 NLP 领域的各个问题提供了解决办法。斯坦福大学的 NLP 小组是世界知名的研究小组,能将 NLTK 和 Stanford NLP 这两个工具包结合起来使用,那对于自然语言开发者是再好不过的!在 2004 年 Steve Bird 在 NLTK 中加上了对 Stanford NLP 工具包的支持,通过调用外部的 jar 文件来使用 Stanford NLP 工具包的功能。本分析显得非常方便好用。本文主要介绍NLTK(Natural language Toolkit)下配置安装Stanford NLP ,以及对Standford NLP核心模块进行演示,使读者简单易懂的学习本章知识,后续会继续采用大秦帝国语料对分词、词性标注、命名实体识别、句法分析、句法依存分析进行详细演示。关于python基础知识,可以参看【Python五篇慢慢弹】系列文章(本文原创编著,转载注明出处:干货!详述Python NLTK下如何使用stanford NLP工具包)
【Python NLP】干货!详述Python NLTK下如何使用stanford NLP工具包(1)
【Python NLP】Python 自然语言处理工具小结(2)
【Python NLP】Python NLTK 走进大秦帝国(3)
【Python NLP】Python NLTK获取文本语料和词汇资源(4)
【Python NLP】Python NLTK处理原始文本(5)
NLTK:由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集的大量公开数据集、模型上提供了全面、易用的接口,涵盖了分词、词性标注(Part-Of-Speech tag, POS-tag)、命名实体识别(Named Entity Recognition, NER)、句法分析(Syntactic Parse)等各项 NLP 领域的功能。
Stanford NLP:由斯坦福大学的 NLP 小组开源的 Java 实现的 NLP 工具包,同样对 NLP 领域的各个问题提供了解决办法。斯坦福大学的 NLP 小组是世界知名的研究小组,能将 NLTK 和 Stanford NLP 这两个工具包结合起来使用,那对于自然语言开发者是再好不过的!在 2004 年 Steve Bird 在 NLTK 中加上了对 Stanford NLP 工具包的支持,通过调用外部的 jar 文件来使用 Stanford NLP 工具包的功能。本分析显得非常方便好用。
本文在主要介绍NLTK 中提供 Stanford NLP 中的以下几个功能:
本文以Python 3.5.2和java version "1.8.0_111"版本进行配置,具体安装需要注意以下几点:
必要包下载:只需要下载以下3个文件就够了,stanfordNLTK文件里面就是StanfordNLP工具包在NLTK中所依赖的jar包和相关文件
以上文件下载后,Jar如果是1.8的版本可以不用下载,另外两个压缩包下载到本地,解压后拷贝文件夹到你的python安装主路径下,然后cmd进入NLTK下通过python setup.py install即可。后面操作讲路径简单修改即可。(如果不能正常分词等操作,查看python是否是3.2以上版本,java是否是8以后版本,jar环境变量是否配置正确)
StanfordNLTK目录结构如下:(从各个压缩文件已经提取好了,如果读者感兴趣,下面有各个功能的源码文件)
压缩包下载和源码分析:
StanfordSegmenter 中文分词:下载52nlp改过的NLTK包nltk-develop ,解压后将其拷贝到你的python目录下,进去E:\Python\nltk-develop采用python 编辑器打开setup.py文件,F5运行,输入以下代码:
1
2
3
4
5
6
7
8
9
10
11
|
>>>
from
nltk.tokenize.stanford_segmenter import StanfordSegmenter
>>> segmenter = StanfordSegmenter(
path_to_jar=r
"E:\tools\stanfordNLTK\jar\stanford-segmenter.jar"
,
path_to_slf4j=r
"E:\tools\stanfordNLTK\jar\slf4j-api.jar"
,
path_to_sihan_corpora_dict=r
"E:\tools\stanfordNLTK\jar\data"
,
path_to_model=r
"E:\tools\stanfordNLTK\jar\data\pku.gz"
,
path_to_dict=r
"E:\tools\stanfordNLTK\jar\data\dict-chris6.ser.gz"
)
>>> str=
"我在博客园开了一个博客,我的博客名叫伏草惟存,写了一些自然语言处理的文章。"
>>> result = segmenter.segment(str)
>>> result
|
执行结果:
程序解读:StanfordSegmenter 的初始化参数说明:
StanfordTokenizer 英文分词 :相关参考资料
1
2
3
4
5
6
7
8
|
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (Intel)]
on
win32
Type
"copyright"
,
"credits"
or
"license()"
for
more information.
>>>
from
nltk.tokenize import StanfordTokenizer
>>> tokenizer = StanfordTokenizer(path_to_jar=r
"E:\tools\stanfordNLTK\jar\stanford-parser.jar"
)
>>> sent =
"Good muffins cost $3.88\nin New York. Please buy me\ntwo of them.\nThanks."
>>> print(tokenizer.tokenize(sent))
[
'Good'
,
'muffins'
,
'cost'
,
'$'
,
'3.88'
,
'in'
,
'New'
,
'York'
,
'.'
,
'Please'
,
'buy'
,
'me'
,
'two'
,
'of'
,
'them'
,
'.'
,
'Thanks'
,
'.'
]
>>>
|
执行结果:
StanfordNERTagger 英文命名实体识别
1
2
3
4
|
>>>
from
nltk.tag import StanfordNERTagger
>>> eng_tagger = StanfordNERTagger(model_filename=r
'E:\tools\stanfordNLTK\jar\classifiers\english.all.3class.distsim.crf.ser.gz'
,path_to_jar=r
'E:\tools\stanfordNLTK\jar\stanford-ner.jar'
)
>>> print(eng_tagger.tag(
'Rami Eid is studying at Stony Brook University in NY'
.split()))
[(
'Rami'
,
'PERSON'
), (
'Eid'
,
'PERSON'
), (
'is'
,
'O'
), (
'studying'
,
'O'
), (
'at'
,
'O'
), (
'Stony'
,
'ORGANIZATION'
), (
'Brook'
,
'ORGANIZATION'
), (
'University'
,
'ORGANIZATION'
), (
'in'
,
'O'
), (
'NY'
,
'O'
)]
|
运行结果:
StanfordNERTagger 中文命名实体识别
1
2
3
4
5
6
|
>>> result
'四川省 成都 信息 工程 大学 我 在 博客 园 开 了 一个 博客 , 我 的 博客 名叫 伏 草 惟 存 , 写 了 一些 自然语言 处理 的 文章 。\r\n'
>>>
from
nltk.tag import StanfordNERTagger
>>> chi_tagger = StanfordNERTagger(model_filename=r
'E:\tools\stanfordNLTK\jar\classifiers\chinese.misc.distsim.crf.ser.gz'
,path_to_jar=r
'E:\tools\stanfordNLTK\jar\stanford-ner.jar'
)
>>>
for
word, tag
in
chi_tagger.tag(result.split()):
print(word,tag)
|
运行结果:
StanfordPOSTagger 英文词性标注
1
2
3
|
>>>
from
nltk.tag import StanfordPOSTagger
>>> eng_tagger = StanfordPOSTagger(model_filename=r
'E:\tools\stanfordNLTK\jar\models\english-bidirectional-distsim.tagger'
,path_to_jar=r
'E:\tools\stanfordNLTK\jar\stanford-postagger.jar'
)
>>> print(eng_tagger.tag(
'What is the airspeed of an unladen swallow ?'
.split()))
|
运行结果:
StanfordPOSTagger 中文词性标注
1
2
3
4
5
|
>>>
from
nltk.tag import StanfordPOSTagger
>>> chi_tagger = StanfordPOSTagger(model_filename=r
'E:\tools\stanfordNLTK\jar\models\chinese-distsim.tagger'
,path_to_jar=r
'E:\tools\stanfordNLTK\jar\stanford-postagger.jar'
)
>>> result
'四川省 成都 信息 工程 大学 我 在 博客 园 开 了 一个 博客 , 我 的 博客 名叫 伏 草 惟 存 , 写 了 一些 自然语言 处理 的 文章 。\r\n'
>>> print(chi_tagger.tag(result.split()))
|
运行结果:
StanfordParser英文语法分析
1
2
3
|
>>>
from
nltk.parse.stanford import StanfordParser
>>> eng_parser = StanfordParser(r
"E:\tools\stanfordNLTK\jar\stanford-parser.jar"
,r
"E:\tools\stanfordNLTK\jar\stanford-parser-3.6.0-models.jar"
,r
"E:\tools\stanfordNLTK\jar\classifiers\englishPCFG.ser.gz"
)
>>> print(list(eng_parser.parse(
"the quick brown fox jumps over the lazy dog"
.split())))
|
运行结果:
StanfordParser 中文句法分析
1
2
3
4
|
>>>
from
nltk.parse.stanford import StanfordParser
>>> chi_parser = StanfordParser(r
"E:\tools\stanfordNLTK\jar\stanford-parser.jar"
,r
"E:\tools\stanfordNLTK\jar\stanford-parser-3.6.0-models.jar"
,r
"E:\tools\stanfordNLTK\jar\classifiers\chinesePCFG.ser.gz"
)
>>> sent = u
'北海 已 成为 中国 对外开放 中 升起 的 一 颗 明星'
>>> print(list(chi_parser.parse(sent.split())))
|
运行结果:
StanfordDependencyParser 英文依存句法分析
1
2
3
4
5
|
>>>
from
nltk.parse.stanford import StanfordDependencyParser
>>> eng_parser = StanfordDependencyParser(r
"E:\tools\stanfordNLTK\jar\stanford-parser.jar"
,r
"E:\tools\stanfordNLTK\jar\stanford-parser-3.6.0-models.jar"
,r
"E:\tools\stanfordNLTK\jar\classifiers\englishPCFG.ser.gz"
)
>>> res = list(eng_parser.parse(
"the quick brown fox jumps over the lazy dog"
.split()))
>>>
for
row
in
res[0].triples():
print(row)
|
运行结果:
StanfordDependencyParser 中文依存句法分析
1
2
3
4
5
|
>>>
from
nltk.parse.stanford import StanfordDependencyParser
>>> chi_parser = StanfordDependencyParser(r
"E:\tools\stanfordNLTK\jar\stanford-parser.jar"
,r
"E:\tools\stanfordNLTK\jar\stanford-parser-3.6.0-models.jar"
,r
"E:\tools\stanfordNLTK\jar\classifiers\chinesePCFG.ser.gz"
)
>>> res = list(chi_parser.parse(u
'四川 已 成为 中国 西部 对外开放 中 升起 的 一 颗 明星'
.split()))
>>>
for
row
in
res[0].triples():
print(row)
|
运行结果: