斯坦福分析器和NLTK
在NLTK中可以使用Stanford Parser吗? (我不是在谈论斯坦福POS。)
EDITED
从NLTK版本3.1起,此答案的说明将不再起作用。 请按照https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software
这个答案保留在Stackoverflow的遗留目的。 但答案确实适用于NLTK v3.0。
原始答复
当然,在Python中尝试以下内容:
import os from nltk.parse import stanford os.environ['STANFORD_PARSER'] = '/path/to/standford/jars' os.environ['STANFORD_MODELS'] = '/path/to/standford/jars' parser = stanford.StanfordParser(model_path="/location/of/the/englishPCFG.ser.gz") sentences = parser.raw_parse_sents(("Hello, My name is Melroy.", "What is your name?")) print sentences # GUI for line in sentences: for sentence in line: sentence.draw()
输出:
树('ROOT',[Tree('S',[Tree('INTJ',[Tree('UH',['Hello'])]),Tree(',',[',']),树('NP',[Tree('PRP $',['My']),树('NN',['name'])]),树('VP',[Tree('VBZ',[ (''')),Tree('ADJP',[Tree('JJ',['Melroy'))])]),Tree('。',['。'])])]),Tree('树'('''''''')树,'树' ]),Tree('NP',[Tree('PRP $',['your']),Tree('NN',['name'])])]),Tree('。',['? “])])])]
注1:在这个例子中,parsing器和模型jar都在同一个文件夹中。
笔记2:
- 斯坦福分析器的文件名是:stanford-parser.jar
- 斯坦福模型的文件名是:stanford-parser-xxx-models.jar
注3:可以在models.jar文件(/edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz)中findenglishPCFG.ser.gz文件。 请使用归档pipe理器来“解压”models.jar文件。
注意4:确保你使用的Java JRE(Runtime Environment) 1.8也被称为Oracle JDK 8.否则你会得到:不受支持的major.minor版本52.0。
安装
-
从https://github.com/nltk/nltk下载NLTK v3。 并安装NLTK:
sudo python setup.py安装
-
您可以使用NLTK下载程序使用Python获取斯坦福分析器:
import nltk nltk.download()
-
试试我的例子! (不要忘记更改jarpath并将模型path更改为ser.gz位置)
要么:
-
下载并安装NLTK v3,与上面相同。
-
从( 当前版本的文件名是stanford-parser-full-2015-01-29.zip)下载最新版本: http : //nlp.stanford.edu/software/lex-parser.shtml#Download
-
提取standford-parser-full-20xx-xx-xx.zip。
-
创build一个新文件夹(在我的例子中“jar子”)。 将解压缩的文件放入jar文件夹:stanford-parser-3.xx-models.jar和stanford-parser.jar。
如上所示,您可以使用环境variables(STANFORD_PARSER和STANFORD_MODELS)来指向这个“jars”文件夹。 我正在使用Linux,所以如果你使用Windows,请使用类似于:C://文件夹//jar子。
-
使用Archive manager(7zip)打开stanford-parser-3.xx-models.jar。
-
浏览jar文件里面; 埃杜/斯坦福/ NLP /模型/ lexparser。 再次提取名为“englishPCFG.ser.gz”的文件。 记住你提取这个ser.gz文件的位置。
-
创buildStanfordParser实例时,可以提供模型path作为参数。 这是模型的完整path,在我们的例子/location/of/englishPCFG.ser.gz中。
-
试试我的例子! (不要忘记更改jarpath并将模型path更改为ser.gz位置)
EDITED
注意:以下答案只适用于:
- NLTK版本> = 3.2.4
- 斯坦福工具自2015-04-20以来编译
- Python 2.7,3.4和3.5(Python 3.6尚未正式支持)
由于这两种工具都相当快速地改变,3-6个月之后,API可能会非常不同。 请把下面的答案看作暂时的,而不是一个永恒的解决scheme。
请参考https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software ,了解如何使用NLTK连接斯坦福大学NLP工具的最新指令!
TL; DR
cd $HOME # Update / Install NLTK pip install -U nltk # Download the Stanford NLP tools wget http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip wget http://nlp.stanford.edu/software/stanford-postagger-full-2015-04-20.zip wget http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.zip # Extract the zip file. unzip stanford-ner-2015-04-20.zip unzip stanford-parser-full-2015-04-20.zip unzip stanford-postagger-full-2015-04-20.zip export STANFORDTOOLSDIR=$HOME export CLASSPATH=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/stanford-postagger.jar:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/stanford-ner.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar export STANFORD_MODELS=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/models:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/classifiers
然后:
>>> from nltk.tag.stanford import StanfordPOSTagger >>> st = StanfordPOSTagger('english-bidirectional-distsim.tagger') >>> st.tag('What is the airspeed of an unladen swallow ?'.split()) [(u'What', u'WP'), (u'is', u'VBZ'), (u'the', u'DT'), (u'airspeed', u'NN'), (u'of', u'IN'), (u'an', u'DT'), (u'unladen', u'JJ'), (u'swallow', u'VB'), (u'?', u'.')] >>> from nltk.tag import StanfordNERTagger >>> st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz') >>> st.tag('Rami Eid is studying at Stony Brook University in NY'.split()) [(u'Rami', u'PERSON'), (u'Eid', u'PERSON'), (u'is', u'O'), (u'studying', u'O'), (u'at', u'O'), (u'Stony', u'ORGANIZATION'), (u'Brook', u'ORGANIZATION'), (u'University', u'ORGANIZATION'), (u'in', u'O'), (u'NY', u'O')] >>> from nltk.parse.stanford import StanfordParser >>> parser=StanfordParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz") >>> list(parser.raw_parse("the quick brown fox jumps over the lazy dog")) [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'])])])])])])] >>> from nltk.parse.stanford import StanfordDependencyParser >>> dep_parser=StanfordDependencyParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz") >>> print [parse.tree() for parse in dep_parser.raw_parse("The quick brown fox jumps over the lazy dog.")] [Tree('jumps', [Tree('fox', ['The', 'quick', 'brown']), Tree('dog', ['over', 'the', 'lazy'])])]
长:
首先 ,必须注意的是,斯坦福NLP工具是用Java编写的,而NLTK是用Python编写的 。 NLTK连接工具的方式是通过命令行界面调用Java工具。
其次 ,从3.1版本开始,斯坦福NLP工具的NLTK
API已经发生了很大的变化。 所以build议将您的NLTK软件包更新到v3.1。
第三 ,斯坦福大学NLP工具的NLTK
API NLTK
了各个NLP工具,例如斯坦福POS机器人 , 斯坦福大学NER Tagger , 斯坦福大学Parser 。
对于POS和NER标记器,它不包裹斯坦福核心NLP包 。
对于斯坦福分析器来说,这是一个特殊的例子,它包含了斯坦福分析器和斯坦福核心NLP(我个人并没有使用后者使用NLTK,我宁愿按照@ dimazest在http://www.eecs上的演示。 qmul.ac.uk/~dm303/stanford-dependency-parser-nltk-and-anaconda.html )
请注意,从NLTK v3.1开始, STANFORD_JAR
和STANFORD_PARSER
variables将被弃用,且不再使用
更长时间:
步骤1
假设您已经在您的操作系统上正确安装了Java。
现在,安装/更新您的NLTK版本(请参阅http://www.nltk.org/install.html ):
- 使用pip :
sudo pip install -U nltk
- Debian发行版 (使用apt-get):
sudo apt-get install python-nltk
对于Windows (使用32位二进制安装):
- 安装Python 3.4: http : //www.python.org/downloads/ (避免使用64位版本)
- 安装Numpy(可选): http : //sourceforge.net/projects/numpy/files/NumPy/ (指定pythnon3.4的版本)
- 安装NLTK: http : //pypi.python.org/pypi/nltk
- testing安装:开始> Python34,然后inputimport nltk
( 为什么不是64位?见https://github.com/nltk/nltk/issues/1079 )
然后出于偏执狂,在Python中重新检查你的nltk
版本:
from __future__ import print_function import nltk print(nltk.__version__)
或者在命令行上:
python3 -c "import nltk; print(nltk.__version__)"
确保你看到3.1
作为输出。
为了更加偏执狂,请检查您所喜爱的斯坦福大学NLP工具API是否可用:
from nltk.parse.stanford import StanfordParser from nltk.parse.stanford import StanfordDependencyParser from nltk.parse.stanford import StanfordNeuralDependencyParser from nltk.tag.stanford import StanfordPOSTagger, StanfordNERTagger from nltk.tokenize.stanford import StanfordTokenizer
( 注意 :上面的导入只会确保您使用的是包含这些API的正确的NLTK版本。在导入时看不到错误并不意味着您已成功configurationNLTK API以使用Stanford工具)
第2步
现在您已经检查了您是否具有包含必要的Stanford NLP工具界面的NLTK的正确版本。 您需要下载并提取所有必需的斯坦福大学NLP工具。
TL; DR ,在Unix中:
cd $HOME # Download the Stanford NLP tools wget http://nlp.stanford.edu/software/stanford-ner-2015-04-20.zip wget http://nlp.stanford.edu/software/stanford-postagger-full-2015-04-20.zip wget http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.zip # Extract the zip file. unzip stanford-ner-2015-04-20.zip unzip stanford-parser-full-2015-04-20.zip unzip stanford-postagger-full-2015-04-20.zip
在Windows / Mac中:
- 从http://nlp.stanford.edu/software/lex-parser.shtml#Download下载并解压缩parsing器;
- 从http://nlp.stanford.edu/software/tagger.shtml#Download下载并解压缩;完整版本标记器
- 从http://nlp.stanford.edu/software/CRF-NER.shtml#Download下载并unizp NER标记器
第3步
设置环境variables,使NLTK可以自动find相关的文件path。 您必须设置以下variables:
-
将相应的Stanford NLP
.jar
文件添加到CLASSPATH
环境variables。- 例如对于NER,它将是
stanford-ner-2015-04-20/stanford-ner.jar
- 例如对于POS,它将是
stanford-postagger-full-2015-04-20/stanford-postagger.jar
- 例如对于parsing器,它将是
stanford-parser-full-2015-04-20/stanford-parser.jar
和parsing器模型jar文件,stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar
- 例如对于NER,它将是
-
将相应的模型目录添加到
STANFORD_MODELS
variables(即,您可以find保存预先训练模型的目录)- 例如对于NER,它将在
stanford-ner-2015-04-20/classifiers/
- 例如对于POS,它将在
stanford-postagger-full-2015-04-20/models/
- 例如对于parsing器,将不会有一个模型目录。
- 例如对于NER,它将在
在代码中,请参阅在追加模型名称之前searchSTANFORD_MODELS
目录。 另外看到的是,API也会自动尝试在OS环境中search`CLASSPATH'
请注意,从NLTK v3.1开始, STANFORD_JAR
variables已被弃用且不再使用 。 在下面的Stackoverflow问题中find的代码片段可能不起作用:
- 斯坦福依赖分析器设置和NLTK
- nltk接口到斯坦福parsing器
- 将stanford pos tagger导入nltk时遇到麻烦
- 斯坦福实体识别器(无情)在Python Nltk
- 如何提高斯坦福大学的NLP Tagger和NLTK的速度
- 我怎样才能得到斯坦福NLTK Python模块?
- 斯坦福分析器和NLTK窗口
- 斯坦福大学用NLTK命名实体识别器(NER)function
- 带有NLTK的斯坦福分析器产生空输出
- 在NLTK中使用斯坦福NER标记提取人员和组织列表
- 在NLTK Python中使用Stanford POS Tagger时出错
TL;在Ubuntu上用于STEP 3的DR
export STANFORDTOOLSDIR=/home/path/to/stanford/tools/ export CLASSPATH=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/stanford-postagger.jar:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/stanford-ner.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar export STANFORD_MODELS=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/models:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/classifiers
( 对于Windows :有关设置环境variables的说明,请参阅https://stackoverflow.com/a/17176423/610569 )
在启动python之前,你必须像上面那样设置variables,然后:
>>> from nltk.tag.stanford import StanfordPOSTagger >>> st = StanfordPOSTagger('english-bidirectional-distsim.tagger') >>> st.tag('What is the airspeed of an unladen swallow ?'.split()) [(u'What', u'WP'), (u'is', u'VBZ'), (u'the', u'DT'), (u'airspeed', u'NN'), (u'of', u'IN'), (u'an', u'DT'), (u'unladen', u'JJ'), (u'swallow', u'VB'), (u'?', u'.')] >>> from nltk.tag import StanfordNERTagger >>> st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz') >>> st.tag('Rami Eid is studying at Stony Brook University in NY'.split()) [(u'Rami', u'PERSON'), (u'Eid', u'PERSON'), (u'is', u'O'), (u'studying', u'O'), (u'at', u'O'), (u'Stony', u'ORGANIZATION'), (u'Brook', u'ORGANIZATION'), (u'University', u'ORGANIZATION'), (u'in', u'O'), (u'NY', u'O')] >>> from nltk.parse.stanford import StanfordParser >>> parser=StanfordParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz") >>> list(parser.raw_parse("the quick brown fox jumps over the lazy dog")) [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'])])])])])])]
另外,你可以尝试在python里添加环境variables,就像以前的答案一样,但是你也可以直接告诉parsing器/标记器初始化到保存.jar
文件和模型的直接path。
如果您使用以下方法,则不需要设置环境variables, 但是当API更改其参数名称时,您将需要相应地进行更改。 这就是为什么设置环境variables比修改Python代码以适应NLTK版本更可取的原因。
例如( 不设置任何环境variables ):
# POS tagging: from nltk.tag import StanfordPOSTagger stanford_pos_dir = '/home/alvas/stanford-postagger-full-2015-04-20/' eng_model_filename= stanford_pos_dir + 'models/english-left3words-distsim.tagger' my_path_to_jar= stanford_pos_dir + 'stanford-postagger.jar' st = StanfordPOSTagger(model_filename=eng_model_filename, path_to_jar=my_path_to_jar) st.tag('What is the airspeed of an unladen swallow ?'.split()) # NER Tagging: from nltk.tag import StanfordNERTagger stanford_ner_dir = '/home/alvas/stanford-ner/' eng_model_filename= stanford_ner_dir + 'classifiers/english.all.3class.distsim.crf.ser.gz' my_path_to_jar= stanford_ner_dir + 'stanford-ner.jar' st = StanfordNERTagger(model_filename=eng_model_filename, path_to_jar=my_path_to_jar) st.tag('Rami Eid is studying at Stony Brook University in NY'.split()) # Parsing: from nltk.parse.stanford import StanfordParser stanford_parser_dir = '/home/alvas/stanford-parser/' eng_model_path = stanford_parser_dir + "edu/stanford/nlp/models/lexparser/englishRNN.ser.gz" my_path_to_models_jar = stanford_parser_dir + "stanford-parser-3.5.2-models.jar" my_path_to_jar = stanford_parser_dir + "stanford-parser.jar" parser=StanfordParser(model_path=eng_model_path, path_to_models_jar=my_path_to_models_jar, path_to_jar=my_path_to_jar)
编辑
截至目前的斯坦福分析器(2015-04-20), lexparser.sh
的默认输出已更改,因此下面的脚本将不起作用。
但是,这个答案是为了遗留的缘故,但它仍然可以与http://nlp.stanford.edu/software/stanford-parser-2012-11-12.zip一起工作。;
原始答复
我build议你不要乱Jython,JPype。 让python做python的东西,让java做java的东西,通过控制台得到斯坦福分析器的输出。
在你的home目录下安装了Stanford Parser之后,只需使用这个python配方就可以得到这个扁括式的分析:
import os sentence = "this is a foo bar i want to parse." os.popen("echo '"+sentence+"' > ~/stanfordtemp.txt") parser_out = os.popen("~/stanford-parser-2012-11-12/lexparser.sh ~/stanfordtemp.txt").readlines() bracketed_parse = " ".join( [i.strip() for i in parser_out if i.strip()[0] == "("] ) print bracketed_parse
有斯坦福分析器的Python接口
斯坦福核心NLP软件页面有一个Python包装列表:
如果我记得清楚,斯坦福分析器是一个Java库,因此您的服务器/计算机上必须运行Java解释器。
我曾经使用它一次服务器,结合一个PHP脚本。 该脚本使用php的exec()函数对parsing器进行命令行调用,如下所示:
<?php exec( "java -cp /pathTo/stanford-parser.jar -mx100m edu.stanford.nlp.process.DocumentPreprocessor /pathTo/fileToParse > /pathTo/resultFile 2>/dev/null" ); ?>
我不记得这个命令的所有细节,它基本上打开了fileToParse,parsing它,并将输出写入resultFile中。 PHP会打开结果文件以供进一步使用。
该命令的结尾将分析器的详细信息指向NULL,以防止不必要的命令行信息干扰脚本。
我不太了解Python,但可能有一种方法可以进行命令行调用。
这可能不是你希望的确切路线,但希望能给你一些启发。 祝你好运。
EDITED
截至2015年10月15日,PyPi库已更新为NLTK v3.1,其中包含Stanford NLP工具API的稳定版本。 ( https://pypi.python.org/pypi/nltk )
另外,NLTK v3.1可以使用Ubuntu软件包pipe理器apt-get
与https://launchpad.net/ubuntu/+source/nltk进行安装(请参阅https://github.com/nltk/nltk/issues/747 )
原始答复
PyPi软件包(使用pip和easy_install下载)非常过时(从2012年开始)。 要访问SP,您需要下载最新版本( https://github.com/nltk/nltk )并进行安装。 这将允许您使用@ Danger89给出的解决scheme
EDITED
从NLTK版本3.1起,此答案的说明将不再起作用。 请按照https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software
这个答案保留在Stackoverflow的遗留目的。 但答案确实适用于NLTK v3.0。
原始答复
这里有一个危险98的代码适用于windlze的nltk3.0.0,也可能是其他平台,根据您的设置调整目录名称:
import os from nltk.parse import stanford os.environ['STANFORD_PARSER'] = 'd:/stanford-parser' os.environ['STANFORD_MODELS'] = 'd:/stanford-parser' os.environ['JAVAHOME'] = 'c:/Program Files/java/jre7/bin' parser = stanford.StanfordParser(model_path="d:/stanford-grammars/englishPCFG.ser.gz") sentences = parser.raw_parse_sents(("Hello, My name is Melroy.", "What is your name?")) print sentences
请注意,parsing命令已更改(请参阅www.nltk.org/_modules/nltk/parse/stanford.html上的源代码),并且需要定义JAVAHOMEvariables。 我试图让它读取jar子里的语法文件,但到目前为止没有做到这一点。
您可以使用Stanford Parsers输出在nltk(nltk.tree.Tree)中创build一棵树。
假设斯坦福分析器给你一个文件,每个句子都有一个分析树。 然后这个例子起作用,虽然它看起来可能不太pythonic:
f = open(sys.argv[1]+".output"+".30"+".stp", "r") parse_trees_text=[] tree = "" for line in f: if line.isspace(): parse_trees_text.append(tree) tree = "" elif "(. ...))" in line: #print "YES" tree = tree+')' parse_trees_text.append(tree) tree = "" else: tree = tree + line parse_trees=[] for t in parse_trees_text: tree = nltk.Tree(t) tree.__delitem__(len(tree)-1) #delete "(. .))" from tree (you don't need that) s = traverse(tree) parse_trees.append(tree)
我在一个Windows机器上,你可以像执行命令一样正常运行parsing器,就像在不同的目录中一样,所以你不需要编辑lexparser.bat文件。 只要放在完整的path。
cmd = r'java -cp \Documents\stanford_nlp\stanford-parser-full-2015-01-30 edu.stanford.nlp.parser.lexparser.LexicalizedParser -outputFormat "typedDependencies" \Documents\stanford_nlp\stanford-parser-full-2015-01-30\stanford-parser-3.5.1-models\edu\stanford\nlp\models\lexparser\englishFactored.ser.gz stanfordtemp.txt' parse_out = os.popen(cmd).readlines()
对我来说,棘手的部分是实现如何从不同的path运行一个Java程序。 必须有更好的方法,但这个工作。
EDITED
从NLTK版本3.1起,此答案的说明将不再起作用。 请按照https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software
这个答案保留在Stackoverflow的遗留目的。 但答案确实适用于NLTK v3.0。
原始答复
对于在NLTK和Python中使用Stanfordparsing器的危险89的综合答案稍作更新(或者简单的替代)
用stanford-parser-full-2015-04-20,JRE 1.8和nltk 3.0.4(python 2.7.6),看起来你不再需要从stanford-parser-xxx-models中提取englishPCFG.ser.gz .jar或设置任何os.environ
from nltk.parse.stanford import StanfordParser english_parser = StanfordParser('path/stanford-parser.jar', 'path/stanford-parser-3.5.2-models.jar') s = "The real voyage of discovery consists not in seeking new landscapes, but in having new eyes." sentences = english_parser.raw_parse_sents((s,)) print sentences #only print <listiterator object> for this version #draw the tree for line in sentences: for sentence in line: sentence.draw()
编辑
截至目前的斯坦福分析器(2015-04-20), lexparser.sh
的默认输出已更改,因此下面的脚本将不起作用。
但是这个答案是为了遗留的缘故,但它仍然可以与http://nlp.stanford.edu/software/stanford-parser-2010-08-20.zip协同工作。;
原始答复
这里是阿尔瓦斯答案的窗口版本
sentences = ('. '.join(['this is sentence one without a period','this is another foo bar sentence '])+'.').encode('ascii',errors = 'ignore') catpath =r"YOUR CURRENT FILE PATH" f = open('stanfordtemp.txt','w') f.write(sentences) f.close() parse_out = os.popen(catpath+r"\nlp_tools\stanford-parser-2010-08-20\lexparser.bat "+catpath+r"\stanfordtemp.txt").readlines() bracketed_parse = " ".join( [i.strip() for i in parse_out if i.strip() if i.strip()[0] == "("] ) bracketed_parse = "\n(ROOT".join(bracketed_parse.split(" (ROOT")).split('\n') aa = map(lambda x :ParentedTree.fromstring(x),bracketed_parse)
笔记:
-
在
lexparser.bat
您需要将所有path更改为绝对path,以避免Java错误,例如“找不到类” -
我强烈build议你在Windows下应用这个方法,因为我在页面上尝试了几个答案,所有的方法与Python通信与Java失败。
-
希望能听到你的意见,如果你成功的窗口,并希望你能告诉我你是如何克服所有这些问题。
-
search斯坦福coreNLP python包装获取python版本
由于没有人真的提到过,而且这也给我带来了很多麻烦,下面是在Python中使用Stanfordparsing器的另一种方法:
stanford_parser_jar = '../lib/stanford-parser-full-2015-04-20/stanford-parser.jar' stanford_model_jar = '../lib/stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar' parser = StanfordParser(path_to_jar=stanford_parser_jar, path_to_models_jar=stanford_model_jar)
这样,你就不用担心path了。
对于那些不能在Ubuntu上正确使用它或在Eclipse中运行代码的人。
我不能因为声誉而留下这个评论,但是由于我花了(浪费了?)一些时间来解决这个问题,所以我宁愿分享我的问题/解决scheme来让这个parsing器在NLTK中工作。
在阿尔瓦斯的出色 答案中提到:
例如对于parsing器,将不会有一个模型目录。
这导致我错误地:
- 不要小心我给
STANFORD_MODELS
的值(只关心我的CLASSPATH
) - 离开
../path/tostanford-parser-full-2015-2012-09/models directory
*虚拟空*(或与名称不匹配nltk正则expression式的jar文件)!
如果OP和我一样,只是想使用parsing器,那么当不下载任何东西(无POStagger,NER,…)并遵循所有这些指令时,可能会感到困惑,我们仍然会遇到错误。
最后,对于任何给出的CLASSPATH
(下面的例子和解释从这个线程的答案),我仍然会得到错误:
NLTK无法find斯坦福分析器 – (\ d +)(。(\ d +))+ – models.jar! 设置CLASSPATH环境variables。 有关详细信息,请参阅stanford-parser – (\ d +)(。(\ d +))+ – models.jar,
请参阅: http : //nlp.stanford.edu/software/lex-parser.shtml
要么:
NLTK无法findstanford-parser.jar! 设置CLASSPATH环境variables。 有关stanford-parser.jar的更多信息,请参阅: http : //nlp.stanford.edu/software/lex-parser.shtml
虽然 ,重要的是,我可以正确加载和使用parsing器,如果我调用所有参数和path完全指定的函数,如下所示:
stanford_parser_jar = '../lib/stanford-parser-full-2015-04-20/stanford-parser.jar' stanford_model_jar = '../lib/stanford-parser-full-2015-04-20/stanfor-parser-3.5.2-models.jar' parser = StanfordParser(path_to_jar=stanford_parser_jar, path_to_models_jar=stanford_model_jar)
仅parsing器的解决scheme:
因此,错误来自于NLTK
,它是如何使用提供的STANFORD_MODELS
和CLASSPATH
环境variables来查找jar的。 为了解决这个问题, *-models.jar
格式正确(匹配NLTK
代码中的正则expression式,所以没有-corenlp -…. jar)必须位于由STANFORD_MODELS
指定的文件夹中。
也就是说,我第一次创build:
mkdir stanford-parser-full-2015-12-09/models
然后添加到.bashrc
:
export STANFORD_MODELS=/path/to/stanford-parser-full-2015-12-09/models
最后,通过将stanford-parser-3.6.0-models.jar
(或相应的版本)复制到:
path/to/stanford-parser-full-2015-12-09/models/
我可以使用指向stanford-parser.jar
的经典CLASSPATH
,使用StanfordParser
在Python中平滑加载。 实际上,因此,你可以不带参数地调用StanfordParser
,默认是正常的。
我花了很多时间,终于find了Windows用户的简单解决scheme。 基本上,它是由alvas 现有的答案的概括版本,但很容易跟随(希望)为斯坦福NLP的新来者,是窗口用户。
1)下载你想使用的模块,如NER,POS等。在我的情况下,我想使用NER,所以我从http://nlp.stanford.edu/software/stanford-ner-2015- 04-20.zip
2)解压文件。
3)从解压后的文件夹中设置环境variables(classpath和stanford_modules)。
import os os.environ['CLASSPATH'] = "C:/Users/Downloads/stanford-ner-2015-04-20/stanford-ner.jar" os.environ['STANFORD_MODELS'] = "C:/Users/Downloads/stanford-ner-2015-04-20/classifiers/"
4)为JAVA设置环境variables,如你在哪里安装JAVA。 对我来说,这是低于
os.environ['JAVAHOME'] = "C:/Program Files/Java/jdk1.8.0_102/bin/java.exe"
5)导入你想要的模块
from nltk.tag import StanfordNERTagger
6)调用解压缩文件夹中分类器文件夹中存在的预训练模型。 最后添加“.gz”作为文件扩展名。 对我来说,我想用的模型是english.all.3class.distsim.crf.ser
st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz')
7)现在执行parsing器! 我们完成了!
st.tag('Rami Eid is studying at Stony Brook University in NY'.split())
我正在使用nltk版本3.2.4。 下面的代码为我工作。
from nltk.internals import find_jars_within_path from nltk.tag import StanfordPOSTagger from nltk import word_tokenize # Alternatively to setting the CLASSPATH add the jar and model via their path: jar = '/home/ubuntu/stanford-postagger-full-2017-06-09/stanford-postagger.jar' model = '/home/ubuntu/stanford-postagger-full-2017-06-09/models/english-left3words-distsim.tagger' pos_tagger = StanfordPOSTagger(model, jar) # Add other jars from Stanford directory stanford_dir = pos_tagger._stanford_jar.rpartition('/')[0] stanford_jars = find_jars_within_path(stanford_dir) pos_tagger._stanford_jar = ':'.join(stanford_jars) text = pos_tagger.tag(word_tokenize("Open app and play movie")) print(text)
输出:
[('Open', 'VB'), ('app', 'NN'), ('and', 'CC'), ('play', 'VB'), ('movie', 'NN')]