【NLP】干货!Python NLTK结合stanford NLP工具包进行文本处理

干货!详述Python NLTK下如何使用stanford NLP工具包

作者:白宁超

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 NLTK 走进大秦帝国

干货!详述Python NLTK下如何使用stanford NLP工具包

1 NLTK和StandfordNLP简介



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 中的以下几个功能:

  1. 中英文分词: StanfordTokenizer
  2. 中英文词性标注: StanfordPOSTagger
  3. 中英文命名实体识别: StanfordNERTagger
  4. 中英文句法分析: StanfordParser
  5. 中英文依存句法分析: StanfordDependencyParser, StanfordNeuralDependencyParser

2 安装配置过程中注意事项



本文以Python 3.5.2和java version "1.8.0_111"版本进行配置,具体安装需要注意以下几点:

  • Stanford NLP 工具包需要 Java 8 及之后的版本,如果出错请检查 Java 版本
  • 本文的配置都是以 Stanford NLP 3.6.0 为例,如果使用的是其他版本,请注意替换相应的文件名
  • 本文的配置过程以 NLTK 3.2 为例,如果使用 NLTK 3.1,需要注意该旧版本中 StanfordSegmenter 未实现,其余大致相同
  • 下面的配置过程是具体细节可以参照:http://nlp.stanford.edu/software/

3 StandfordNLP必要工具包下载



必要包下载:只需要下载以下两个文件就够了,stanfordNLTK文件里面就是StanfordNLP工具包在NLTK中所依赖的jar包和相关文件

  1. stanfordNLTK :自己将所有需要的包和相关文件已经打包在一起了,下面有具体讲解
  2. Jar1.8 :如果你本机是Java 8以上版本,可以不用下载了

StanfordNLTK目录结构如下:(从各个压缩文件已经提取好了,如果读者感兴趣,下面有各个功能的源码文件)

  • 分词依赖:stanford-segmenter.jar、 slf4j-api.jar、data文件夹相关子文件
  • 命名实体识别依赖:classifiers、stanford-ner.jar
  • 词性标注依赖:models、stanford-postagger.jar
  • 句法分析依赖:stanford-parser.jar、stanford-parser-3.6.0-models.jar、classifiers
  • 依存语法分析依赖:stanford-parser.jar、stanford-parser-3.6.0-models.jar、classifiers

压缩包下载和源码分析

  1. 分词压缩包:StanfordSegmenter和StanfordTokenizer:下载stanford-segmenter-2015-12-09.zip (version 3.6.0) 解压获取目录中的 stanford-segmenter-3.6.0.jar 拷贝为 stanford-segmenter.jar和 slf4j-api.jar
  2. 词性标注压缩包:下载stanford-postagger-full-2015-12-09.zip(version 3.6.0) 解压获取stanford-postagger.jar
  3. 命名实体识别压缩包:下载stanford-ner-2015-12-09.zip(version 3.6.0) ,将解压获取stanford-ner.jar和classifiers文件
  4. 句法分析、句法依存分析:下载stanford-parser-full-2015-12-09.zip(version 3.6.0) 解压获取stanford-parser.jar 和 stanford-parser-3.6.0-models.jar

4 StandfordNLP相关核心操作


4.1 分词

StanfordSegmenter 中文分词:下载52nlp改过的NLTK包nltk-develop ,解压后将其拷贝到你的python目录下,进去E:\Python\nltk-develop采用python 编辑器打开setup.py文件,F5运行,输入以下代码:

>>> 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 的初始化参数说明:

  • path_to_jar: 用来定位jar包,本程序分词依赖stanford-segmenter.jar(注: 其他所有 Stanford NLP 接口都有 path_to_jar 这个参数。)
  • path_to_slf4j: 用来定位slf4j-api.jar作用于分词
  • path_to_sihan_corpora_dict: 设定为 stanford-segmenter-2015-12-09.zip 解压后目录中的 data 目录, data 目录下有两个可用模型 pkg.gz 和 ctb.gz 需要注意的是,使用 StanfordSegmenter 进行中文分词后,其返回结果并不是 list ,而是一个字符串,各个汉语词汇在其中被空格分隔开。

StanfordTokenizer 英文分词 :相关参考资料

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‘, ‘.‘]
>>>

执行结果:

4.2 命名实体识别

StanfordNERTagger 英文命名实体识别

>>> 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 中文命名实体识别

>>> 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)

运行结果

4.3 词性标注

StanfordPOSTagger 英文词性标注

>>> 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 中文词性标注

>>> 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()))

 运行结果

4.4 句法分析参考文献资料

StanfordParser英文语法分析

>>> 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 中文句法分析

>>> 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())))

运行结果

4.5 依存句法分析

StanfordDependencyParser 英文依存句法分析

>>> 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 中文依存句法分析

>>> 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)

运行结果

5 参考文献和知识扩展


  1. NLTK官方网站
  2. NLTK的API
  3. NLTK中使用斯坦福中文分词器
  4. GitHub上NLTK源码
时间: 2024-11-07 23:02:58

【NLP】干货!Python NLTK结合stanford NLP工具包进行文本处理的相关文章

python+NLTK 自然语言学习处理二:文本

在前面讲nltk安装的时候,我们下载了很多的文本.总共有9个文本.那么如何找到这些文本呢: text1: Moby Dick by Herman Melville 1851 text2: Sense and Sensibility by Jane Austen 1811 text3: The Book of Genesis text4: Inaugural Address Corpus text5: Chat Corpus text6: Monty Python and the Holy Gra

NLP(一) Python常用开发工具

一.Numpy NumPy系统是Python的一种开源的数值计算包. 包括: 1.一个强大的N维数组对象Array: 2.比较成熟的(广播)函数 库: 3.用于整合C/C++和Fortran代码的工具包: 4.实用的线性代数.傅里叶变换和随机数生成函数. numpy和稀疏矩阵运算包scipy配合使用更加方便. 安装: pip install numpy 二.NLTK Natural Language Toolkit,自然语言处理工具包,在NLP领域中,最常使用的一个Python库. pip in

<NLP with python>笔记:三

Accessing Text Corpora and Lexical Resources(文本语料库和词汇资源) 常用文本预料和词汇资源,如何通过python访问这些资源. 2.1 Accessing Text Corpora 语料:大量的文本资源. 访问语料的三个接口: raw(fileids) /sents(fileids) / words(fileids) Gutenberg Corpora nltk.corpus.gutenberg,通过raw(fileid)/sents(fileid)

<NLP with python>笔记:一

Preface 自然语言经过一代又一代的处理,很难依靠明确的规则来表述.简单的NLP:通过比较词频来比较不同的写作风格;复杂的nlp:理解人类语言,并给出相应. NLP应用:手写字符识别,搜索引擎,机器翻译等: NLP在学术界,又叫做计算语言学: 本书组织 Ch1-3:python处理nlp的简单介绍: Ch4 :结构化的变成来巩固前面的内容,然后是后续的标注/分类/信息提取 : Ch5-7 :标注/分类/信息提取: Ch8-10:语句解析/识别句法结构/构造语义表示: Ch11:如何有效管理语

【NLP】Python实例:基于文本相似度对申报项目进行查重设计

Python实例:申报项目查重系统设计与实现 作者:白宁超 2017年5月18日17:51:37 摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起到一定纠正作用.单位主要针对科技项目申报审核,传统的方式人力物力比较大,且伴随季度性的繁重工作,效率不高.基于此,单位觉得开发一款可以达到实用的智能查重系统.遍及网络文献,终未得到有价值的参考资料,这个也是自然.首先类似知网,paperpass这样的商业公司其毕业申报专利并进行保密,其他科研单位因发

<NLP with python>笔记:二

Ch1 Language Processing with Python 1.1 Computing with Language: Texts and Words 将文本看作是待处理的原始数据. Searching Text nltk.text.Text.concordance(self,word):输出文本中某个word的索引: nltk.text.Text.similar(self,word):输出文本中与指定词出现在相同地方的word: nltk.text.Text.common_conte

stanford nlp 3.8.0 parse中通过java程序获取root节点

Collection<TypedDependency> tdl = gs.allTypedDependencies(); // TreeGraphNode tsn = gs.root(); for(TypedDependency i: tdl){//reln表示节点的关系,dep表示依赖指向的节点 if(i.reln() == GrammaticalRelation.ROOT){ LOG.info("输出root: " + i.dep().toString()); ; }

Stanford NLP 第六课: Long Short Term Memory

RNN存在着梯度消失的问题, 难以学习长期的依赖关系.如何解决RNN的梯度消失问题? Long  Short Term Memory (LSTM) 就是解决这个问题的. 上图是LSTM的一个整体结构.下面是LSTM的细节.下面的整个模块可以看成是一个Memory Cell.Cell的输入有三个, C_t-1, h_t-1, x_t, 输出有两个C_t, h_t; 三个门控组件.输入门i_t, 遗忘门f_t, 输出门o_t. 新的记忆 c^_t,  空心圆圈表示元素级相乘. 一个更加细节一点的示意

中文自然语言处理(NLP)(一)python jieba模块

1.jieba分词的安装 直接在cmd窗口当中pip install即可 2.jieba分词的介绍 jieba分词是目前比较好的中文分词组件之一,jieba分词支持三种模式的分词(精确模式.全模式.搜索引擎模式),并且支持自定义词典(这一点在特定的领域很重要,有时候需要根据领域的需要来添加特定的词典以提高分词结果的质量).支持繁体字分词 3.jieba分词三种分词模式及使用例子 jieba分词模块的主要方法是jieba.cut(),精确模式和全模式的区别主要在于其中的参数不同 (1)精确模式:将