スタンフォードパーサーとNLTK


90

NLTKでStanford Parserを使用することは可能ですか?(私はスタンフォードPOSについて話していません。)


6
次も参照してください:gist.github.com/alvations/e1df0ba227e542955a8a
alvas

3
このリンクはもっと見やすくする必要があります。たぶん、トップアンサーを編集してこれについて言及すべきですか?
ラロ・サンチェス

1
ちょっとここで注意してください。JavaがStanford NLPに対応しており、JAVA_HOMEが正しく設定されていることを確認してください。時々人々はこれが原因であるかもしれない「奇妙な」エラーを受け取るかもしれません。
Meng Zhao

NLTK v3.3については、stackoverflow.com
a / 51981566/610569

回答:


89

この回答はNLTK v 3.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( 'ROOT'、[Tree( 'S'、[Tree( 'INTJ'、[Tree( 'UH'、['Hello'])))、Tree( '、'、['、'])、 Tree( 'NP'、[Tree( 'PRP $'、['My'])、Tree( 'NN'、['name'])])、Tree( 'VP'、[Tree( 'VBZ'、[ 'is'])、Tree( 'ADJP'、[Tree( 'JJ'、['Melroy'])])])、Tree( '。'、['。'])])])、Tree( ' ROOT '、[Tree(' SBARQ '、[Tree(' WHNP '、[Tree(' WP '、[' What '])])、Tree(' SQ '、[Tree(' VBZ '、[' is ' ])、Tree( 'NP'、[Tree( 'PRP $'、['your'])、Tree( 'NN'、['name'])])])、Tree( '。'、['? '])])]))]

注1: この例では、パーサーとモデルjarの両方が同じフォルダーにあります。

注2:

  • スタンフォードパーサーのファイル名は、stanford-parser.jarです。
  • スタンフォードモデルのファイル名は次のとおりです:stanford-parser-xxx-models.jar

注3: englishPCFG.ser.gzファイルは、models.jarファイルにあります(/edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz)。comeアーカイブマネージャを使用して、models.jarファイルを「解凍」してください。

注4: Oracle JDK 8とも呼ばれる Java JRE(ランタイム環境)1.8を使用していることを確認してください。それ以外の場合は、次のようになります。

取り付け

  1. NLTK v3をhttps://github.com/nltk/nltkからダウンロードします。そして、NLTKをインストールします。

    sudo python setup.py install

  2. Pythonを使用して、NLTKダウンローダーを使用してスタンフォードパーサーを取得できます。

    import nltk
    nltk.download()
    
  3. 私の例を試してください!(jarパスを変更し、モデルパスを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. 新しいフォルダを作成します(この例では「jars」)。抽出したファイルをこのjarフォルダーに配置します:stanford-parser-3.xx-models.jarおよびstanford-parser.jar。

    上記のように、環境変数(STANFORD_PARSERおよびSTANFORD_MODELS)を使用して、この「jars」フォルダーを指すことができます。私はLinuxを使用しているので、Windowsを使用している場合は、C:// folder // jarsのようなものを使用してください。

  5. アーカイブマネージャー(7zip)を使用してstanford-parser-3.xx-models.jarを開きます。

  6. jarファイル内を参照します。edu / stanford / nlp / models / lexparser。再度、「englishPCFG.ser.gz」というファイルを抽出します。このser.gzファイルを抽出した場所を覚えておいてください。

  7. StanfordParserインスタンスを作成するときに、モデルパスをパラメーターとして指定できます。これはモデルへの完全なパスであり、ここでは/location/of/englishPCFG.ser.gzです。

  8. 私の例を試してください!(jarパスを変更し、モデルパスをser.gzの場所に変更することを忘れないでください)


1
追加されたnltkのバージョンはnltk.parse.stanford?私nltk.tag.stanfordはNLTKでしかありません2.0.4
アレクシス2014年

1
AttributeError: 'StanfordParser' object has no attribute 'raw_batch_parse'
Nick Retallack 14年

5
@alexis:ここからnltk 3.0をダウンロードします。@ Nick Retallack:次のように変更する必要がありますraw_parse_sents()
Rasika Perera

1
はい、そうです。NLTKは関数をraw_parse_sents()に変更します。ドキュメントを参照してください:nltk.org/_modules/nltk/parse/stanford.html raw_parse()を使用する場合、戻り値としてiter(Tree)を取得します。上記のdraw()のサンプルは機能するはずです。raw_parse_sents()を使用する場合、明らかに二重ループが必要です。iter(iter(Tree))を返します。だからコード例:for line in sentences: for sentence in line: sentence.draw() Treeオブジェクトでのみdraw()を実行できます;)
danger89

1
@ danger89、編集済みのメモで回答を上書きして申し訳ありません。最近人々はStanford DependencyパーサーがNLTK v3.1から最近追加されただけで不平を言っています。したがって、混乱を最小限に抑えるために、NLTK official 3rd party toolsドキュメントからの指示に従うことに関して、ここでのすべての回答に免責事項を追加するのが最善だと思いました。
alvas、2015

77

非推奨の回答

以下の回答は非推奨です。NLTKv3.3 以降については、https: //stackoverflow.com/a/51981566/610569のソリューションを使用してください


編集済み

注:次の回答は次の場合にのみ機能します。

  • NLTKバージョン> = 3.2.4
  • 2015-04-20以降にコンパイルされたスタンフォードツール
  • Python 2.7、3.4、および3.5(Python 3.6はまだ公式にサポートされていません)

両方のツールの変更はかなり速く、APIは3〜6か月後には非常に異なって見える場合があります。次の回答は一時的なものではなく、一時的なものとして扱ってください。

NLTKを使用してStanford NLPツールをインターフェースする方法の最新の手順については、常にhttps://github.com/nltk/nltk/wiki/Installing-Third-Party-Softwareを参照してください


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

長い間:


まずStanford NLPツールはJava記述されNLTKはPythonで記述されていること注意する必要があります。NLTKがツールとインターフェースする方法は、コマンドラインインターフェースからJavaツールを呼び出すことです。

第二NLTKに、スタンフォードNLPツールへのAPIはバージョン3.1からかなり変更されました。そのため、NLTKパッケージをv3.1に更新することをお勧めします。

3番目に、NLTKStanford NLP ToolsのAPIは、個々のNLPツール(Stanford POS taggerStanford NER TaggerStanford Parserなど)をラップします。

POSおよびNERタガーの場合、スタンフォードコアNLPパッケージをラップしません

スタンフォードパーサーの場合、これはスタンフォードパーサーとスタンフォードコアNLPの両方をラップする特別なケースです(個人的には、NLTKを使用して後者を使用したことがないので、http://www.eecsでの @dimazestのデモに従います。 qmul.ac.uk/~dm303/stanford-dependency-parser-nltk-and-anaconda.html

NLTK v3.1以降、STANFORD_JARおよびSTANFORD_PARSER変数は非推奨となり、NO LONGERは使用されません。


より長く:


ステップ1

OSにJavaが適切にインストールされていると仮定します。

次に、NLTKバージョンをインストール/更新します(http://www.nltk.org/install.htmlを参照):

  • ピップを使用するsudo 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. インストールのテスト:Start> Python34、次にimport nltkと入力します。

なぜ64ビットではないのですか?https://github.com/nltk/nltk/issues/1079を参照してください


次に、偏執狂から抜け出し、nltkPython内でバージョンを再確認します。

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がStanfordツールを使用するように正しく構成されているわけではありません)


ステップ2

これで、必要なStanford NLPツールインターフェイスを含むNLTKの正しいバージョンがあることを確認できました。必要なすべてのStanford 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

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変数は非推奨であり、LONGERは使用されていません。次のStackoverflowの質問にあるコードスニペットが機能しない場合があります。

UbuntuでのSTEP 3のTL; 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は、そのパラメータ名を変更した場合、あなたはそれに応じて変更する必要がありますが。そのため、NLTKバージョンに合わせてPythonコードを変更するよりも、環境変数を設定することをお勧めします。

たとえば(環境変数を設定しない場合):

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

22

非推奨の回答

以下の回答は非推奨です。NLTKv3.3 以降については、https: //stackoverflow.com/a/51981566/610569のソリューションを使用してください


編集済み

現在のスタンフォードパーサー(2015-04-20)では、のデフォルトの出力lexparser.shが変更されたため、以下のスクリプトは機能しません。

ただし、この回答はレガシーのために保持されていますが、http://nlp.stanford.edu/software/stanford-parser-2012-11-12.zipでも機能します。


元の回答

Jython、JPypeをいじらないでください。pythonにpythonを実行させ、javaにjavaを実行させ、コンソールからStanford Parserの出力を取得します。

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

1
これは私にとってうまくlen(i.strip()) > 0いきましたが、チェックするための条件を追加する必要がありました。そうしないと、インデックスエラーが発生しました。私のパーサー出力には、純粋に空白である行が少なくとも1行あったと思います。
aelfric5578 2013年

1
または、スタンフォードのcorenlpツールにこのpythonラッパーを使用します。bitbucket.org
torotoki /

3
これに注意してください。入力にが含まれ'ていると、奇妙なエラーが発生します。コマンドラインでの呼び出しには、より優れた方法があります
Nick Garvey 14

20

NLTKのV3.3の時点で、ユーザーがすべき避けるからスタンフォードNERまたはPOSタガーをnltk.tag、そして避けるからスタンフォードトークナイザ/セグメンタをnltk.tokenize

代わりに、新しいnltk.parse.corenlp.CoreNLPParserAPIを使用してください。

https://github.com/nltk/nltk/wiki/Stanford-CoreNLP-API-in-NLTKを参照してください


(リンクのみの回答は避けて、以下のNLTK github wikiのドキュメントを貼り付けました)

まず、NLTKを更新します

pip3 install -U nltk # Make sure is >=3.3

次に、必要なCoreNLPパッケージをダウンロードします。

cd ~
wget http://nlp.stanford.edu/software/stanford-corenlp-full-2018-02-27.zip
unzip stanford-corenlp-full-2018-02-27.zip
cd stanford-corenlp-full-2018-02-27

# Get the Chinese model 
wget http://nlp.stanford.edu/software/stanford-chinese-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-chinese.properties 

# Get the Arabic model
wget http://nlp.stanford.edu/software/stanford-arabic-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-arabic.properties 

# Get the French model
wget http://nlp.stanford.edu/software/stanford-french-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-french.properties 

# Get the German model
wget http://nlp.stanford.edu/software/stanford-german-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-german.properties 


# Get the Spanish model
wget http://nlp.stanford.edu/software/stanford-spanish-corenlp-2018-02-27-models.jar
wget https://raw.githubusercontent.com/stanfordnlp/CoreNLP/master/src/edu/stanford/nlp/pipeline/StanfordCoreNLP-spanish.properties 

英語

引き続きstanford-corenlp-full-2018-02-27ディレクトリ内で、サーバーを起動します。

java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-preload tokenize,ssplit,pos,lemma,ner,parse,depparse \
-status_port 9000 -port 9000 -timeout 15000 & 

次にPythonで:

>>> from nltk.parse import CoreNLPParser

# Lexical Parser
>>> parser = CoreNLPParser(url='http://localhost:9000')

# Parse tokenized text.
>>> list(parser.parse('What is the airspeed of an unladen swallow ?'.split()))
[Tree('ROOT', [Tree('SBARQ', [Tree('WHNP', [Tree('WP', ['What'])]), Tree('SQ', [Tree('VBZ', ['is']), Tree('NP', [Tree('NP', [Tree('DT', ['the']), Tree('NN', ['airspeed'])]), Tree('PP', [Tree('IN', ['of']), Tree('NP', [Tree('DT', ['an']), Tree('JJ', ['unladen'])])]), Tree('S', [Tree('VP', [Tree('VB', ['swallow'])])])])]), Tree('.', ['?'])])])]

# Parse raw string.
>>> list(parser.raw_parse('What is the airspeed of an unladen swallow ?'))
[Tree('ROOT', [Tree('SBARQ', [Tree('WHNP', [Tree('WP', ['What'])]), Tree('SQ', [Tree('VBZ', ['is']), Tree('NP', [Tree('NP', [Tree('DT', ['the']), Tree('NN', ['airspeed'])]), Tree('PP', [Tree('IN', ['of']), Tree('NP', [Tree('DT', ['an']), Tree('JJ', ['unladen'])])]), Tree('S', [Tree('VP', [Tree('VB', ['swallow'])])])])]), Tree('.', ['?'])])])]

# Neural Dependency Parser
>>> from nltk.parse.corenlp import CoreNLPDependencyParser
>>> dep_parser = CoreNLPDependencyParser(url='http://localhost:9000')
>>> parses = dep_parser.parse('What is the airspeed of an unladen swallow ?'.split())
>>> [[(governor, dep, dependent) for governor, dep, dependent in parse.triples()] for parse in parses]
[[(('What', 'WP'), 'cop', ('is', 'VBZ')), (('What', 'WP'), 'nsubj', ('airspeed', 'NN')), (('airspeed', 'NN'), 'det', ('the', 'DT')), (('airspeed', 'NN'), 'nmod', ('swallow', 'VB')), (('swallow', 'VB'), 'case', ('of', 'IN')), (('swallow', 'VB'), 'det', ('an', 'DT')), (('swallow', 'VB'), 'amod', ('unladen', 'JJ')), (('What', 'WP'), 'punct', ('?', '.'))]]


# Tokenizer
>>> parser = CoreNLPParser(url='http://localhost:9000')
>>> list(parser.tokenize('What is the airspeed of an unladen swallow?'))
['What', 'is', 'the', 'airspeed', 'of', 'an', 'unladen', 'swallow', '?']

# POS Tagger
>>> pos_tagger = CoreNLPParser(url='http://localhost:9000', tagtype='pos')
>>> list(pos_tagger.tag('What is the airspeed of an unladen swallow ?'.split()))
[('What', 'WP'), ('is', 'VBZ'), ('the', 'DT'), ('airspeed', 'NN'), ('of', 'IN'), ('an', 'DT'), ('unladen', 'JJ'), ('swallow', 'VB'), ('?', '.')]

# NER Tagger
>>> ner_tagger = CoreNLPParser(url='http://localhost:9000', tagtype='ner')
>>> list(ner_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', 'STATE_OR_PROVINCE')]

中国人

`stanford-corenlp-full-2018-02-27ディレクトリから、サーバーを少し違った方法で起動します。

java -Xmx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-serverProperties StanfordCoreNLP-chinese.properties \
-preload tokenize,ssplit,pos,lemma,ner,parse \
-status_port 9001  -port 9001 -timeout 15000

Pythonの場合:

>>> parser = CoreNLPParser('http://localhost:9001')
>>> list(parser.tokenize(u'我家没有电脑。'))
['我家', '没有', '电脑', '。']

>>> list(parser.parse(parser.tokenize(u'我家没有电脑。')))
[Tree('ROOT', [Tree('IP', [Tree('IP', [Tree('NP', [Tree('NN', ['我家'])]), Tree('VP', [Tree('VE', ['没有']), Tree('NP', [Tree('NN', ['电脑'])])])]), Tree('PU', ['。'])])])]

アラビア語

サーバーを起動します。

java -Xmx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-serverProperties StanfordCoreNLP-arabic.properties \
-preload tokenize,ssplit,pos,parse \
-status_port 9005  -port 9005 -timeout 15000

Pythonの場合:

>>> from nltk.parse import CoreNLPParser
>>> parser = CoreNLPParser('http://localhost:9005')
>>> text = u'انا حامل'

# Parser.
>>> parser.raw_parse(text)
<list_iterator object at 0x7f0d894c9940>
>>> list(parser.raw_parse(text))
[Tree('ROOT', [Tree('S', [Tree('NP', [Tree('PRP', ['انا'])]), Tree('NP', [Tree('NN', ['حامل'])])])])]
>>> list(parser.parse(parser.tokenize(text)))
[Tree('ROOT', [Tree('S', [Tree('NP', [Tree('PRP', ['انا'])]), Tree('NP', [Tree('NN', ['حامل'])])])])]

# Tokenizer / Segmenter.
>>> list(parser.tokenize(text))
['انا', 'حامل']

# POS tagg
>>> pos_tagger = CoreNLPParser('http://localhost:9005', tagtype='pos')
>>> list(pos_tagger.tag(parser.tokenize(text)))
[('انا', 'PRP'), ('حامل', 'NN')]


# NER tag
>>> ner_tagger = CoreNLPParser('http://localhost:9005', tagtype='ner')
>>> list(ner_tagger.tag(parser.tokenize(text)))
[('انا', 'O'), ('حامل', 'O')]

フランス語

サーバーを起動します。

java -Xmx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-serverProperties StanfordCoreNLP-french.properties \
-preload tokenize,ssplit,pos,parse \
-status_port 9004  -port 9004 -timeout 15000

Pythonの場合:

>>> parser = CoreNLPParser('http://localhost:9004')
>>> list(parser.parse('Je suis enceinte'.split()))
[Tree('ROOT', [Tree('SENT', [Tree('NP', [Tree('PRON', ['Je']), Tree('VERB', ['suis']), Tree('AP', [Tree('ADJ', ['enceinte'])])])])])]
>>> pos_tagger = CoreNLPParser('http://localhost:9004', tagtype='pos')
>>> pos_tagger.tag('Je suis enceinte'.split())
[('Je', 'PRON'), ('suis', 'VERB'), ('enceinte', 'ADJ')]

ドイツ人

サーバーを起動します。

java -Xmx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-serverProperties StanfordCoreNLP-german.properties \
-preload tokenize,ssplit,pos,ner,parse \
-status_port 9002  -port 9002 -timeout 15000

Pythonの場合:

>>> parser = CoreNLPParser('http://localhost:9002')
>>> list(parser.raw_parse('Ich bin schwanger'))
[Tree('ROOT', [Tree('NUR', [Tree('S', [Tree('PPER', ['Ich']), Tree('VAFIN', ['bin']), Tree('AP', [Tree('ADJD', ['schwanger'])])])])])]
>>> list(parser.parse('Ich bin schwanger'.split()))
[Tree('ROOT', [Tree('NUR', [Tree('S', [Tree('PPER', ['Ich']), Tree('VAFIN', ['bin']), Tree('AP', [Tree('ADJD', ['schwanger'])])])])])]


>>> pos_tagger = CoreNLPParser('http://localhost:9002', tagtype='pos')
>>> pos_tagger.tag('Ich bin schwanger'.split())
[('Ich', 'PPER'), ('bin', 'VAFIN'), ('schwanger', 'ADJD')]

>>> pos_tagger = CoreNLPParser('http://localhost:9002', tagtype='pos')
>>> pos_tagger.tag('Ich bin schwanger'.split())
[('Ich', 'PPER'), ('bin', 'VAFIN'), ('schwanger', 'ADJD')]

>>> ner_tagger = CoreNLPParser('http://localhost:9002', tagtype='ner')
>>> ner_tagger.tag('Donald Trump besuchte Angela Merkel in Berlin.'.split())
[('Donald', 'PERSON'), ('Trump', 'PERSON'), ('besuchte', 'O'), ('Angela', 'PERSON'), ('Merkel', 'PERSON'), ('in', 'O'), ('Berlin', 'LOCATION'), ('.', 'O')]

スペイン語

サーバーを起動します。

java -Xmx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-serverProperties StanfordCoreNLP-spanish.properties \
-preload tokenize,ssplit,pos,ner,parse \
-status_port 9003  -port 9003 -timeout 15000

Pythonの場合:

>>> pos_tagger = CoreNLPParser('http://localhost:9003', tagtype='pos')
>>> pos_tagger.tag(u'Barack Obama salió con Michael Jackson .'.split())
[('Barack', 'PROPN'), ('Obama', 'PROPN'), ('salió', 'VERB'), ('con', 'ADP'), ('Michael', 'PROPN'), ('Jackson', 'PROPN'), ('.', 'PUNCT')]
>>> ner_tagger = CoreNLPParser('http://localhost:9003', tagtype='ner')
>>> ner_tagger.tag(u'Barack Obama salió con Michael Jackson .'.split())
[('Barack', 'PERSON'), ('Obama', 'PERSON'), ('salió', 'O'), ('con', 'O'), ('Michael', 'PERSON'), ('Jackson', 'PERSON'), ('.', 'O')]

すばらしい答えです。ありがとう
エベン

おかげで、これは非常に便利です。ただし、アラビア語の解析は正しくありません。テキストを単語ではなく文字に分割しています
Labibah

list(parser.raw_parse(text))またはを 使用しlist(parser.parse(parser.tokenize(text))ます。例を修正しました;)
alvas

1
これはもっと宣伝されないと信じられない!
Nimitz14、2018年

1
悲しいことに、NLTKは、あなたの周りのコミュニティにこの機能またはNLTKを紹介してお気軽に(=ツールを促進するためにホストおしゃれなdevの会議にリソースを協議を与えるか持っているの交流会を回って十分な人々を持っていない。
alvas



6

私がよく覚えているとしたら、スタンフォードのパーサーはJavaライブラリーであるため、サーバー/コンピューターでJavaインタープリターを実行している必要があります。

私は一度サーバーで使用し、phpスクリプトと組み合わせました。スクリプトはphpのexec()関数を使用して、次のようにコマンドラインでパーサーを呼び出します。

<?php

exec( "java -cp /pathTo/stanford-parser.jar -mx100m edu.stanford.nlp.process.DocumentPreprocessor /pathTo/fileToParse > /pathTo/resultFile 2>/dev/null" );

?>

このコマンドの詳細をすべて覚えているわけではありません。基本的に、fileToParseを開いて解析し、結果をresultFileに書き込みました。次に、PHPは結果ファイルを開いてさらに使用します。

コマンドの終わりは、不要なコマンドライン情報がスクリプトを妨害しないように、パーサーの詳細をNULLに指示します。

Pythonについてはあまり知りませんが、コマンドラインを呼び出す方法があるかもしれません。

それはあなたが望んでいた正確なルートではないかもしれませんが、うまくいけばそれはあなたにいくつかのインスピレーションを与えるでしょう。幸運を祈ります。


6

この回答はNLTK v 3.0に適用され、より新しいバージョンには適用されないことに注意してください。

windoze上のnltk3.0.0で動作する、danger98のコードの適応です。おそらく他のプラットフォームでも、セットアップに合わせてディレクトリ名を調整します。

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

解析コマンドが変更され(www.nltk.org/_modules/nltk/parse/stanford.htmlのソースコードを参照)、JAVAHOME変数を定義する必要があることに注意してください。私はそれをその場でjar内の文法ファイルを読み取らせようとしましたが、今のところそれを行うことができませんでした。


私は1989年からではなく98年ですが、あなたの例に感謝します;)
danger89

4

Stanford Parsersの出力を使用して、nltk(nltk.tree.Tree)でツリーを作成できます。

スタンフォードパーサーがすべての文に対して厳密に1つの解析ツリーがあるファイルを提供すると仮定します。その後、この例は機能しますが、あまり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)

1
+1は、JavaにJavaの処理を、PythonにPythonの処理を実行させるためのものです。javaコマンドの呼び出し方法とオプションによっては、スタンフォードパーサーからの出力ファイルの解析が異なる場合があります。Stanford Parseを呼び出して出力ファイルを取得する方法の詳細も追加するとよいでしょう。
alvas、2015

4

この回答はNLTK v 3.0に適用され、より新しいバージョンには適用されないことに注意してください。

誰も本当に言及しておらず、それがどういうわけか私を悩ませてきたので、Pythonでスタンフォードパーサーを使用する別の方法を次に示します。

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)

このようにして、パスについてもう心配する必要はありません。

Ubuntuで適切に使用できないか、Eclipseでコードを実行できない人向けです。


3

私はWindowsマシンを使用していて、コマンドからのように通常どおりパーサーを実行できますが、別のディレクトリで実行できるため、lexparser.batファイルを編集する必要はありません。完全なパスを入力するだけです。

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

私にとってトリッキーな部分は、別のパスからJavaプログラムを実行する方法を理解することでした。もっと良い方法があるはずですが、これはうまくいきます。


3

この回答はNLTK v 3.0に適用され、より新しいバージョンには適用されないことに注意してください。

NLTKとPythonでStanford Parserを使用することについて、danger89の包括的な回答に関するわずかな更新(または単に代替案)

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

3

この回答はNLTK v 3.0に適用され、より新しいバージョンには適用されないことに注意してください。

これがalvasの答えのWindowsバージョンです

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 、あなたのような回避のJavaエラーへの絶対パスへのすべてのパスを変更する必要がある「クラスが見つかりません」

  • 私はページでいくつかの答えを試しましたが、すべてのメソッドがJavaでPythonと通信するのに失敗するため、Windowsでこのメソッドを適用することを強くお勧めします。

  • 窓で成功したらあなたから連絡をもらいたいし、これらすべての問題をどのように克服したか教えてくれませんか。

  • スタンフォードコアNLPのPythonラッパーを検索してPythonバージョンを取得する



2

私は何時間もかけて、ついにWindowsユーザーのためのシンプルなソリューションを見つけました。基本的には、alvasによる既存の回答の要約版ですが、スタンフォードNLPを初めて使用し、Windowsユーザーである人が(うまくいけば)追跡しやすくなります。

1) NER、POSなどの使用したいモジュールをダウンロードします。私の場合はNERを使用したかったので、http://nlp.stanford.edu/software/stanford-ner-2015-からモジュールをダウンロードしました。04-20.zip

2)ファイルを解凍します。

3)解凍したフォルダーから環境変数(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がインストールされている場合と同様に、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)パーサーを実行します!! これで完了です!

st.tag('Rami Eid is studying at Stony Brook University in NY'.split())


2

非推奨の回答

以下の回答は非推奨です。NLTKv3.3 以降については、https: //stackoverflow.com/a/51981566/610569のソリューションを使用してください


編集済み

注:次の回答は次の場合にのみ機能します。

  • NLTKバージョン== 3.2.5
  • 2016-10-31以降にコンパイルされたスタンフォードツール
  • Python 2.7、3.5、3.6

両方のツールの変更はかなり速く、APIは3〜6か月後には非常に異なって見える場合があります。次の回答は一時的なものではなく、一時的なものとして扱ってください。

NLTKを使用してStanford NLPツールをインターフェースする方法の最新の手順については、常にhttps://github.com/nltk/nltk/wiki/Installing-Third-Party-Softwareを参照してください

TL; DR

次のコードはhttps://github.com/nltk/nltk/pull/1735#issuecomment-306091826から取得しています

ターミナルで:

wget http://nlp.stanford.edu/software/stanford-corenlp-full-2016-10-31.zip
unzip stanford-corenlp-full-2016-10-31.zip && cd stanford-corenlp-full-2016-10-31

java -mx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer \
-preload tokenize,ssplit,pos,lemma,parse,depparse \
-status_port 9000 -port 9000 -timeout 15000

Pythonの場合:

>>> from nltk.tag.stanford import CoreNLPPOSTagger, CoreNLPNERTagger
>>> from nltk.parse.corenlp import CoreNLPParser

>>> stpos, stner = CoreNLPPOSTagger(), CoreNLPNERTagger()

>>> stpos.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'.')]

>>> stner.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')]


>>> parser = CoreNLPParser(url='http://localhost:9000')

>>> next(
...     parser.raw_parse('The quick brown fox jumps over the lazy dog.')
... ).pretty_print()  # doctest: +NORMALIZE_WHITESPACE
                     ROOT
                      |
                      S
       _______________|__________________________
      |                         VP               |
      |                _________|___             |
      |               |             PP           |
      |               |     ________|___         |
      NP              |    |            NP       |
  ____|__________     |    |     _______|____    |
 DT   JJ    JJ   NN  VBZ   IN   DT      JJ   NN  .
 |    |     |    |    |    |    |       |    |   |
The quick brown fox jumps over the     lazy dog  .

>>> (parse_fox, ), (parse_wolf, ) = parser.raw_parse_sents(
...     [
...         'The quick brown fox jumps over the lazy dog.',
...         'The quick grey wolf jumps over the lazy fox.',
...     ]
... )

>>> parse_fox.pretty_print()  # doctest: +NORMALIZE_WHITESPACE
                     ROOT
                      |
                      S
       _______________|__________________________
      |                         VP               |
      |                _________|___             |
      |               |             PP           |
      |               |     ________|___         |
      NP              |    |            NP       |
  ____|__________     |    |     _______|____    |
 DT   JJ    JJ   NN  VBZ   IN   DT      JJ   NN  .
 |    |     |    |    |    |    |       |    |   |
The quick brown fox jumps over the     lazy dog  .

>>> parse_wolf.pretty_print()  # doctest: +NORMALIZE_WHITESPACE
                     ROOT
                      |
                      S
       _______________|__________________________
      |                         VP               |
      |                _________|___             |
      |               |             PP           |
      |               |     ________|___         |
      NP              |    |            NP       |
  ____|_________      |    |     _______|____    |
 DT   JJ   JJ   NN   VBZ   IN   DT      JJ   NN  .
 |    |    |    |     |    |    |       |    |   |
The quick grey wolf jumps over the     lazy fox  .

>>> (parse_dog, ), (parse_friends, ) = parser.parse_sents(
...     [
...         "I 'm a dog".split(),
...         "This is my friends ' cat ( the tabby )".split(),
...     ]
... )

>>> parse_dog.pretty_print()  # doctest: +NORMALIZE_WHITESPACE
        ROOT
         |
         S
  _______|____
 |            VP
 |    ________|___
 NP  |            NP
 |   |         ___|___
PRP VBP       DT      NN
 |   |        |       |
 I   'm       a      dog

Stanford APIの詳細については、http: //www.nltk.org/_modules/nltk/parse/corenlp.htmlをご覧ください。docstringsを見てください!


2

この回答はNLTK v 3.0に適用され、より新しいバージョンには適用されないことに注意してください。

私は評判のためコメントとして残すことはできませんが、これを解決するのに(無駄に?)費やしたので、このパーサーをNLTKで動作させるために問題/解決策を共有したいと思います。

alvas優れた 回答では、次のように述べられています。

たとえば、パーサーの場合、モデルディレクトリはありません。

これは私を間違って導きました:

  • 私がつけた価値に気をつけないでくださいSTANFORD_MODELS (そして私のことだけを気にしますCLASSPATH
  • 去る../path/tostanford-parser-full-2015-2012-09/models directory*(または名前がNLTK正規表現と一致しませんでしたjarファイル付き)事実上空*!

OPが私のようにパーサーを使用したいだけの場合、他に何もダウンロードせず(POStaggerもNERも...)ダウンロードせず、これらのすべての指示に従ってもエラーが発生するのは混乱するかもしれません。

結局のところ、CLASSPATH(このスレッドからの回答の例と説明に従って)与えられたものについて、私はまだエラーを受け取ります:

NLTKはstanford-parser-(\ d +)(。(\ d +))+-models.jarを見つけることができませんでした!CLASSPATH環境変数を設定します。詳細については、stanford-parser-(\ d +)(。(\ d +))+-models.jar、

参照:http : //nlp.stanford.edu/software/lex-parser.shtml

または:

NLTKはstanford-parser.jarを見つけることができませんでした!CLASSPATH環境変数を設定します。詳細については、stanford-parser.jarで、http://nlp.stanford.edu/software/lex-parser.shtmlを参照してください。

しかし、重要なのは、私が正しくロードと私はのように、完全に指定されたすべての引数とパスを持つ関数を呼び出した場合、パーサーを使用することができます。

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)

パーサーのみのソリューション:

したがって、エラーはNLTK、提供された変数STANFORD_MODELSCLASSPATH環境変数を使用してjarをどのように検索しているかに起因します。これを解決する*-models.jarには、正しいフォーマットの(NLTKコードの正規表現に一致させるため、-corenlp -.... jarを使用しない)をで指定されたフォルダーに配置する必要がありますSTANFORD_MODELS

つまり、私は最初に作成しました:

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/

を指すStanfordParserクラシックCLASSPATHを使用すると、Pythonでスムーズにロードできますstanford-parser.jar。実際、このように、StanfordParserパラメーターなしで呼び出すことができ、デフォルトが機能します。


2

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

これはタガーであり、パーサーではない
Nadav B

1

Tensorflowを使用してトレーニングされた、ニューラルモデルに基づくスタンフォードパーサーの新しい開発が、Python APIとして使用できるようになりました。このモデルは、JavaベースのMoelよりもはるかに正確であると想定されています。NLTKパイプラインと確実に統合できます。

パーサーへのリンク。リポジトリには、53の言語の事前トレーニング済みのパーサーモデルが含まれています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.