欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入探索NLTK与Stanford NLP工具包的集成应用

时间:11-18 名人轶事 提交错误

大家好,感谢邀请,今天来为大家分享一下深入探索NLTK与Stanford NLP工具包的集成应用的问题,以及和的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

将斯坦福NLP 工具包与NLTK 结合使用

2016 年6 月8 日目录

NLTK 和斯坦福NLP

安装和配置注意事项

斯坦福分段器

斯坦福分词器

斯坦福NERTagger 和斯坦福POSTagger

斯坦福解析器、斯坦福依赖解析器

斯坦福神经依赖解析器

基本使用StanfordSegmenter和StanfordTokenizer进行分词

使用StanfordNERTagger进行命名实体识别

使用StanfordPOSTagger 进行词性标记

使用StanfordParser进行句法分析

使用StanfordDependencyParser进行依存分析

NLTK 和斯坦福NLP

NLTK是著名的Python自然语言处理(NLP)工具包。它在其收集的大量公共数据集和模型上提供了全面且易于使用的界面,涵盖分词和词性标注(Part-Of)。 -语音标签(POS-tag)、命名实体识别(NER)、句法解析等各种NLP领域的功能。

Stanley NLP 是一个用Java 实现的NLP 工具包,由斯坦福大学NLP 小组开源。它还提供了NLP领域各种问题的解决方案。

斯坦福大学的NLP小组是世界知名的研究小组。如果将NLTK 和斯坦福NLP 这两个工具包结合起来,那就太棒了! 2004年,Steve Bird在NLTK中添加了对Stanford NLP工具包的支持,并通过调用外部jar文件的方式使用Stanford NLP工具包的功能。

从NLTK的提交历史中可以找到对应的提交记录:

提交e1372fef56bfb88d02fdb6c0ea88474d5f414a38

作者: 史蒂文·伯德日期: 8 月3 日星期二12:20:20 2004 +0000

添加了Stanford svn/trunk@2088在当前的NLTK中,通过封装:提供了Stanford NLP中的以下功能

分词

词性标注

命名实体识别

语法分析、依存语法分析

安装与配置

NLTK 3.2之后,增加了用于中文分词的StanfordSegmenter类。作者是知名NLP博主52nlp,参见相关文章。 NLTK 3.1及之前版本只有以下类别:

分词:斯坦福Tokenizer

词性标记:斯坦福POSTagger

命名实体识别:斯坦福NERTagger

语法分析:斯坦福解析器

依赖语法分析: StanleyDependencyParser、StanfordNeuralDependencyParser

为了方便起见,本文使用NLTK 3.2版本来说明如何进行相关安装和配置。 3.1及更早版本基本相同。

注意事项

您需要注意以下几点:

斯坦福NLP 工具包自2014 年10 月起需要Java 8 及更高版本(可能是3.5.0 版本)。如果出现错误,请检查Java版本。

以下配置过程以Stanford NLP 3.6.0为例。如果使用其他版本,请注意替换对应的文件名。

以下配置过程以NLTK 3.2为例。如果您使用NLTK 3.1,您需要注意StanfordSegmenter在这个旧版本中没有实现。其余的都大致相同。

下面的配置过程介绍了如何分别配置不同的接口。根据NLTK的源代码,它们是

nltk/tokenize/stanford.py

nltk/tag/stanford.py

nltk/parse/stanford.py 如果你不想了解这些细节,可以参考NLTK官方wiki页面上的内容。不过需要注意的是,StanfordSegmenter和StanfordNeuralDependencyParser的配置与其他的不同,wiki页面上也没有这样的信息。盖住这部分。

其实根本可以不设置环境变量,但这需要每次调用的时候手动指定参数

斯坦福分段器

从http://nlp.stanford.edu/software/segmenter.html 下载stanford-segmenter-2015-12-09.zip(版本3.6.0)

解压stanford-segmenter-2015-12-09.zip,并将解压目录中的stanford-segmenter-3.6.0.jar复制到stanford-segmenter.jar

将stanford-segmenter.jar 和slf4j-api.jar 添加到CLASSPATH

示例:

export STANFORD_SEGMENTER_PATH="$HOME/stanford/segmenter"export CLASSPATH="$CLASSPATH:$STANFORD_SEGMENTER_PATH/stanford-segmenter.jar:$STANFORD_SEGMENTER_PATH/slf4j-api.jar"之所以需要添加stanford-segmenter.jar和slf4j-api .jar 到CLASSPATH 中,因为StanfordSegmenter 的实现显式依赖这两个文件,并且首先在CLASSPATH 中搜索这两个文件。如果CLASSPATH中没有找到stanford-segmenter.jar,则会到环境变量STANFORD_SEGMENTER指定的路径中查找;同样,如果没有找到slf4j-api.jar,则会到环境变量SLF4J指定的路径中查找。其他几个类也具有相同的依赖关系设置。为了统一管理,可以将所有依赖的jar文件添加到CLASSPATH中。当然,也可以为不同的jar文件设置不同的环境变量。

除了设置环境变量之外,还可以通过函数参数传入依赖jar文件的准确路径。在这种情况下,环境变量设置将被忽略。

斯坦福分词器

从http://nlp.stanford.edu/software/tagger.html 下载stanford-postagger-full-2015-12-09.zip(版本3.6.0)

解压stanford-postagger-full-2015-12-09.zip

将解压目录下的stanford-postagger.jar添加到CLASSPATH中,或者设置到环境变量中

STANFORD_POSTAGGER 中

导出STANFORD_POSTAGGER_PATH="$HOME/stanford/postagger" 导出CLASSPATH="$CLASSPATH:$STANFORD_POSTAGGER_PATH/stanford-postagger.jar" 或

导出STANFORD_POSTAGGER="$HOME/stanford/postagger/stanford-postagger.jar"StanfordNERTagger 和StanleyPOSTagger

在NLTK中,StanfordNERTagger和StanfordPOSTagger都继承自StanfordTagger,并且有共同的设置,所以将它们放在一起讨论。

从http://nlp.stanford.edu/software/CRF-NER.html 下载stanford-ner-2015-12-09.zip(版本3.6.0)

从http://nlp.stanford.edu/software/tagger.html 下载stanford-postagger-full-2015-12-09.zip(版本3.6.0)

解压stanford-ner-2015-12-09.zip 和stanford-postagger-full-2015-12-09.zip

将解压目录下的stanford-ner.jar和stanford-postagger.jar添加到CLASSPATH中。与StanfordTokenizer不同的是,这两个类只从CLASSPATH中查找对应的jar文件(所以为了统一,我建议将它们都添加到CLASSPATH中)

导出STANFORD_NER_PATH="$HOME/stanford/ner" 导出STANFORD_POSTAGGER_PATH="$HOME/stanford/postagger" 导出CLASSPATH="$CLASSPATH:$STANFORD_NER_PATH/stanford-ner.jar:$STANFORD_POSTAGGER_PATH/stanford-postagger.jar" 和stanford-ner -将2015-12-09.zip解压后目录中的classifiers目录和stanford-postagger-full-2015-12-09.zip解压后目录中的models目录添加到环境变量STANFORD_MODELS中。

导出STANFORD_MODELS="$STANFORD_NER_PATH/classifiers:$STANFORD_POSTAGGER_PATH/models"

斯坦福解析器、斯坦福依赖解析器

StanleyParser和StanfordDependencyParser都继承自GenericStanfordParser,并使用stanford-parser.jar提供句法分析功能。

从http://nlp.stanford.edu/software/lex-parser.html 下载stanford-parser-full-2015-12-09.zip(版本3.6.0)

解压下载的压缩包,将stanford-parser.jar和stanford-parser-3.6.0-models.jar(不同版本名称会不同)添加到CLASSPATH中

export STANFORD_PARSER_PATH="$HOME/stanford/parser"export CLASSPATH="$CLASSPATH:$STANFORD_PARSER_PATH/stanford-parser.jar:$STANFORD_PARSER_PATH/stanford-parser-3.6.0-models.jar"或将stanford-parser.jar 添加到环境中在变量STANFORD_PARSER 中,将stanford-parser-3.6.0-models.jar 添加到环境变量STANFORD_MODELS

导出STANFORD_PARSER="$STANFORD_PARSER_PATH/stanford-parser.jar"export STANFORD_MODELS="$STANFORD_MODELS:$STANFORD_PARSER_PATH/stanford-parser-3.6.0.models.jar"StanfordNeuralDependencyParser

尽管StanfordNeuralDependencyParser也继承自GenericStanfordParser并用于句法分析,但它使用Stanford CoreNLP中的函数和模型,并且不依赖于Stanford Parser的(子)工具包。

从http://stanfordnlp.github.io/CoreNLP/下载stanford-corenlp-full-2015-12-09.zip

解压下载的压缩包,将stanford-corenlp-3.6.0.jar和stanford-corenlp-3.6.0-models.jar添加到CLASSPATH中

导出STANFORD_CORENLP_PATH="$HOME/stanford-corenlp-full-2015-12-09" 导出CLASSPATH="$CLASSPATH:$STANFORD_CORENLP_PATH/stanford-corenlp-3.6.0.jar:$STANFORD_CORENLP_PATH/stanford-corenlp-3.6.0-models。 jar" 或者您可以更简单地将解压目录设置为环境变量STANFORD_CORENLP 的值

export STANFORD_CORENLP=$STANFORD_CORENLP_PATH基本用途

使用StanfordSegmenter和StanfordTokenizer进行分词

StanleySegmenter是52nlp实现的Stanford Segmenter的封装,用于中文分词。

#编码:utf-8

从nltk.tokenize导入StanfordSegmenter

分段器=斯坦福分段器(

path_to_sihan_corpora_dict="/home/linusp/stanford/segmenter/data/", path_to_model="/home/linusp/stanford/segmenter/data/pku.gz", path_to_dict="/home/linusp/stanford/segmenter/data/dict -chris6.ser.gz")

res=segmenter.segment(u"北海已成为中国对外开放的后起之秀")

打印类型(res)

print res.encode("utf-8") 北海已成为中国对外开放的后起之秀。 StanleySegmenter :的初始化参数说明

path_to_jar: 用于定位stanford-segmenter.jar。当设置CLASSPATH时,该参数可以留空。

注意: 所有其他斯坦福NLP 接口都有path_to_jar 参数。设置环境变量时也可以留空,后面不再解释。

path_to_slf4j: 用于定位slf4j-api.jar。当设置了CLASSPATH 或SLF4J 环境变量时,该参数可以留空。

path_to_sihan_corpora_dict:设置为stanford-segmenter-2015-12-09.zip解压目录中的数据目录。这个参数名实在是让人费解。

path_to_model:用于指定中文分词所使用的模型。在stanford-segmenter-2015-12-09的数据目录中,有两个可用的模型pkg.gz和ctb.gz

需要注意的是,使用StanfordSegmenter进行中文分词后,返回的结果不是列表,而是每个中文单词之间以空格分隔的字符串。

StanleyTokenizer可以用于英语分词,使用起来比较简单。

#编码:utf-8

从nltk.tokenize 导入斯坦福Tokenizer

分词器=StanfordTokenizer()

sent="纽约的好松饼售价为3.88 美元。请给我买两个。n谢谢。”

print tokenizer.tokenize(sent)[u"Good", u"muffins", u"cost", u"$", u"3.88", u"in", u"New", u"York", u" .", u"请", u"买", u"我", u"两个", u"of", u"他们", u".", u"谢谢", u"."]使用StanfordNERTagger执行命名实体识别

所谓命名实体识别,就是对文本中的人名、地名、组织名称等单元进行识别和标注。这些单位都是“命名实体”。

#编码:utf-8

从nltk.tag 导入斯坦福NERTagger

eng_tagger=斯坦福NERTagger("english.all.3class.distsim.crf.ser.gz")

print eng_tagger.tag("Rami Eid 正在纽约石溪大学学习".split())[(u"Rami", u"PERSON"), (u"Eid", u"PERSON"), (u"是", u"O"), (u"学习", u"O"), (u"at", u"O"), (u"Stony", u"组织"), (u"布鲁克" , u"ORGANIZATION"), (u"University", u"ORGANIZATION"), (u"in", u"O"), (u"NY", u"O")]StanfordNERTagger 需要指定所有的使用的模型,在stanford-ner-2015-12-09.zip解压后的classifiers目录下,有几个可用的英文NER模型:

/home/linusp/stanford/ner/classifiers/ english.all.3class.distsim.crf.ser.gz english.all.3class.distsim.prop english.conll.4class.distsim。 crf.ser.gz english.conll.4class.distsim.prop english.muc.7class.distsim.crf.ser.gz english.muc.7class.distsim.prop 示例。 serialized.ncc.ncc.ser.gz example.serialized.ncc.prop

如果需要识别中文命名实体,可以在Stanford Named Entity Recognizer页面的Models部分找到中文模型的下载链接,下载stanford-chinese-corenlp-2015-12-08-models.jar,并解压将其复制到edu /stanford/nlp/models/ner/目录下的chinese.misc.distsim.crf.ser.gz 和chinese.misc.distsim.prop 到模型目录下(stanford-ner-2015-12-09/分类器),即Can。

coding: utf-8from nltk.tag import StanfordNERTaggerchi_tagger = StanfordNERTagger("chinese.misc.distsim.crf.ser.gz")sent = u"北海 已 成为 中国 对外开放 中 升起 的 一 颗 明星"for word, tag in chi_tagger.tag(sent.split()): print word.encode("utf-8"), tag

北海GPE有O成为O 中国GPE对外开放O中O升O一O星O星O

使用StanfordPOSTagger 进行词性标记

所谓词性标注,就是根据句子中的上下文信息,为句子中的每个单词,如动词、名词、人称代词等,确定最合适的词性标记。

和StanfordNERTagger一样,StanfordPOSTagger需要的输入也是一个已经被分割成单词的句子。以下是英语词性标注示例:

from nltk.tag import斯坦福POSTaggereng_tagger=斯坦福POSTagger("english-biorient-distsim.tagger")print eng_tagger.tag("空载燕子的空速是多少?".split())

[(u"什么", u"WP"), (u"是", u"VBZ"), (u"the", u"DT"), (u"空速", u"NN"), ( u"of", u"IN"), (u"an", u"DT"), (u"unladen", u"JJ"), (u"吞下", u"VB"), (u" ?",你"。")]

如果之前配置时下载的是stanford-postagger-full-xxxx-xx-xx.zip,解压后models目录下有两个中文模型,分别是chinese-distsim.tagger和chinese-nodistsim。标记器,可以直接使用。

coding: utf-8from nltk.tag import StanfordPOSTaggerchi_tagger = StanfordPOSTagger("chinese-distsim.tagger")sent = u"北海 已 成为 中国 对外开放 中 升起 的 一 颗 明星"for _, word_and_tag in chi_tagger.tag(sent.split()): word, tag = word_and_tag.split("#") print word.encode("utf-8"), tag

北海NR已AD成为VV中国NR对外开放NN中LC崛起VV DEC一号CD M明星NN

这个中文词性标注的输出结果有点奇怪……

使用StanfordParser进行句法分析

句法分析在分析单个词的词性的基础上,试图分析词之间的关系,并用这种关系来表示句子的结构。事实上,句法结构可以分为两种,一种是短语结构,另一种是依存结构。前者根据句子的顺序提取句法结构,后者根据单词之间的句法关系提取句子结构。这里所说的句法分析就是短语结构。

from nltk.parse.stanford import StanleyParsereng_parser=StanleyParser(model_path=u"edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")print list(eng_parser.parse("敏捷的棕色狐狸跳过懒狗") 。分裂()))

[Tree("ROOT", [Tree("NP", [Tree("NP", [Tree("DT", ["the"]]), Tree("JJ", ["

quick"]), Tree("JJ", ["brown"]), Tree("NN", ["fox"])]), Tree("NP", [Tree("NP", [Tree("NNS", ["jumps"])]), Tree("PP", [Tree("IN", ["over"]), Tree("NP", [Tree("DT", ["the"]), Tree("JJ", ["lazy"]), Tree("NN", ["dog"])])])])])])] 得到的结果是一个 list, 其中的元素是 Tree 类型的,在上面这个例子中,这个 list 的长度是 1 ,调用 Tree 的 draw 方法可以将句法树绘制出来。 eng_parse_tree.png要进行中文的句法分析,只要指定好中文的模型就好,可用的中文模型有两个,分别是 "edu/stanford/nlp/models/lexparser/chinesePCFG.ser.gz" 和 "edu/stanford/nlp/models/lexparser/chineseFactored.ser.gz",依然拿 "北海 已 成为 中国 对外开放 中 升起 的 一 颗 明星" 这句话作为例子,得到的句法树如下所示。 chi_parse_tree.png使用 StanfordDependencyParser 进行依存句法分析 见上一节,依存句法分析得到的是句子的依存结构。 from nltk.parse.stanford import StanfordDependencyParsereng_parser = StanfordDependencyParser(model_path=u"edu/stanford/nlp/models/lexparser/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 ((u"fox", u"NN"), u"det", (u"the", u"DT"))((u"fox", u"NN"), u"amod", (u"quick", u"JJ"))((u"fox", u"NN"), u"amod", (u"brown", u"JJ"))((u"fox", u"NN"), u"dep", (u"jumps", u"NNS"))((u"jumps", u"NNS"), u"nmod", (u"dog", u"NN"))((u"dog", u"NN"), u"case", (u"over", u"IN"))((u"dog", u"NN"), u"det", (u"the", u"DT"))((u"dog", u"NN"), u"amod", (u"lazy", u"JJ")) 绘制出来的依存句法结构如下图所示。 dep_parse_tree.png中文的依存句法分析同理,在初始化时使用中文模型即可,不再赘述。 StanfordNeuralDependencyParser 的使用与 StanfordDependencyParser 一样,但是在本人的机器上执行非常耗时,即使是对一些简单句子,所以这里就不略过不讲了。

用户评论

孤廖

听说用Stanford工具可以做更多自然语言处理的任务吗?超期待看看这篇文章能教会我什么!

    有10位网友表示赞同!

我的黑色迷你裙

我一直都想尝试一下斯坦福NLP,NLTK看起来很不错哦!

    有9位网友表示赞同!

闲肆

学习NLTK太重要了,现在有很多自然语言处理项目想做!

    有15位网友表示赞同!

挽手余生ら

Stanford NLP 工具包真的好用吗?这篇文章应该能解答我的疑问!

    有5位网友表示赞同!

oО清风挽发oО

我刚开始接触自然语言处理,这篇文章看起来很适合新手入门。

    有16位网友表示赞同!

致命伤

NLTK和Stanford NLP 的功能比我想象的要多得多!

    有14位网友表示赞同!

别留遗憾

感觉这个教程会让我对 NLTK 和 Stanford NLP 更有更深的理解。

    有19位网友表示赞同!

▼遗忘那段似水年华

好想要把 Stanford NLP 工具包应用到我的项目中去!

    有12位网友表示赞同!

人心叵测i

现在自然语言处理越来越热门了,学习NLTK和Stanford NLP 是必不可少的技能!

    有11位网友表示赞同!

窒息

这篇文章能帮助我更好地了解如何在 NLTK 中使用 Stanford NLP 的强大功能吗?

    有14位网友表示赞同!

最迷人的危险

希望能看到一些具体的例子,以便更直观地理解使用方法。

    有20位网友表示赞同!

冷青裳

学习新工具包总让人兴奋啊!期待这个教程能教会我更多新知识。

    有16位网友表示赞同!

清羽墨安

Stanford NLP 听说以前也开发过很多优秀的项目,这篇文章应该能带给我一些启发!

    有16位网友表示赞同!

Hello爱情风

我觉得自然语言处理的未来充满了可能性,NLTK 和 Stanford NLP 是其中非常重要的工具!

    有11位网友表示赞同!

算了吧

现在越来越多的研究者都在使用 NLTK 和 Stanford NLP 进行工作,希望能跟着潮流学习一下!

    有10位网友表示赞同!

服从

这篇文章应该能帮助我更好地理解这些工具库之间是如何互动的。

    有19位网友表示赞同!

伤离别

我一直在寻找合适的工具来进行文本分析,或许 Stanford NLP 能解决我的难题!

    有15位网友表示赞同!

葵雨

希望看到一些关于 Stanford NLP 的历史背景和发展历程的信息,这样可以更全面地了解它!

    有11位网友表示赞同!

还未走i

感觉这篇文章能提供非常宝贵的学习资源,我会认真阅读并实践其中的知识!

    有11位网友表示赞同!

【深入探索NLTK与Stanford NLP工具包的集成应用】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活