Stanford Parser'ı NLTK'da kullanmak mümkün mü? (Stanford POS'tan bahsetmiyorum.)
Stanford Parser'ı NLTK'da kullanmak mümkün mü? (Stanford POS'tan bahsetmiyorum.)
Yanıtlar:
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:
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.
NLTK v3'ü şu adresten indirin: https://github.com/nltk/nltk . Ve NLTK'yi kurun:
sudo python setup.py install
Python kullanarak Stanford Parser'ı edinmek için NLTK indiricisini kullanabilirsiniz:
import nltk
nltk.download()
Örneğimi dene! (jar yollarını değiştirmeyi unutmayın ve model yolunu ser.gz konumuna değiştirin)
VEYA:
Yukarıdakiyle aynı NLTK v3'ü indirin ve kurun.
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
Standford-parser-full-20xx-xx-xx.zip dosyasını çıkarın.
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.
Stanford-parser-3.xx-models.jar dosyasını Arşiv yöneticisi (7zip) kullanarak açın.
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.
Bir StanfordParser örneği oluştururken, model yolunu parametre olarak sağlayabilirsiniz. Bu, /location/of/englishPCFG.ser.gz durumumuzda modele giden tam yoldur.
Örneğimi dene! (jar yollarını değiştirmeyi unutmayın ve model yolunu ser.gz konumuna değiştirin)
nltk.parse.stanford
? Sadece nltk.tag.stanford
NLTK'da var 2.0.4
.
AttributeError: 'StanfordParser' object has no attribute 'raw_batch_parse'
raw_parse_sents()
for line in sentences: for sentence in line: sentence.draw()
Bir Tree nesnesinde yalnızca draw () çalıştırabilirsiniz;)
NLTK official 3rd party tools
dokümantasyondaki talimatları takip etmekle ilgili olarak buradaki tüm yanıtlara sorumluluk reddi beyanları eklemenin en iyisi olduğunu düşündüm .
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 .
Not: Aşağıdaki yanıt yalnızca şu durumlarda işe yarar:
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 !!
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'])])]
Ö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ü , NLTK
Stanford 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_JAR
ve STANFORD_PARSER
değişkenlerinin kullanımdan kaldırıldığını ve ARTIK KULLANILMADIĞINI unutmayın.
İş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 ):
sudo pip install -U nltk
sudo apt-get install python-nltk
Windows için (32 bit ikili kurulumu kullanın):
( Neden 64 bit değil? Bkz. Https://github.com/nltk/nltk/issues/1079 )
Sonra paranoyadan dolayı nltk
sü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)
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:
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 .jar
dosyasını ekleyin CLASSPATH
.
stanford-ner-2015-04-20/stanford-ner.jar
stanford-postagger-full-2015-04-20/stanford-postagger.jar
stanford-parser-full-2015-04-20/stanford-parser.jar
ve ayrıştırıcı modeli jar dosyası,stanford-parser-full-2015-04-20/stanford-parser-3.5.2-models.jar
STANFORD_MODELS
Değişkene uygun model dizinini ekleyin (yani, önceden eğitilmiş modellerin kaydedildiği yeri bulabileceğiniz dizin)
stanford-ner-2015-04-20/classifiers/
stanford-postagger-full-2015-04-20/models/
STANFORD_MODELS
Kodda, 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_JAR
değ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, .jar
dosyayı 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)
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 .
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 .
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
len(i.strip()) > 0
aksi 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ı.
'
, bazı garip hatalar alırsınız. Komut satırında bir şeyler çağırmanın daha iyi yolları var
NLTK v3.3 gibi, kullanıcılar gerektiğini önlemek dan Stanford NER veya POS, etiket oluşturan nltk.tag
ve önlemek gelen Stanford tokenizer / segmentleştiriciyinltk.tokenize
.
Bunun yerine yeni nltk.parse.corenlp.CoreNLPParser
API'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
Hala stanford-corenlp-full-2018-02-27
dizinde, 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')]
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', ['。'])])])]
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')]
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')]
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')]
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')]
list(parser.raw_parse(text))
Veya kullanın list(parser.parse(parser.tokenize(text))
. Örnek düzeltildi;)
Stanford ayrıştırıcısı için python arayüzü var
Stanford Core NLP yazılım sayfasında bir python sarmalayıcı listesi bulunur:
İ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.
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.
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)
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.
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.
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()
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
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())
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 .
Not: Aşağıdaki yanıt yalnızca şu durumlarda işe yarar:
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 !!
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!
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:
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, CLASSPATH
verilen 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)
Bu nedenle hata NLTK
, sağlanan STANFORD_MODELS
ve CLASSPATH
ortam değişkenlerini kullanarak kavanozları nasıl aradığından kaynaklanmaktadır . Bunu çözmek için *-models.jar
, doğru biçimlendirmeye sahip ( NLTK
koddaki 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 StanfordParser
klasik ile python sorunsuz yüklemek için CLASSPATH
bu noktaları için stanford-parser.jar
. Aslında, StanfordParser
hiçbir parametre olmadan arama yapabilirsiniz , varsayılan sadece çalışır.
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')]
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.