Stanford Parser ve NLTK


90

Stanford Parser'ı NLTK'da kullanmak mümkün mü? (Stanford POS'tan bahsetmiyorum.)



3
Bu bağlantının daha görünür olması gerekiyor. Belki de en iyi cevap bundan bahsedecek şekilde düzenlenmeli?
Lalo Sánchez

1
Burada sadece bir ek not çocuklar. Java'nızın Stanford NLP için güncel olduğundan ve JAVA_HOME'un doğru şekilde kurulduğundan emin olun. Bazen insanlar bundan dolayı "tuhaf" hatalar alabilir.
Meng Zhao

Yanıtlar:


90

Bu cevabın NLTK v 3.0 için geçerli olduğunu ve daha yeni sürümler için geçerli olmadığını unutmayın.

Elbette, Python'da şunları deneyin:

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

Çıktı:

[Ağaç ('KÖK', [Ağaç ('S', [Ağaç ('INTJ', [Ağaç ('UH', ['Merhaba'])]), Ağaç (',', [',']), Ağaç ('NP', [Ağaç ('PRP $', ['Benim']), Ağaç ('NN', ['ad'])]), Ağaç ('VP', [Ağaç ('VBZ', [ 'şudur']), Ağaç ('ADJP', [Ağaç ('JJ', ['Melroy'])])), Ağaç ('.', ['.'])])), Ağaç (' KÖK ', [Ağaç (' SBARQ ', [Ağaç (' WHNP ', [Ağaç (' WP ', [' Ne '])]), Ağaç (' SQ ', [Ağaç (' VBZ ', [' eşittir ') ]), Ağaç ('NP', [Ağaç ('PRP $', ['sizin']), Ağaç ('NN', ['ad'])])]), Ağaç ('.', ['? '])])])]

Not 1: Bu örnekte hem ayrıştırıcı hem de model kavanozları aynı klasördedir.

Not 2:

  • Stanford ayrıştırıcısının dosya adı: stanford-parser.jar
  • Stanford modellerinin dosya adı: stanford-parser-xxx-models.jar

Not 3: englishPCFG.ser.gz dosya bulunabilir içinde models.jar dosyası (/edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz). Models.jar dosyasını 'unzip' etmek için lütfen come arşiv yöneticisini kullanın.

Not 4: Oracle JDK 8 olarak da bilinen Java JRE (Runtime Environment) 1.8 kullandığınızdan emin olun . Aksi takdirde şunları elde edersiniz: Desteklenmeyen major.minor sürüm 52.0.

Kurulum

  1. NLTK v3'ü şu adresten indirin: https://github.com/nltk/nltk . Ve NLTK'yi kurun:

    sudo python setup.py install

  2. Python kullanarak Stanford Parser'ı edinmek için NLTK indiricisini kullanabilirsiniz:

    import nltk
    nltk.download()
    
  3. Örneğimi dene! (jar yollarını değiştirmeyi unutmayın ve model yolunu ser.gz konumuna değiştirin)

VEYA:

  1. Yukarıdakiyle aynı NLTK v3'ü indirin ve kurun.

  2. En son sürümü şu adresten indirin ( mevcut sürüm dosya adı stanford-parser-full-2015-01-29.zip): http://nlp.stanford.edu/software/lex-parser.shtml#Download

  3. Standford-parser-full-20xx-xx-xx.zip dosyasını çıkarın.

  4. Yeni bir klasör oluşturun (örneğimde 'kavanozlar'). Çıkarılan dosyaları şu jar klasörüne yerleştirin: stanford-parser-3.xx-models.jar ve stanford-parser.jar.

    Yukarıda gösterildiği gibi, bu 'jars' klasörüne işaret etmek için ortam değişkenlerini (STANFORD_PARSER & STANFORD_MODELS) kullanabilirsiniz. Linux kullanıyorum, bu yüzden Windows kullanıyorsanız lütfen şu gibi bir şey kullanın: C: // klasör // kavanozlar.

  5. Stanford-parser-3.xx-models.jar dosyasını Arşiv yöneticisi (7zip) kullanarak açın.

  6. Jar dosyasının içine göz atın; edu / stanford / nlp / modeller / lexparser. Yine, 'englishPCFG.ser.gz' adlı dosyayı çıkarın. Bu ser.gz dosyasını çıkardığınız yeri unutmayın.

  7. Bir StanfordParser örneği oluştururken, model yolunu parametre olarak sağlayabilirsiniz. Bu, /location/of/englishPCFG.ser.gz durumumuzda modele giden tam yoldur.

  8. Örneğimi dene! (jar yollarını değiştirmeyi unutmayın ve model yolunu ser.gz konumuna değiştirin)


1
Nltk'nin hangi sürümü eklendi nltk.parse.stanford? Sadece nltk.tag.stanfordNLTK'da var 2.0.4.
alexis

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

5
@alexis: nltk 3.0'ı buradan indirin @Nick Retallack: şu şekilde değiştirilmelidirraw_parse_sents()
Rasika Perera

1
Tamam sen haklısın. NLTK işlevi şu şekilde değiştirir: raw_parse_sents (). Belgeleme bakın: nltk.org/_modules/nltk/parse/stanford.html raw_parse () kullanırsanız, dönüş değeri olarak bir iter (Ağaç) alırsınız. Yukarıdaki draw () örneğinin çalışması gerektiği anlamına gelir. Raw_parse_sents () kullanıyorsanız, görünüşe göre çift döngüye ihtiyacınız var; bir yineleme (yineleme (Ağaç)) döndürüyor. Yani kod örneği: for line in sentences: for sentence in line: sentence.draw() Bir Tree nesnesinde yalnızca draw () çalıştırabilirsiniz;)
danger89

1
@ danger89, düzeltilmiş notla cevabınızın üzerine yazdığınız için özür dilerim. Son zamanlarda insanlar Stanford Bağımlılık ayrıştırıcısı hakkında şikayet ediyorlar, ancak yakın zamanda NLTK v3.1'den bu yana eklendi ve bence bazı kod parçacıkları burada ve burada kullanımdan kaldırılan cevaplardan çoğaltılıyor. Bu nedenle, karışıklığı en aza indirmek için, NLTK official 3rd party toolsdokümantasyondaki talimatları takip etmekle ilgili olarak buradaki tüm yanıtlara sorumluluk reddi beyanları eklemenin en iyisi olduğunu düşündüm .
alvas

77

Kullanımdan Kaldırılmış Cevap

Aşağıdaki yanıt kullanımdan kaldırılmıştır, lütfen NLTK v3.3 ve üstü için https://stackoverflow.com/a/51981566/610569 adresindeki çözümü kullanın .


DÜZENLENDİ

Not: Aşağıdaki yanıt yalnızca şu durumlarda işe yarar:

  • NLTK sürümü> = 3.2.4
  • Stanford Tools, 2015-04-20'den beri derlendi
  • Python 2.7, 3.4 ve 3.5 (Python 3.6 henüz resmi olarak desteklenmemektedir)

Her iki araç da oldukça hızlı değiştiğinden ve API 3-6 ay sonra çok farklı görünebilir. Lütfen aşağıdaki yanıtı zamansal olarak ve ebedi bir çözüm olarak ele alın.

NLTK kullanarak Stanford NLP araçlarının nasıl arayüzleneceğine ilişkin en son talimat için her zaman https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software adresine bakın !!


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

Sonra:

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

Uzun olarak:


Öncelikle , Stanford NLP araçlarının Java ile yazıldığı ve NLTK'nın Python ile yazıldığı unutulmamalıdır . NLTK'nın araca arabirim kurma yöntemi, Java aracını komut satırı arabirimi aracılığıyla çağırmaktır.

İkincisi ,NLTK Stanford NLP araçlara API sürümü 3.1 bu yana epey değişti. Bu nedenle, NLTK paketinizi v3.1'e güncellemeniz önerilir.

Üçüncüsü , NLTKStanford NLP Araçlarına yönelik API, ayrı NLP araçlarını sarar, örneğin Stanford POS etiketleyici , Stanford NER Tagger , Stanford Parser .

POS ve NER konu etiketlerinin için, ETMEZ etrafında sarın Stanford Çekirdek NLP paketi .

Stanford Parser için bu, hem Stanford Parser hem de Stanford Core NLP'yi saran özel bir durumdur (kişisel olarak, ikincisini NLTK kullanarak kullanmadım, @ dimazest'in http: //www.eecs'deki gösterisini takip etmeyi tercih ederim. qmul.ac.uk/~dm303/stanford-dependency-parser-nltk-and-anaconda.html )

NLTK v3.1'den itibaren STANFORD_JARve STANFORD_PARSERdeğişkenlerinin kullanımdan kaldırıldığını ve ARTIK KULLANILMADIĞINI unutmayın.


Daha Uzun Sürede:


AŞAMA 1

İşletim sisteminize Java'yı uygun şekilde yüklediğinizi varsayarsak.

Şimdi, NLTK sürümünüzü kurun / güncelleyin (bkz. Http://www.nltk.org/install.html ):

  • Pip kullanarak :sudo pip install -U nltk
  • Debian dağıtımı (apt-get kullanarak):sudo apt-get install python-nltk

Windows için (32 bit ikili kurulumu kullanın):

  1. Python 3.4'ü yükleyin: http://www.python.org/downloads/ (64 bit sürümlerden kaçının)
  2. Numpy'yi kurun (isteğe bağlı): http://sourceforge.net/projects/numpy/files/NumPy/ (pythnon3.4'ü belirten sürüm)
  3. NLTK'yi yükleyin: http://pypi.python.org/pypi/nltk
  4. Test kurulumu: Başlat> Python34, ardından import nltk yazın

( Neden 64 bit değil? Bkz. Https://github.com/nltk/nltk/issues/1079 )


Sonra paranoyadan dolayı nltksürümünüzü python içinde tekrar kontrol edin :

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

Veya komut satırında:

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

3.1Çıktı olarak gördüğünüzden emin olun .

Daha fazla paranoya için, tüm favori Stanford NLP araçları API'nizin mevcut olup olmadığını kontrol edin:

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

( Not : Yukarıdaki içe aktarmalar YALNIZCA bu API'leri içeren doğru bir NLTK sürümünü kullandığınızdan emin olmanızı sağlayacaktır. İçe aktarmada hata görmemek, Stanford Araçlarını kullanmak için NLTK API'yi başarıyla yapılandırdığınız anlamına gelmez)


ADIM 2

Artık gerekli Stanford NLP araçları arayüzünü içeren doğru NLTK sürümüne sahip olduğunuzu kontrol ettiniz. Gerekli tüm Stanford NLP araçlarını indirmeniz ve çıkarmanız gerekir.

TL; DR , Unix'te:

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'te:


AŞAMA 3

Ortam değişkenlerini, NLTK'nin ilgili dosya yolunu otomatik olarak bulabileceği şekilde ayarlayın. Aşağıdaki değişkenleri ayarlamalısınız:

  • Ortam değişkenine uygun Stanford NLP .jardosyasını ekleyin CLASSPATH.

    • örneğin NER için, stanford-ner-2015-04-20/stanford-ner.jar
    • örneğin, POS için, stanford-postagger-full-2015-04-20/stanford-postagger.jar
    • örneğin ayrıştırıcı için, bu olacak stanford-parser-full-2015-04-20/stanford-parser.jarve ayrıştırıcı modeli jar dosyası,stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar
  • STANFORD_MODELSDeğişkene uygun model dizinini ekleyin (yani, önceden eğitilmiş modellerin kaydedildiği yeri bulabileceğiniz dizin)

    • örneğin NER için, içinde olacak stanford-ner-2015-04-20/classifiers/
    • örneğin, POS için, stanford-postagger-full-2015-04-20/models/
    • Örneğin, Ayrıştırıcı için bir model dizini olmayacak.

STANFORD_MODELSKodda, model adını eklemeden önce dizini aradığına bakın . Ayrıca görüyoruz, API ayrıca otomatik olarak işletim sistemi ortamları aramak çalışır `CLASSPATH'e )

NLTK v3.1'den itibaren STANFORD_JARdeğişkenlerin kullanımdan kaldırıldığını ve ARTIK KULLANILMADIĞINI unutmayın . Aşağıdaki Stackoverflow sorularında bulunan kod parçacıkları çalışmayabilir:

TL; Ubuntu'da ADIM 3 için 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 için : Ortam değişkenlerini ayarlama talimatları için https://stackoverflow.com/a/17176423/610569 adresine bakın )

Sen GEREKİR sonra, piton başlamadan önce yukarıdaki gibi değişkenleri ayarlayın:

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

Alternatif olarak, önceki cevapların önerdiği gibi, ortam değişkenlerini python içine eklemeyi deneyebilirsiniz, ancak ayrıştırıcıya / etiketleyiciye, .jardosyayı ve modellerinizi tuttuğunuz doğrudan yolu başlatmasını da söyleyebilirsiniz .

Aşağıdaki yöntemi kullanırsanız ortam değişkenlerini ayarlamanıza gerek YOKTUR ANCAK API parametre adlarını değiştirdiğinde buna göre değiştirmeniz gerekecektir. Bu nedenle, python kodunuzu NLTK sürümüne uyacak şekilde değiştirmekten daha çok ortam değişkenlerini ayarlamanız tavsiye edilir.

Örneğin ( herhangi bir ortam değişkeni ayarlamadan ):

# POS tagging:

from nltk.tag import StanfordPOSTagger

stanford_pos_dir = '/home/alvas/stanford-postagger-full-2015-04-20/'
eng_model_filename= stanford_pos_dir + 'models/english-left3words-distsim.tagger'
my_path_to_jar= stanford_pos_dir + 'stanford-postagger.jar'

st = StanfordPOSTagger(model_filename=eng_model_filename, path_to_jar=my_path_to_jar) 
st.tag('What is the airspeed of an unladen swallow ?'.split())


# NER Tagging:
from nltk.tag import StanfordNERTagger

stanford_ner_dir = '/home/alvas/stanford-ner/'
eng_model_filename= stanford_ner_dir + 'classifiers/english.all.3class.distsim.crf.ser.gz'
my_path_to_jar= stanford_ner_dir + 'stanford-ner.jar'

st = StanfordNERTagger(model_filename=eng_model_filename, path_to_jar=my_path_to_jar) 
st.tag('Rami Eid is studying at Stony Brook University in NY'.split())

# Parsing:
from nltk.parse.stanford import StanfordParser

stanford_parser_dir = '/home/alvas/stanford-parser/'
eng_model_path = stanford_parser_dir  + "edu/stanford/nlp/models/lexparser/englishRNN.ser.gz"
my_path_to_models_jar = stanford_parser_dir  + "stanford-parser-3.5.2-models.jar"
my_path_to_jar = stanford_parser_dir  + "stanford-parser.jar"

parser=StanfordParser(model_path=eng_model_path, path_to_models_jar=my_path_to_models_jar, path_to_jar=my_path_to_jar)

22

Kullanımdan Kaldırılmış Cevap

Aşağıdaki yanıt kullanımdan kaldırılmıştır, lütfen NLTK v3.3 ve üstü için https://stackoverflow.com/a/51981566/610569 adresindeki çözümü kullanın .


Düzenlendi

Mevcut Stanford ayrıştırıcısından (2015-04-20) itibaren, varsayılan çıktı lexparser.sh değiştiğinden aşağıdaki komut dosyası çalışmayacaktır.

Ancak bu cevap eski bir hatıra için saklanır, yine de http://nlp.stanford.edu/software/stanford-parser-2012-11-12.zip ile çalışacaktır .


Orijinal Cevap

Jython, JPype ile uğraşmamanı öneririm. Bırakın python python işi yapsın ve java java işini yapsın, konsol aracılığıyla Stanford Parser çıktısını alsın.

Stanford Parser'ı ana dizininize yükledikten sonra ~/, düz parantezli ayrıştırmayı elde etmek için bu python tarifini kullanın:

import os
sentence = "this is a foo bar i want to parse."

os.popen("echo '"+sentence+"' > ~/stanfordtemp.txt")
parser_out = os.popen("~/stanford-parser-2012-11-12/lexparser.sh ~/stanfordtemp.txt").readlines()

bracketed_parse = " ".join( [i.strip() for i in parser_out if i.strip()[0] == "("] )
print bracketed_parse

1
Bu benim için çalıştı, ancak kontrol etmek için bir koşul eklemem gerekmedi, len(i.strip()) > 0aksi takdirde bir dizin hatası aldım. Sanırım ayrıştırıcı çıktımda tamamen boşluk olan en az bir satır vardı.
aelfric5578

1
alternatif olarak, odtü corenlp araçlar için de bu piton sarıcı kullanır bitbucket.org/torotoki/corenlp-python
alvas

3
Buna dikkat et. Girişiniz herhangi bir URL içeriyorsa ', bazı garip hatalar alırsınız. Komut satırında bir şeyler çağırmanın daha iyi yolları var
Nick Garvey

22

NLTK v3.3 gibi, kullanıcılar gerektiğini önlemek dan Stanford NER veya POS, etiket oluşturan nltk.tagve önlemek gelen Stanford tokenizer / segmentleştiriciyinltk.tokenize .

Bunun yerine yeni nltk.parse.corenlp.CoreNLPParserAPI'yi kullanın .

Lütfen https://github.com/nltk/nltk/wiki/Stanford-CoreNLP-API-in-NLTK adresine bakın


(Yalnızca bağlantı yanıtından kaçınarak, aşağıdaki NLTK github wiki'deki belgeleri yapıştırdım)

Öncelikle NLTK'nızı güncelleyin

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

Ardından gerekli CoreNLP paketlerini indirin:

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 

ingilizce

Hala stanford-corenlp-full-2018-02-27dizinde, sunucuyu başlatın:

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

Sonra Python'da:

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

Çince

Sunucuyu hala `stanford-corenlp-full-2018-02-27 dizininden biraz farklı başlatın:

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'da:

>>> 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', ['。'])])])]

Arapça

Sunucuyu başlatın:

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'da:

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

Fransızca

Sunucuyu başlatın:

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'da:

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

Almanca

Sunucuyu başlatın:

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'da:

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

İspanyol

Sunucuyu başlatın:

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'da:

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

Mükemmel cevap. Teşekkür ederim
Eben

Teşekkürler, bu çok faydalı. Yine de arapça ayrıştırma doğru değil. Metni kelimeler yerine harflere
ayırıyor

list(parser.raw_parse(text))Veya kullanın list(parser.parse(parser.tokenize(text)). Örnek düzeltildi;)
alvas

1
Bunun daha fazla reklamı olmadığına inanamıyorum!
Nimitz14

1
Ne yazık ki, NLTK'nın görüşme yapmak veya aracı tanıtmak için şık bir geliştirici konferansına ev sahipliği yapmak için yeterli kaynağa sahip olması için yeterli sayıda insan yok = (Bu özelliği veya NLTK'yi çevrenizdeki topluluğa tanıtmaktan çekinmeyin.
alvas



6

İyi hatırlıyorsam, Stanford ayrıştırıcısı bir java kitaplığıdır, bu nedenle sunucunuzda / bilgisayarınızda çalışan bir Java yorumlayıcınızın olması gerekir.

Bir kez bir sunucuda, bir php komut dosyasıyla birlikte kullandım. Betik, ayrıştırıcıya şu şekilde bir komut satırı çağrısı yapmak için php'nin exec () işlevini kullandı:

<?php

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

?>

Bu komutun tüm ayrıntılarını hatırlamıyorum, temelde fileToParse'ı açtı, ayrıştırdı ve çıktıyı resultFile'a yazdı. PHP daha sonra sonuç dosyasını daha fazla kullanmak için açar.

Komutun sonu, gereksiz komut satırı bilgilerinin betiği bozmasını önlemek için ayrıştırıcının ayrıntılarını NULL'a yönlendirir.

Python hakkında pek bir şey bilmiyorum ama komut satırı aramaları yapmanın bir yolu olabilir.

Umduğunuz kesin rota olmayabilir, ancak umarım size biraz ilham verir. İyi şanslar.


6

Bu cevabın NLTK v 3.0 için geçerli olduğunu ve daha yeni sürümler için geçerli olmadığını unutmayın.

Burada, windoze üzerinde nltk3.0.0 ve muhtemelen diğer platformlarda da çalışan tehlike98 kodunun bir uyarlaması var, dizin adlarını kurulumunuza uygun şekilde ayarlayın:

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

Ayrıştırma komutunun değiştiğini (www.nltk.org/_modules/nltk/parse/stanford.html adresindeki kaynak koduna bakın) ve JAVAHOME değişkenini tanımlamanız gerektiğini unutmayın. Dilbilgisi dosyasını kavanozun içinde yerinde okumaya çalıştım, ancak şimdiye kadar bunu başaramadım.


Ben 1989'dan 98 değil, örnek için teşekkürler;)
tehlike89

4

Nltk (nltk.tree.Tree) 'de bir Ağaç oluşturmak için Stanford Parsers çıktısını kullanabilirsiniz.

Stanford ayrıştırıcısının size her cümle için tam olarak bir ayrıştırma ağacının bulunduğu bir dosya verdiğini varsayarsak. O zaman bu örnek işe yarıyor, ancak çok pitonik görünmese de:

f = open(sys.argv[1]+".output"+".30"+".stp", "r")
parse_trees_text=[]
tree = ""
for line in f:
  if line.isspace():
    parse_trees_text.append(tree)
tree = ""
  elif "(. ...))" in line:
#print "YES"
tree = tree+')'
parse_trees_text.append(tree)
tree = ""
  else:
tree = tree + line

parse_trees=[]
for t in parse_trees_text:
  tree = nltk.Tree(t)
  tree.__delitem__(len(tree)-1) #delete "(. .))" from tree (you don't need that)
  s = traverse(tree)
  parse_trees.append(tree)

1
Java'nın java, python'un da python işi yapmasına izin vermek için +1. Java komutunu nasıl çağırdığınıza ve hangi seçeneklere bağlı olarak, çıktı dosyasını stanford ayrıştırıcısından ayrıştırmak farklı olabilir. Çıktı dosyanızı almak için Stanford Parse'ı nasıl çağırdığınızla ilgili ayrıntıları da eklemeniz iyi olur.
alvas

4

Bu cevabın NLTK v 3.0 için geçerli olduğunu ve daha yeni sürümler için geçerli olmadığını unutmayın.

Hiç kimse gerçekten bahsetmediğinden ve bir şekilde beni çok rahatsız ettiğinden, Stanford ayrıştırıcısını python'da kullanmanın alternatif bir yolu:

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)

bu şekilde, artık yol meselesi için endişelenmenize gerek yok.

Ubuntu'da düzgün kullanamayan veya kodu Eclipse'de çalıştıramayanlar için.


3

Ben bir Windows makinesindeyim ve ayrıştırıcıyı komuttan yaptığınız gibi normal olarak çalıştırabilirsiniz, ancak farklı bir dizinde olduğu gibi lexparser.bat dosyasını düzenlemenize gerek kalmaz. Sadece tam yolu koyun.

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

Benim için zor olan, bir java programını farklı bir yoldan nasıl çalıştıracağımı fark etmekti. Daha iyi bir yol olmalı ama bu işe yarıyor.


3

Bu cevabın NLTK v 3.0 için geçerli olduğunu ve daha yeni sürümler için geçerli olmadığını unutmayın.

Tehlike89'un Stanford Parser'ı NLTK ve Python'da kullanma konusundaki kapsamlı cevabına ilişkin küçük bir güncelleme (veya basitçe alternatif)

Stanford-parser-full-2015-04-20, JRE 1.8 ve nltk 3.0.4 (python 2.7.6) ile, artık englishPCFG.ser.gz dosyasını stanford-parser-xxx-modellerinden çıkarmanıza gerek olmadığı görülüyor .jar veya herhangi bir os.environ kurulumu

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

Bu cevabın NLTK v 3.0 için geçerli olduğunu ve daha yeni sürümler için geçerli olmadığını unutmayın.

İşte alvas'ın cevabının Windows versiyonu

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)

NOTLAR:

  • Gelen lexparser.bat aşağıdakiler gibi önlemek java hatalarına mutlak yoluna bütün yollarını değiştirmek gerekiyor "sınıfı bulunamadı"

  • Sayfada birkaç cevap denediğim ve tüm yöntemler python ile Java iletişim kurmadığı için bu yöntemi Windows altında uygulamanızı şiddetle tavsiye ederim.

  • pencerelerde başarılı olursanız sizden haber almak ve tüm bu sorunları nasıl aştığınızı bana anlatabilmenizi diliyorum.

  • python sürümünü almak için stanford coreNLP için python sarmalayıcısı arayın



2

Saatlerimi aldım ve sonunda Windows kullanıcıları için basit bir çözüm buldum. Temelde, alvas tarafından mevcut bir cevabın özetlenmiş versiyonu , ancak stanford NLP'de yeni olan ve Window kullanıcıları için takip edilmesi (umarız) kolaylaştı.

1) NER, POS vb. Gibi kullanmak istediğiniz modülü indirin. Benim durumumda NER kullanmak istedim, bu yüzden modülü http://nlp.stanford.edu/software/stanford-ner-2015- adresinden indirdim. 04-20.zip

2) Dosyayı açın.

3) Açılmış klasörden ortam değişkenlerini (sınıf yolu ve stanford_modules ) ayarlayın.

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'nın kurulu olduğu yerde olduğu gibi JAVA için ortam değişkenlerini ayarlayın. benim için aşağıdaydı

os.environ['JAVAHOME'] = "C:/Program Files/Java/jdk1.8.0_102/bin/java.exe"

5) istediğiniz modülü içe aktarın

from nltk.tag import StanfordNERTagger

6) sıkıştırılmamış klasördeki sınıflandırıcı klasöründe bulunan önceden eğitilmiş modeli çağırın. Dosya uzantısı için sonuna ".gz" ekleyin. benim için kullanmak istediğim modelenglish.all.3class.distsim.crf.ser

st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz')

7) Şimdi ayrıştırıcıyı çalıştırın !! ve bitirdik !!

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


2

Kullanımdan Kaldırılmış Cevap

Aşağıdaki yanıt kullanımdan kaldırılmıştır, lütfen NLTK v3.3 ve üstü için https://stackoverflow.com/a/51981566/610569 adresindeki çözümü kullanın .


DÜZENLENDİ

Not: Aşağıdaki yanıt yalnızca şu durumlarda işe yarar:

  • NLTK sürümü == 3.2.5
  • Stanford Tools 2016-10-31'den beri derlendi
  • Python 2.7, 3.5 ve 3.6

Her iki araç da oldukça hızlı değiştiğinden ve API 3-6 ay sonra çok farklı görünebilir. Lütfen aşağıdaki yanıtı zamansal olarak ve ebedi bir çözüm olarak ele alın.

NLTK kullanarak Stanford NLP araçlarının nasıl arayüzleneceğine ilişkin en son talimat için her zaman https://github.com/nltk/nltk/wiki/Installing-Third-Party-Software adresine bakın !!

TL; DR

Takip kodu https://github.com/nltk/nltk/pull/1735#issuecomment-306091826 adresinden gelir

Terminalde:

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'da:

>>> 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 hakkında daha fazla bilgi için lütfen http://www.nltk.org/_modules/nltk/parse/corenlp.html adresine bakın. Dokümanlara bir göz atın!


2

Bu cevabın NLTK v 3.0 için geçerli olduğunu ve daha yeni sürümler için geçerli olmadığını unutmayın.

Bunu itibarım nedeniyle bir yorum olarak bırakamam, ancak bunu çözmek için biraz zaman harcadığımdan (boşa harcandığım için?) Bu ayrıştırıcının NLTK'da çalışmasını sağlamak için sorunumu / çözümümü paylaşmayı tercih ederim.

Gelen mükemmel alvas gelen cevap , şu ifadeye yer verilmiştir:

Örneğin, Ayrıştırıcı için bir model dizini olmayacak.

Bu beni yanlış bir şekilde şunlara yönlendirdi:

  • koyduğum değere dikkat etme STANFORD_MODELS (ve sadece benimCLASSPATH )
  • ../path/tostanford-parser-full-2015-2012-09/models directory* neredeyse boş * bırakın (veya adı nltk regex ile eşleşmeyen bir jar dosyasıyla)!

OP, benim gibi, sadece ayrıştırıcıyı kullanmak istediyse, başka bir şey indirmediğimizde (POStagger yok, NER yok, ...) ve tüm bu talimatları izlediğimizde, yine de bir hata almamız kafa karıştırıcı olabilir.

Sonunda, CLASSPATHverilen herhangi biri için (bu konudaki yanıtlarda aşağıdaki örnekler ve açıklamalar) yine de hatayı alacağım:

NLTK, stanford-ayrıştırıcı - (\ d +) (. (\ D +)) + - models.jar bulamadı! CLASSPATH ortam değişkenini ayarlayın. Stanford-parser - (\ d +) (. (\ D +)) + - models.jar hakkında daha fazla bilgi için,

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

VEYA:

NLTK, stanford-parser.jar dosyasını bulamadı! CLASSPATH ortam değişkenini ayarlayın. Stanford-parser.jar hakkında daha fazla bilgi için bkz: http://nlp.stanford.edu/software/lex-parser.shtml

Yine de , en önemlisi, işlevi tüm bağımsız değişkenler ve yol tam olarak belirtilmiş olarak çağırırsam, aşağıdaki gibi doğru bir şekilde yükleyebilir ve kullanabilirim:

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)

Yalnızca Ayrıştırıcı için Çözüm:

Bu nedenle hata NLTK, sağlanan STANFORD_MODELSve CLASSPATHortam değişkenlerini kullanarak kavanozları nasıl aradığından kaynaklanmaktadır . Bunu çözmek için *-models.jar, doğru biçimlendirmeye sahip ( NLTKkoddaki normal ifadeyle eşleşecek, yani -corenlp -.... jar yok) ile belirtilen klasörde bulunmalıdır STANFORD_MODELS.

Yani ilk olarak şunu yarattım:

mkdir stanford-parser-full-2015-12-09/models

Sonra eklendi .bashrc:

export STANFORD_MODELS=/path/to/stanford-parser-full-2015-12-09/models

Ve son olarak, kopyalayarak stanford-parser-3.6.0-models.jar(veya ilgili sürümü) şuraya kopyalayarak :

path/to/stanford-parser-full-2015-12-09/models/

Ben alabilir StanfordParserklasik ile python sorunsuz yüklemek için CLASSPATHbu noktaları için stanford-parser.jar. Aslında, StanfordParserhiçbir parametre olmadan arama yapabilirsiniz , varsayılan sadece çalışır.


2

Nltk 3.2.4 sürümünü kullanıyorum. Ve aşağıdaki kod benim için çalıştı.

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)

Çıktı:

[('Open', 'VB'), ('app', 'NN'), ('and', 'CC'), ('play', 'VB'), ('movie', 'NN')]

Sanırım bu etiketleyici, ayrıştırıcı değil
Nadav B

1

Tensorflow kullanılarak eğitilmiş bir nöral modele dayalı yeni bir Stanford ayrıştırıcısı geliştirmesi, çok yakın zamanda bir python API olarak kullanılmak üzere kullanıma sunulmuştur. Bu modelin Java tabanlı moelden çok daha doğru olduğu varsayılıyor. Kesinlikle bir NLTK ardışık düzeni ile entegre edebilirsiniz.

Bağlantı ayrıştırıcı. Depo, 53 dil için önceden eğitilmiş ayrıştırıcı modelleri içerir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.