NLTKでスタンフォードパーサーを使用することは可能ですか? (私はスタンフォード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ファイルはinsidemodels.jarファイル(/edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz)モデルのアーカイブマネージャーを使用して、models.jarファイルを「解凍」してください。
注4:必ずJava JRE(Runtime Environment)1.8Oracle JDK 8としても知られています。
NLTK v3を https://github.com/nltk/nltk からダウンロードします。 NLTKをインストールします。
Sudo python setup.py install
Pythonを使用して、NLTKダウンローダーを使用してスタンフォードパーサーを取得できます。
import nltk
nltk.download()
私の例を試してください! (jarパスを変更し、モデルパスをser.gzの場所に変更することを忘れないでください)
OR:
上記と同じ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.x.x-models.jarおよびstanford-parser.jar。
上記のように、環境変数(STANFORD_PARSERおよびSTANFORD_MODELS)を使用して、この「jars」フォルダーを指すことができます。私はLinuxを使用しているので、Windowsを使用する場合は、C:// folder // jarsのようなものを使用してください。
アーカイブマネージャー(7Zip)を使用してstanford-parser-3.x.x-models.jarを開きます。
Jarファイル内を参照します。 edu/stanford/nlp/models/lexparser。繰り返しますが、「englishPCFG.ser.gz」というファイルを抽出します。このser.gzファイルを抽出した場所を覚えておいてください。
StanfordParserインスタンスを作成するときに、モデルパスをパラメーターとして指定できます。これは、モデルへの完全なパスです(この例では/location/of/englishPCFG.ser.gz)。
私の例を試してください! (jarパスを変更し、モデルパスをser.gzの場所に変更することを忘れないでください)
以下の回答は非推奨です。NLTKv3.3以降では https://stackoverflow.com/a/51981566/610569 のソリューションを使用してください。
注:次の答えは上でのみ機能します:
どちらのツールもかなり迅速に変更され、3〜6か月後にAPIの外観が大きく変わる可能性があるためです。次の回答は一時的なものであり、永遠の修正ではありません。
最新の手順については、常に https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software を参照してくださいNLTKを使用したインターフェイスStanford NLPツール!!
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ツールを呼び出すことです。
二番目に、Stanford NLPツールへのNLTK
APIは、バージョン3.1からかなり変更されました。したがって、NLTKパッケージをv3.1に更新することをお勧めします。
第三に、Stanford NLP ToolsへのNLTK
APIは、個々のNLPツールをラップします。 Stanford POS tagger 、 Stanford NER Tagger 、 Stanford Parser 。
POSおよびNERタガーの場合、DOES NOTは Stanford Core NLPパッケージ 。
スタンフォードパーサーの場合、スタンフォードパーサーとスタンフォードコアNLPの両方をラップする特殊なケースです(個人的には、NLTKを使用して後者を使用したことがないため、@ dimazestの http:/ /www.eecs.qmul.ac.uk/~dm303/stanford-dependency-parser-nltk-and-anaconda.html )
NLTK v3.1では、STANFORD_JAR
およびSTANFORD_PARSER
変数は非推奨となり、使用されなくなったことに注意してください
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 を参照)
次に、パラノイアから、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を正常に構成したという意味ではありません)
これで、必要なスタンフォード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の場合:
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は `CLASSPATH )のOS環境を自動的に検索しようとします
NLTK v3.1以降、STANFORD_JAR
変数は廃止され、使用されなくなったことに注意してください。次のStackoverflowの質問にあるコードスニペットは機能しない場合があります。
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)
以下の回答は非推奨です。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
NLTK v3.3の時点で、ユーザーはavoidnltk.tag
からのStanford NERまたはPOSタガー、およびavoidnltk.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')]
Stanford Core NLPソフトウェアページには、pythonラッパーのリストがあります。
スタンフォードパーサー用の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つの解析ツリーがあるファイルを提供すると仮定します。次に、この例は機能しますが、あまりPythonyに見えないかもしれません:
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でスタンフォードパーサーを使用する際の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に適用され、最近のバージョンには適用されないことに注意してください。
ここにアルバスの答えの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
では、「class not found」などのJavaエラーを回避するために、すべてのパスを絶対パスに変更する必要があります
ページ上でいくつかの回答を試したが、すべてのメソッドがpythonとJavaが失敗するため、このメソッドをWindowsで適用することを強くお勧めします。
あなたが窓で成功した場合にあなたから話を聞きたいとあなたがこれらすべての問題を克服する方法を教えてほしい。
pythonバージョンを取得するには、pythonスタンフォードcoreNLPのラッパーを検索します
この回答はNLTK v 3.0に適用され、最近のバージョンには適用されないことに注意してください。
評判のためにこれをコメントとして残すことはできませんが、これを解決するのに時間を費やしました(無駄になりましたか?).
excellentalvasからの回答 には、次のことが記載されています:
例えばパーサーの場合、モデルディレクトリはありません。
これは間違って私を導きました:
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
Though、重要なことは、次のようにすべての引数とパスを完全に指定して関数を呼び出すと、パーサーを正しくロードして使用できることです。
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/
stanford-parser.jar
を指すクラシックStanfordParser
を使用して、pythonでCLASSPATH
をスムーズにロードできます。実際、そのようなものとして、パラメータなしでStanfordParser
を呼び出すことができ、デフォルトが機能します。
私は何時間もかけて、ついにWindowsユーザー向けのシンプルなソリューションを見つけました。基本的には、alvasによる 既存の回答 の要約版ですが、スタンフォードNLPを初めて使用し、Windowユーザーである人のために(できれば)簡単に理解できるようになりました。
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 のソリューションを使用してください。
注:次の答えは上でのみ機能します:
どちらのツールもかなり迅速に変更され、3〜6か月後にAPIの外観が大きく変わる可能性があるためです。次の回答は一時的なものであり、永遠の修正ではありません。
NLTKを使用してスタンフォード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バージョン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')]