2016-01-06 19 views
5

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?

+0

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

+0

Kaçtığınız Java komutu nedir? Onu komut satırında mı çalıştırdın? – alvas

+0

, Gabor Angeli'nin çözümü gerçekten işe yarayıp yaramadı? – user1412066

cevap

5

CoreNLP için özellikler dosyasında (veya komut satırında) ve mümkünse NLTK için maxAdditionalKnownLCWords ayarını 0'a ayarlamayı deneyin. Bu, NER sisteminin test-zaman verisinden biraz öğrenmesine izin veren bir seçeneği devre dışı bırakır, bu da zaman zaman hafif farklı sonuçlara neden olabilir.

+0

maxAdditionalKnownLCWords nasıl ayarlanacağını biliyor olabilir miyim? – Amir

+0

@Gabor Bu konuda biraz açıklayabilir misiniz? – Anish

+0

@Gabor maxAdditionalKnownLCWords ayarlamak için bana yardımcı olabilir misiniz? –