NLTKでStanford Parserを使用することは可能ですか?(私はスタンフォードPOSについて話していません。)
NLTKでStanford Parserを使用することは可能ですか?(私はスタンフォードPOSについて話していません。)
回答:
この回答は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:
注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を使用していることを確認してください。それ以外の場合は、次のようになります。
NLTK v3をhttps://github.com/nltk/nltkからダウンロードします。そして、NLTKをインストールします。
sudo python setup.py install
Pythonを使用して、NLTKダウンローダーを使用してスタンフォードパーサーを取得できます。
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:// folder // jarsのようなものを使用してください。
アーカイブマネージャー(7zip)を使用してstanford-parser-3.xx-models.jarを開きます。
jarファイル内を参照します。edu / stanford / nlp / models / lexparser。再度、「englishPCFG.ser.gz」というファイルを抽出します。このser.gzファイルを抽出した場所を覚えておいてください。
StanfordParserインスタンスを作成するときに、モデルパスをパラメーターとして指定できます。これはモデルへの完全なパスであり、ここでは/location/of/englishPCFG.ser.gzです。
私の例を試してください!(jarパスを変更し、モデルパスをser.gzの場所に変更することを忘れないでください)
nltk.parse.stanford
?私nltk.tag.stanford
はNLTKでしかありません2.0.4
。
AttributeError: 'StanfordParser' object has no attribute 'raw_batch_parse'
raw_parse_sents()
for line in sentences: for sentence in line: sentence.draw()
Treeオブジェクトでのみdraw()を実行できます;)
NLTK official 3rd party tools
ドキュメントからの指示に従うことに関して、ここでのすべての回答に免責事項を追加するのが最善だと思いました。
以下の回答は非推奨です。NLTKv3.3 以降については、https: //stackoverflow.com/a/51981566/610569のソリューションを使用してください。
注:次の回答は次の場合にのみ機能します。
両方のツールの変更はかなり速く、APIは3〜6か月後には非常に異なって見える場合があります。次の回答は一時的なものではなく、一時的なものとして扱ってください。
NLTKを使用してStanford NLPツールをインターフェースする方法の最新の手順については、常にhttps://github.com/nltk/nltk/wiki/Installing-Third-Party-Softwareを参照してください。
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番目に、NLTK
Stanford NLP ToolsのAPIは、個々のNLPツール(Stanford POS tagger、Stanford NER Tagger、Stanford 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は使用されません。
OSにJavaが適切にインストールされていると仮定します。
次に、NLTKバージョンをインストール/更新します(http://www.nltk.org/install.htmlを参照):
sudo pip install -U nltk
sudo apt-get install python-nltk
Windowsの場合(32ビットバイナリインストールを使用):
(なぜ64ビットではないのですか?https://github.com/nltk/nltk/issues/1079を参照してください)
次に、偏執狂から抜け出し、nltk
Python内でバージョンを再確認します。
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ツールを使用するように正しく構成されているわけではありません)
これで、必要な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の場合:
NLTKが関連するファイルパスを自動的に検出できるように、環境変数を設定します。次の変数を設定する必要があります。
適切なStanford NLP .jar
ファイルを CLASSPATH
環境変数に追加します。
stanford-ner-2015-04-20/stanford-ner.jar
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
変数に追加します(つまり、事前トレーニング済みモデルが保存されている場所を見つけることができるディレクトリ)。
stanford-ner-2015-04-20/classifiers/
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)
以下の回答は非推奨です。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
len(i.strip()) > 0
いきましたが、チェックするための条件を追加する必要がありました。そうしないと、インデックスエラーが発生しました。私のパーサー出力には、純粋に空白である行が少なくとも1行あったと思います。
NLTKのV3.3の時点で、ユーザーがすべき避けるからスタンフォードNERまたはPOSタガーをnltk.tag
、そして避けるからスタンフォードトークナイザ/セグメンタをnltk.tokenize
。
代わりに、新しいnltk.parse.corenlp.CoreNLPParser
APIを使用してください。
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')]
list(parser.raw_parse(text))
またはを 使用しlist(parser.parse(parser.tokenize(text))
ます。例を修正しました;)
スタンフォードパーサー用のPythonインターフェイスがあります。
Stanford Core NLPソフトウェアページには、Pythonラッパーのリストがあります。
私がよく覚えているとしたら、スタンフォードのパーサーは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についてはあまり知りませんが、コマンドラインを呼び出す方法があるかもしれません。
それはあなたが望んでいた正確なルートではないかもしれませんが、うまくいけばそれはあなたにいくつかのインスピレーションを与えるでしょう。幸運を祈ります。
この回答は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内の文法ファイルを読み取らせようとしましたが、今のところそれを行うことができませんでした。
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)
この回答は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でコードを実行できない人向けです。
私は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プログラムを実行する方法を理解することでした。もっと良い方法があるはずですが、これはうまくいきます。
この回答は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()
この回答は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バージョンを取得する
私は何時間もかけて、ついに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())
以下の回答は非推奨です。NLTKv3.3 以降については、https: //stackoverflow.com/a/51981566/610569のソリューションを使用してください。
注:次の回答は次の場合にのみ機能します。
両方のツールの変更はかなり速く、APIは3〜6か月後には非常に異なって見える場合があります。次の回答は一時的なものではなく、一時的なものとして扱ってください。
NLTKを使用してStanford NLPツールをインターフェースする方法の最新の手順については、常にhttps://github.com/nltk/nltk/wiki/Installing-Third-Party-Softwareを参照してください。
次のコードは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を見てください!
この回答はNLTK v 3.0に適用され、より新しいバージョンには適用されないことに注意してください。
私は評判のためコメントとして残すことはできませんが、これを解決するのに(無駄に?)費やしたので、このパーサーをNLTKで動作させるために問題/解決策を共有したいと思います。
たとえば、パーサーの場合、モデルディレクトリはありません。
これは私を間違って導きました:
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_MODELS
とCLASSPATH
環境変数を使用して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
パラメーターなしで呼び出すことができ、デフォルトが機能します。
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')]