Stanford NER tagger'ı çalıştırmak için hem python hem de java kullanıyorum ama sonuçlardaki farkı görüyorum. ÖrneğinStanford NER tagger NLTK sonucu (python) vs JAVA
, ne zaman girdi "Bunun için birincil yazılım olarak Erwin kullanarak veri modelleme her alanında ilgilendim." cümlesini,
JAVA Sonucu:
"ERwin": "PERSON"
Python Sonucu:
In [6]: NERTagger.tag("Involved in all aspects of data modeling using ERwin as the primary software for this.".split())
Out [6]:[(u'Involved', u'O'),
(u'in', u'O'),
(u'all', u'O'),
(u'aspects', u'O'),
(u'of', u'O'),
(u'data', u'O'),
(u'modeling', u'O'),
(u'using', u'O'),
(u'ERwin', u'O'),
(u'as', u'O'),
(u'the', u'O'),
(u'primary', u'O'),
(u'software', u'O'),
(u'for', u'O'),
(u'this.', u'O')]
Python nltk sarıcı, "ERwin" özelliğini PERSON olarak yakalayamaz.
Burada ilginç olan şey, hem Python hem de Java'nın 2015-04-20'de yayınlanan aynı eğitimli verileri (ingilizce.all.3class.caseless.distsim.crf.ser.gz) kullanmasıdır.
Nihai hedefim, python'u Java'nın yaptığı gibi çalışmaktır.
Ben değiştirebilir miyim bir şey olup olmadığını görmek için nltk.tag içinde StanfordNERTagger bakıyorum. Aşağıda sarıcı kodudur: çünkü farklı Sınıflandırıcı kullanmanın olmazsa,
class StanfordNERTagger(StanfordTagger):
"""
A class for Named-Entity Tagging with Stanford Tagger. The input is the paths to:
- a model trained on training data
- (optionally) the path to the stanford tagger jar file. If not specified here,
then this jar file must be specified in the CLASSPATH envinroment variable.
- (optionally) the encoding of the training data (default: UTF-8)
Example:
>>> from nltk.tag import StanfordNERTagger
>>> st = StanfordNERTagger('english.all.3class.distsim.crf.ser.gz') # doctest: +SKIP
>>> st.tag('Rami Eid is studying at Stony Brook University in NY'.split()) # doctest: +SKIP
[('Rami', 'PERSON'), ('Eid', 'PERSON'), ('is', 'O'), ('studying', 'O'),
('at', 'O'), ('Stony', 'ORGANIZATION'), ('Brook', 'ORGANIZATION'),
('University', 'ORGANIZATION'), ('in', 'O'), ('NY', 'LOCATION')]
"""
_SEPARATOR = '/'
_JAR = 'stanford-ner.jar'
_FORMAT = 'slashTags'
def __init__(self, *args, **kwargs):
super(StanfordNERTagger, self).__init__(*args, **kwargs)
@property
def _cmd(self):
# Adding -tokenizerFactory edu.stanford.nlp.process.WhitespaceTokenizer -tokenizerOptions tokenizeNLs=false for not using stanford Tokenizer
return ['edu.stanford.nlp.ie.crf.CRFClassifier',
'-loadClassifier', self._stanford_model, '-textFile',
self._input_file_path, '-outputFormat', self._FORMAT, '-tokenizerFactory', 'edu.stanford.nlp.process.WhitespaceTokenizer', '-tokenizerOptions','\"tokenizeNLs=false\"']
def parse_output(self, text, sentences):
if self._FORMAT == 'slashTags':
# Joint together to a big list
tagged_sentences = []
for tagged_sentence in text.strip().split("\n"):
for tagged_word in tagged_sentence.strip().split():
word_tags = tagged_word.strip().split(self._SEPARATOR)
tagged_sentences.append((''.join(word_tags[:-1]), word_tags[-1]))
# Separate it according to the input
result = []
start = 0
for sent in sentences:
result.append(tagged_sentences[start:start + len(sent)])
start += len(sent);
return result
raise NotImplementedError
Ya (java kodunda, bu AbstractSequenceClassifier kullanmak gibi görünüyor, diğer taraftan, piton nltk sarıcı CRFClassifier kullanır.) Bir yol yoktur python sarıcıda AbstractSequenceClassifier'ı kullanabilir miyim?
CoreNLP'yi kullanmak, Stanton araçlarının python arabirimiyle esnek kullanımı için yoldur. Ama izin vermeme izin verin, bu arada, kahvaltıdan sonra çıkarım,); – alvas
Kaçtığınız Java komutu nedir? Onu komut satırında mı çalıştırdın? – alvas
, Gabor Angeli'nin çözümü gerçekten işe yarayıp yaramadı? – user1412066