[python] 스탠포드 파서 및 NLTK

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:

  • 스탠포드 파서의 파일 이름 : stanford-parser.jar
  • 스탠포드 모델의 파일 ​​이름 : stanford-parser-xxx-models.jar

주 3 :
englishPCFG.ser.gz 파일을 찾을 수 있습니다 내부 models.jar 파일 (/edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz). 아카이브 관리자를 사용하여 models.jar 파일을 ‘압축 해제’하십시오.

참고 4 : Oracle JDK 8이라고도
하는 Java JRE (런타임 환경) 1.8을 사용하고 있는지 확인하십시오 . 그렇지 않으면 다음이 표시됩니다. Unsupported major.minor version 52.0.

설치

  1. https://github.com/nltk/nltk 에서 NLTK v3를 다운로드합니다 . 그리고 NLTK를 설치합니다.

    sudo python setup.py 설치

  2. NLTK 다운로더를 사용하여 Python을 사용하여 Stanford Parser를 가져올 수 있습니다.

    import nltk
    nltk.download()
  3. 내 예를 들어보세요! (jar 경로를 변경하고 모델 경로를 ser.gz 위치로 변경하는 것을 잊지 마십시오)

또는:

  1. 위와 동일하게 NLTK v3를 다운로드하여 설치합니다.

  2. 최신 버전을 다운로드합니다 ( 현재 버전 파일 이름은 stanford-parser-full-2015-01-29.zip) :
    http://nlp.stanford.edu/software/lex-parser.shtml#Download

  3. standford-parser-full-20xx-xx-xx.zip을 추출합니다.

  4. 새 폴더를 만듭니다 (예에서는 ‘jars’). 추출 된 파일을이 jar 폴더 (stanford-parser-3.xx-models.jar 및 stanford-parser.jar)에 배치하십시오.

    위에 표시된대로 환경 변수 (STANFORD_PARSER 및 STANFORD_MODELS)를 사용하여이 ‘jars’폴더를 가리킬 수 있습니다. 저는 Linux를 사용하고 있으므로 Windows를 사용하는 경우 C : // folder // jars와 같은 것을 사용하십시오.

  5. 아카이브 관리자 (7zip)를 사용하여 stanford-parser-3.xx-models.jar을 엽니 다.

  6. jar 파일 내부를 찾습니다. edu / stanford / nlp / models / lexparser. 다시 ‘englishPCFG.ser.gz’라는 파일의 압축을 풉니 다. 이 ser.gz 파일을 추출한 위치를 기억하십시오.

  7. StanfordParser 인스턴스를 생성 할 때 모델 경로를 매개 변수로 제공 할 수 있습니다. 이것은 모델에 대한 전체 경로입니다 (예 : /location/of/englishPCFG.ser.gz).

  8. 내 예를 들어보세요! (jar 경로를 변경하고 모델 경로를 ser.gz 위치로 변경하는 것을 잊지 마십시오)


답변

사용되지 않는 답변

아래 답변은 더 이상 사용되지 않습니다 . NLTK v3.3 이상의 경우 https://stackoverflow.com/a/51981566/610569 의 솔루션을 사용하십시오 .


편집 됨

참고 : 다음 답변은 다음에서만 작동합니다.

  • NLTK 버전> = 3.2.4
  • 2015-04-20 이후로 컴파일 된 Stanford Tools
  • Python 2.7, 3.4 및 3.5 (Python 3.6은 아직 공식적으로 지원되지 않음)

두 도구 모두 빠르게 변경되고 3 ~ 6 개월 후에 API가 매우 다르게 보일 수 있습니다. 다음 답변을 영원한 수정이 아닌 일시적인 것으로 취급하십시오.

NLTK를 사용하여 Stanford NLP 도구를 인터페이스하는 방법에 대한 최신 지침은 항상 https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software 를 참조하십시오 !!


TL; DR

cd $HOME

# Update / Install NLTK
pip install -U nltk

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


export STANFORDTOOLSDIR=$HOME

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

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

그때:

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

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


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

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

롱에서 :

첫째 , Stanford NLP 도구는 Java로 작성 되고 NLTK는 Python으로 작성 된다는 점에 유의해야합니다 . NLTK가 도구와 인터페이스하는 방식은 명령 줄 인터페이스를 통해 Java 도구를 호출하는 것입니다.

둘째 , NLTKStanford NLP 도구에 대한 API는 버전 3.1 이후로 많이 변경되었습니다. 따라서 NLTK 패키지를 v3.1로 업데이트하는 것이 좋습니다.

셋째 , NLTKStanford NLP Tools에 대한 API는 Stanford POS tagger , Stanford NER Tagger , Stanford Parser 와 같은 개별 NLP 도구를 래핑합니다 .

POS 및 NER 태거의 경우 Stanford Core NLP 패키지를 감싸지 않습니다 .

Stanford Parser의 경우 Stanford Parser와 Stanford Core NLP를 모두 감싸는 특수한 경우입니다 (개인적으로 NLTK를 사용하여 후자를 사용하지 않았으므로 http : //www.eecs 에서 @dimazest의 데모를 따르 겠습니다. qmul.ac.uk/~dm303/stanford-dependency-parser-nltk-and-anaconda.html )

NLTK v3.1부터 STANFORD_JARSTANFORD_PARSER변수는 더 이상 사용되지 않으며 더 이상 사용되지 않습니다.


더 오래 :

1 단계

OS에 Java를 적절하게 설치했다고 가정합니다.

이제 NLTK 버전을 설치 / 업데이트합니다 ( http://www.nltk.org/install.html 참조 ).

  • pip 사용 :sudo pip install -U nltk
  • 데비안 배포판 (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를 )


그런 다음 편집증에서 nltk파이썬 내에서 버전을 다시 확인하십시오 .

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

또는 명령 줄에서 :

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

3.1출력으로 보이는지 확인하십시오 .

더 많은 편집증에 대해서는 좋아하는 모든 Stanford NLP 도구 API를 사용할 수 있는지 확인하십시오.

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

( 참고 : 위의 수입이됩니다 . 당신은 이러한 API를 포함하는 올바른 NLTK 버전을 사용하고 있는지 확인 가져 오기에 오류를보고하지 성공적 스탠포드 도구를 사용하는 NLTK API를 구성했는지하지 의미합니까)


2 단계

이제 필요한 Stanford NLP 도구 인터페이스를 포함하는 올바른 버전의 NLTK가 있는지 확인했습니다. 필요한 모든 Stanford NLP 도구를 다운로드하고 추출해야합니다.

TL; DR , Unix :

cd $HOME

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

Windows / Mac :


3 단계

NLTK가 관련 파일 경로를 자동으로 찾을 수 있도록 환경 변수를 설정합니다. 다음 변수를 설정해야합니다.

  • 적절한 Stanford NLP .jar파일을 CLASSPATH환경 변수에 추가하십시오 .

    • 예를 들어 NER의 경우 stanford-ner-2015-04-20/stanford-ner.jar
    • 예를 들어 POS의 경우 stanford-postagger-full-2015-04-20/stanford-postagger.jar
    • 예를 들어 파서의 stanford-parser-full-2015-04-20/stanford-parser.jar경우 파서 모델 jar 파일이됩니다.stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar
  • STANFORD_MODELS변수에 적절한 모델 디렉토리를 추가합니다 (예 : 사전 훈련 된 모델이 저장된 위치를 찾을 수있는 디렉토리).

    • 예를 들어 NER의 경우 stanford-ner-2015-04-20/classifiers/
    • 예를 들어 POS의 경우 stanford-postagger-full-2015-04-20/models/
    • 예를 들어 파서의 경우 모델 디렉토리가 없습니다.

코드 STANFORD_MODELS에서 모델 이름을 추가하기 전에 디렉토리를 검색하는지 확인하십시오 . 또한 API는 자동으로 `CLASSPATH )에 대한 OS 환경 검색을 시도합니다.

NLTK v3.1부터는 STANFORD_JAR변수가 더 이상 사용되지 않으며 더 이상 사용되지 않습니다 . 다음 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 참조 )

당신은 해야 다음, 파이썬을 시작하기 전에 위와 같이 변수를 설정 :

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


답변

사용되지 않는 답변

아래 답변은 더 이상 사용되지 않습니다 . NLTK v3.3 이상의 경우 https://stackoverflow.com/a/51981566/610569 의 솔루션을 사용하십시오 .


수정 됨

현재 Stanford 파서 (2015-04-20)부터의 기본 출력 lexparser.sh이 변경되어 아래 스크립트가 작동하지 않습니다.

그러나이 답변은 레거시를 위해 유지 되지만 http://nlp.stanford.edu/software/stanford-parser-2012-11-12.zip 에서는 여전히 작동 합니다.


원래 답변

나는 당신이 Jython, JPype를 엉망으로 만들지 말 것을 제안합니다. 파이썬은 파이썬 작업을하고 자바는 자바 작업을하게하고 콘솔을 통해 스탠포드 파서 출력을 얻습니다.

홈 디렉토리에 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로, 사용자는해야 하지 않도록 에서 스탠포드 NER 또는 POS 태거를 nltk.tag하고, 에서 스탠포드 토크 나이 / 분할기를 nltk.tokenize.

대신 새 nltk.parse.corenlp.CoreNLPParserAPI를 사용하십시오 .

https://github.com/nltk/nltk/wiki/Stanford-CoreNLP-API-in-NLTK를 참조 하십시오.


(링크 전용 답변을 피하고 아래 NLTK github wiki의 문서를 붙여 넣었습니다)

먼저 NLTK를 업데이트하십시오.

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

그런 다음 필요한 CoreNLP 패키지를 다운로드합니다.

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

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

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

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

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


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

영어

여전히 stanford-corenlp-full-2018-02-27디렉토리에서 서버를 시작하십시오.

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

그런 다음 Python에서 :

>>> from nltk.parse import CoreNLPParser

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

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

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

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


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

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

# NER Tagger
>>> ner_tagger = CoreNLPParser(url='http://localhost:9000', tagtype='ner')
>>> list(ner_tagger.tag(('Rami Eid is studying at Stony Brook University in NY'.split())))
[('Rami', 'PERSON'), ('Eid', 'PERSON'), ('is', 'O'), ('studying', 'O'), ('at', 'O'), ('Stony', 'ORGANIZATION'), ('Brook', 'ORGANIZATION'), ('University', 'ORGANIZATION'), ('in', 'O'), ('NY', 'STATE_OR_PROVINCE')]

중국말

`stanford-corenlp-full-2018-02-27 디렉토리에서 조금 다르게 서버를 시작합니다.

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

Python에서 :

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

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

아라비아 말

서버를 시작하십시오.

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

Python에서 :

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

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

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

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


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

프랑스 국민

서버를 시작하십시오.

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

Python에서 :

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

독일 사람

서버를 시작하십시오.

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

Python에서 :

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


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

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

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

스페인의

서버를 시작하십시오.

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

Python에서 :

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


답변

스탠포드 파서 용 파이썬 인터페이스가 있습니다.

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


답변

Stanford Core NLP 소프트웨어 페이지에는 Python 래퍼 목록이 있습니다.

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


답변

내가 잘 기억한다면 Stanford 파서는 자바 라이브러리이므로 서버 / 컴퓨터에서 자바 인터프리터를 실행해야합니다.

한 번 서버로 사용하고 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에 대해 잘 모르지만 명령 줄 호출을 수행하는 방법이있을 수 있습니다.

당신이 원했던 정확한 경로가 아닐 수도 있지만, 그것이 당신에게 영감을 줄 수 있기를 바랍니다. 행운을 빕니다.