斯坦福分析器和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。

安装

  1. https://github.com/nltk/nltk下载NLTK v3。 并安装NLTK:

    sudo python setup.py安装

  2. 您可以使用NLTK下载程序使用Python获取斯坦福分析器:

     import nltk nltk.download() 
  3. 试试我的例子! (不要忘记更改jarpath并将模型path更改为ser.gz位置)

要么:

  1. 下载并安装NLTK v3,与上面相同。

  2. 从( 当前版本的文件名是stanford-parser-full-2015-01-29.zip)下载最新版本: http : //nlp.stanford.edu/software/lex-parser.shtml#Download

  3. 提取standford-parser-full-20xx-xx-xx.zip。

  4. 创build一个新文件夹(在我的例子中“jar子”)。 将解压缩的文件放入jar文件夹:stanford-parser-3.xx-models.jar和stanford-parser.jar。

    如上所示,您可以使用环境variables(STANFORD_PARSER和STANFORD_MODELS)来指向这个“jars”文件夹。 我正在使用Linux,所以如果你使用Windows,请使用类似于:C://文件夹//jar子。

  5. 使用Archive manager(7zip)打开stanford-parser-3.xx-models.jar。

  6. 浏览jar文件里面; 埃杜/斯坦福/ NLP /模型/ lexparser。 再次提取名为“englishPCFG.ser.gz”的文件。 记住你提取这个ser.gz文件的位置。

  7. 创buildStanfordParser实例时,可以提供模型path作为参数。 这是模型的完整path,在我们的例子/location/of/englishPCFG.ser.gz中。

  8. 试试我的例子! (不要忘记更改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_JARSTANFORD_PARSERvariables将被弃用,且不再使用


更长时间:

步骤1

假设您已经在您的操作系统上正确安装了Java。

现在,安装/更新您的NLTK版本(请参阅http://www.nltk.org/install.html ):

  • 使用pipsudo pip install -U nltk
  • Debian发行版 (使用apt-get): sudo apt-get install python-nltk

对于Windows (使用32位二进制安装):

  1. 安装Python 3.4: http : //www.python.org/downloads/ (避免使用64位版本)
  2. 安装Numpy(可选): http : //sourceforge.net/projects/numpy/files/NumPy/ (指定pythnon3.4的版本)
  3. 安装NLTK: http : //pypi.python.org/pypi/nltk
  4. 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中:


第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
  • 将相应的模型目录添加到STANFORD_MODELSvariables(即,您可以find保存预先训练模型的目录)

    • 例如对于NER,它将在stanford-ner-2015-04-20/classifiers/
    • 例如对于POS,它将在stanford-postagger-full-2015-04-20/models/
    • 例如对于parsing器,将不会有一个模型目录。

在代码中,请参阅在追加模型名称之前searchSTANFORD_MODELS目录。 另外看到的是,API也会自动尝试在OS环境中search`CLASSPATH'

请注意,从NLTK v3.1开始, STANFORD_JARvariables已被弃用且不再使用 。 在下面的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接口

http://projects.csail.mit.edu/spatial/Stanford_Parser

斯坦福核心NLP软件页面有一个Python包装列表:

http://nlp.stanford.edu/software/corenlp.shtml#Extensions

如果我记得清楚,斯坦福分析器是一个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-gethttps://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_MODELSCLASSPATH环境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')]