2016-01-06 5 views
5

Ich benutze sowohl Python und Java, um die Stanford NER-Tagger zu laufen, aber ich sehe den Unterschied in den Ergebnissen.Ergebnis Unterschied in Stanford NER-Tagger NLTK (Python) vs JAVA

Zum Beispiel, wenn ich Eingabe den Satz "Involved in allen Aspekten der Datenmodellierung ERwin als primäre Software für diese verwenden.",

JAVA Ergebnis:

"ERwin": "PERSON" 

Python Ergebnis:

Python Nltk Wrapper kann "ERwin" nicht als PERSON fangen.

Interessant ist, dass sowohl Python als auch Java dieselben trainierten Daten verwenden (englisch.all.3class.caseless.distsim.crf.ser.gz), die 2015-04-20 veröffentlicht wurden.

Mein ultimatives Ziel ist es, Python auf die gleiche Weise wie Java arbeiten zu lassen.

Ich sehe StanfordNERTagger in nltk.tag, um zu sehen, ob es etwas gibt, das ich ändern kann. Unten ist der Wrapper-Code:

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 

Oder, wenn es wegen der Verwendung verschiedene Classifier ist (im Java-Code, es AbstractSequenceClassifier, auf der anderen Seite, Python nltk Wrapper verwendet den CRFClassifier zu verwenden scheint.) Ist es eine Möglichkeit, dass ich AbstractSequenceClassifier in Python-Wrapper verwenden kann?

+0

Mit CoreNLP können Sie flexibel Stanford-Tools mit Python-Schnittstelle verwenden. Aber lass mich versuchen, ob ich nach dem Frühstück hier heraushacken kann;) – alvas

+0

Was ist der Java-Befehl, den du ausgeführt hast? Hast du es in der Kommandozeile ausgeführt? – alvas

+0

hat die Lösung von Gabor Angeli tatsächlich funktioniert oder nicht? – user1412066

Antwort

5

Versuchen Sie, maxAdditionalKnownLCWords auf 0 in der Eigenschaftendatei (oder Befehlszeile) für CoreNLP und wenn möglich auch für NLTK zu setzen. Dies deaktiviert eine Option, die es dem NER-System ermöglicht, aus Testzeitdaten ein wenig zu lernen, was gelegentlich zu leicht unterschiedlichen Ergebnissen führen kann.

+0

kann ich wissen, wie man maxAdditionalKnownLCWords setzt? – Amir

+0

@Gabor Kannst du etwas dazu erklären? – Anish

+0

@Gabor Können Sie mir bitte helfen, maxAdditionalKnownLCWords zu setzen? –