web-dev-qa-db-ja.com

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

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

85
ThanaDaray

この回答は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-x.x.x-models.jar

注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としても知られています。

Installation

  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の場所に変更することを忘れないでください)

OR:

  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.x.x-models.jarおよびstanford-parser.jar。

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

  5. アーカイブマネージャー(7Zip)を使用してstanford-parser-3.x.x-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の場所に変更することを忘れないでください)

85
danger89

非推奨の回答

以下の回答は非推奨です。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はまだ正式にサポートされていません)

どちらのツールもかなり迅速に変更され、3〜6か月後にAPIの外観が大きく変わる可能性があるためです。次の回答は一時的なものであり、永遠の修正ではありません。

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


TL; DR

cd $HOME

# Update / Install NLTK
pip install -U nltk

# Download the Stanford NLP tools
wget http://nlp.stanford.edu/software/stanford-ner-2015-04-20.Zip
wget http://nlp.stanford.edu/software/stanford-postagger-full-2015-04-20.Zip
wget http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.Zip
# Extract the Zip file.
unzip stanford-ner-2015-04-20.Zip 
unzip stanford-parser-full-2015-04-20.Zip 
unzip stanford-postagger-full-2015-04-20.Zip


export STANFORDTOOLSDIR=$HOME

export CLASSPATH=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/stanford-postagger.jar:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/stanford-ner.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser.jar:$STANFORDTOOLSDIR/stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar

export STANFORD_MODELS=$STANFORDTOOLSDIR/stanford-postagger-full-2015-04-20/models:$STANFORDTOOLSDIR/stanford-ner-2015-04-20/classifiers

次に:

>>> from nltk.tag.stanford import StanfordPOSTagger
>>> st = StanfordPOSTagger('english-bidirectional-distsim.tagger')
>>> st.tag('What is the airspeed of an unladen swallow ?'.split())
[(u'What', u'WP'), (u'is', u'VBZ'), (u'the', u'DT'), (u'airspeed', u'NN'), (u'of', u'IN'), (u'an', u'DT'), (u'unladen', u'JJ'), (u'swallow', u'VB'), (u'?', u'.')]

>>> from nltk.tag import StanfordNERTagger
>>> st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz') 
>>> st.tag('Rami Eid is studying at Stony Brook University in NY'.split())
[(u'Rami', u'PERSON'), (u'Eid', u'PERSON'), (u'is', u'O'), (u'studying', u'O'), (u'at', u'O'), (u'Stony', u'ORGANIZATION'), (u'Brook', u'ORGANIZATION'), (u'University', u'ORGANIZATION'), (u'in', u'O'), (u'NY', u'O')]


>>> from nltk.parse.stanford import StanfordParser
>>> parser=StanfordParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")
>>> list(parser.raw_parse("the quick brown fox jumps over the lazy dog"))
[Tree('ROOT', [Tree('NP', [Tree('NP', [Tree('DT', ['the']), Tree('JJ', ['quick']), Tree('JJ', ['brown']), Tree('NN', ['fox'])]), Tree('NP', [Tree('NP', [Tree('NNS', ['jumps'])]), Tree('PP', [Tree('IN', ['over']), Tree('NP', [Tree('DT', ['the']), Tree('JJ', ['lazy']), Tree('NN', ['dog'])])])])])])]

>>> from nltk.parse.stanford import StanfordDependencyParser
>>> dep_parser=StanfordDependencyParser(model_path="edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz")
>>> print [parse.tree() for parse in dep_parser.raw_parse("The quick brown fox jumps over the lazy dog.")]
[Tree('jumps', [Tree('fox', ['The', 'quick', 'brown']), Tree('dog', ['over', 'the', 'lazy'])])]

長い:


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

二番目に、Stanford NLPツールへのNLTK AP​​Iは、バージョン3.1からかなり変更されました。したがって、NLTKパッケージをv3.1に更新することをお勧めします。

第三に、Stanford NLP ToolsへのNLTK AP​​Iは、個々のNLPツールをラップします。 Stanford POS taggerStanford NER TaggerStanford Parser

POSおよびNERタガーの場合、DOES NOTStanford 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変数は非推奨となり、使用されなくなったことに注意してください


より長い:


ステップ1

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

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

  • pipを使用:Sudo pip install -U nltk
  • Debian distro(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. テストインストール:[スタート]> [Python34]を選択し、import nltkと入力します

64ビットではない理由https://github.com/nltk/nltk/issues/1079 を参照)


次に、パラノイアから、Python内のnltkバージョンを再確認します。

from __future__ import print_function
import nltk
print(nltk.__version__)

または、コマンドラインで:

python3 -c "import nltk; print(nltk.__version__)"

3.1が出力として表示されていることを確認してください。

さらにパラノイアについては、お気に入りのスタンフォードNLPツールAPIがすべて利用可能であることを確認してください。

from nltk.parse.stanford import StanfordParser
from nltk.parse.stanford import StanfordDependencyParser
from nltk.parse.stanford import StanfordNeuralDependencyParser
from nltk.tag.stanford import StanfordPOSTagger, StanfordNERTagger
from nltk.tokenize.stanford import StanfordTokenizer

:上記のインポートはのみであることを保証しますこれらのAPIを含む正しいNLTKバージョンを使用します。インポートでエラーが表示されないということは、スタンフォードツールを使用するようにNLTK APIを正常に構成したという意味ではありません)


ステップ2

これで、必要なスタンフォードNLPツールインターフェイスを含むNLTKの正しいバージョンがあることを確認しました。必要なすべてのスタンフォードNLPツールをダウンロードして抽出する必要があります。

TL; DR、Unixの場合:

cd $HOME

# Download the Stanford NLP tools
wget http://nlp.stanford.edu/software/stanford-ner-2015-04-20.Zip
wget http://nlp.stanford.edu/software/stanford-postagger-full-2015-04-20.Zip
wget http://nlp.stanford.edu/software/stanford-parser-full-2015-04-20.Zip
# Extract the Zip file.
unzip stanford-ner-2015-04-20.Zip 
unzip stanford-parser-full-2015-04-20.Zip 
unzip stanford-postagger-full-2015-04-20.Zip

Windows/Macの場合:


ステップ3

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は `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)
77
alvas

非推奨の回答

以下の回答は非推奨です。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
22
alvas

NLTK v3.3の時点で、ユーザーはavoidnltk.tagからのStanford NERまたはPOSタガー、およびavoidnltk.tokenizeのスタンフォードトークナイザー/セグメンター。

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

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

Stanford Core NLPソフトウェアページには、pythonラッパーのリストがあります。

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

7
silverasm

スタンフォードパーサー用のpythonインターフェイスがあります

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

7
Rohith

よく覚えていれば、スタンフォードパーサーは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
bob dope

この回答は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内のその場で文法ファイルを読み取ろうとしましたが、今のところそれを実行できませんでした。

6
Avery Andrews

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)
4
Sadik

この回答は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でコードを実行できない場合。

4
Zhong Zhu

私は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
Ted Petrou

この回答は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()
3
SYK

この回答は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のラッパーを検索します


3
redreamality

この回答は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を呼び出すことができ、デフォルトが機能します。

2
H. Rev.

私は何時間もかけて、ついに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())
2
Enthusiast

非推奨の回答

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


編集済み

注:次の答えは上でのみ機能します:

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

どちらのツールもかなり迅速に変更され、3〜6か月後にAPIの外観が大きく変わる可能性があるためです。次の回答は一時的なものであり、永遠の修正ではありません。

NLTKを使用してスタンフォード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
alvas

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