斯坦福大学帕尔斯和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()

输出:

[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:在这个例子中,解析器和模型罐都在同一个文件夹中。

笔记2:

  • 斯坦福分析器的文件名是:stanford-parser.jar
  • 斯坦福模型的文件名是:stanford-parser-xxx-models.jar
  • 注3:englishPCFG.ser.gz文件可以在models.jar文件(/edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz) 被发现。 请使用come archive manager来“解压缩”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()
    
  • 试试我的例子! (不要忘记更改jar路径并将模型路径更改为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。

  • 创建一个新文件夹(在我的例子中是'jars')。 将提取的文件放入此jar文件夹:stanford-parser-3.xx-models.jar和stanford-parser.jar。

    如上所示,您可以使用环境变量(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文件的位置。

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

  • 试试我的例子! (不要忘记更改jar路径并将模型路径更改为ser.gz位置)


  • EDITED

    注意:以下答案只适用于:

  • NLTK版本> = 3.2.4
  • 斯坦福工具自2015-04-20开始编译
  • Python 2.7,3.4和3.5(Python 3.6尚未正式支持)
  • 由于这两种工具的变化速度相当快,3-6个月后API可能会大不相同。 请把下面的答案当作暂时的,而不是永恒的解决方案。

    请务必参考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发生了很大变化。 所以建议将您的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_PARSER变量将被弃用且不再使用


    更长时间:


    步骤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位二进制安装):

  • 安装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
  • 测试安装:开始> Python34,然后输入import 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版本没有看到在导入错误并不意味着你已经成功配置了NLTK API使用斯坦福工具)


    第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下载并解压缩解析器
  • 从http://nlp.stanford.edu/software/tagger.shtml#Download下载并解压缩完整版本标记器
  • 从http://nlp.stanford.edu/software/CRF-NER.shtml#Download下载并unizp NER标记器

  • 第3步

    设置环境变量,使NLTK可以自动找到相关的文件路径。 您必须设置以下变量:

  • 将适当的Stanford NLP .jar文件添加到CLASSPATH环境变量。

  • 例如对于NER,它将是stanford-ner-2015-04-20/stanford-ner.jar
  • 例如,对于POS,它将是stanford-postagger-full-2015-04-20/stanford-postagger.jar
  • 例如对于解析器,它将是stanford-parser-full-2015-04-20/stanford-parser.jar和解析器模型jar文件, stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar
  • 将适当的模型目录添加到STANFORD_MODELS变量(即,您可以找到保存预先训练模型的目录)

  • 例如对于NER,它将在stanford-ner-2015-04-20/classifiers/
  • 例如对于POS,它将在stanford-postagger-full-2015-04-20/models/
  • 例如对于解析器,将不会有模型目录。
  • 在代码中,请参阅它在追加模型名称之前搜索STANFORD_MODELS目录。 另请参阅,API也会自动尝试在OS环境中搜索CLASSPATH)

    请注意,从NLTK v3.1起, STANFORD_JAR变量将被弃用且不再使用 。 在以下Stackoverflow问题中找到的代码片段可能无法正常工作:

  • 斯坦福依赖分析器设置和NLTK
  • nltk接口到斯坦福解析器
  • 将stanford pos tagger导入nltk时遇到麻烦
  • 斯坦福大学实体识别器(无情)在Python Nltk
  • 如何通过斯坦福NLP Tagger和NLTK提高速度
  • 我如何获得stanford NLTK python模块?
  • 斯坦福分析器和NLTK窗口
  • 斯坦福大学用NLTK命名实体识别器(NER)功能
  • 具有NLTK的斯坦福分析器产生空输出
  • 在NLTK中使用Stanford NER Tagger提取人员和组织列表
  • 在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 :有关设置环境变量的说明,请参阅https://stackoverflow.com/a/17176423/610569)

    在启动python之前,你必须像上面那样设置变量,然后:

    >>> 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中添加环境变量,如前面的答案所建议的那样,但您也可以直接告诉解析器/标记器将其初始化为保存.jar文件和模型的直接路径。

    有没有必要,如果你用下面的方法, 但是当API改变其参数名称,则需要相应地更改设置环境变量。 这就是为什么设置环境变量比修改Python代码以适应NLTK版本更可取的原因。

    例如( 不设置任何环境变量 ):

    # 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协同工作。


    原始答复

    我建议你不要惹Jython,JPype。 让python做python的东西,让java做java的东西,通过控制台获得Stanford Parser输出。

    你已经在你的home目录中安装斯坦福分析器之后~/ ,只需使用这条巨蟒的配方,以获得平坦的括号内的解析:

    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
    
    链接地址: http://www.djcxy.com/p/91727.html

    上一篇: Stanford Parser and NLTK

    下一篇: How to extract numbers (along with comparison adjectives or ranges)