2016-01-06 9 views
5

मैं स्टैनफोर्ड एनईआर टैगर चलाने के लिए दोनों पायथन और जावा का उपयोग कर रहा हूं लेकिन मुझे परिणामों में अंतर दिखाई दे रहा है।स्टैनफोर्ड एनईआर टैगर एनएलटीके (पायथन) बनाम जावा में परिणाम अंतर

उदाहरण के लिए

, जब मैं इनपुट वाक्य "इरविन इस के लिए प्राथमिक सॉफ्टवेयर के रूप में उपयोग करते हुए डेटा मॉडलिंग के सभी पहलुओं में शामिल किया गया।",

जावा परिणाम:

"ERwin": "PERSON" 

अजगर परिणाम:

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

पायथन एनएनटीके रैपर व्यक्ति के रूप में "ईरविन" नहीं पकड़ सकता है।

यहां क्या दिलचस्प है पाइथन और जावा दोनों ही प्रशिक्षित डेटा (english.all.3class.caseless.distsim.crf.ser.gz) का उपयोग 2015-04-20 में जारी किए गए हैं।

मेरा अंतिम लक्ष्य जावा के समान तरीके से पाइथन काम करना है।

मैं nltk.tag में स्टैनफोर्ड एनईआरटीगर को देख रहा हूं यह देखने के लिए कि क्या कुछ भी मैं संशोधित कर सकता हूं। नीचे आवरण कोड है:

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 

, या अगर यह क्योंकि विभिन्न वर्गीकरणकर्ता का उपयोग करने का है (जावा कोड में, यह AbstractSequenceClassifier उपयोग करने के लिए लगता है, दूसरे हाथ पर, अजगर nltk आवरण CRFClassifier उपयोग करता है।) वहाँ एक रास्ता है कि मैं अजगर wrapper में सार SequenceClassifier का उपयोग कर सकते हैं?

+0

कोरनएलपी का उपयोग करना स्टैनफोर्ड उपकरणों के लिक्विड इंटरफेस के साथ लचीली उपयोग के लिए जाने का तरीका है। लेकिन मुझे कोशिश करें कि क्या मैं नाश्ते के बाद, इस में अपना रास्ता निकाल सकता हूं;) – alvas

+0

आपके द्वारा चलाए गए जावा कमांड क्या हैं? क्या आपने इसे कमांड लाइन पर चलाया था? – alvas

+0

क्या गैबर एंजेली का समाधान वास्तव में काम करता था या नहीं? – user1412066

उत्तर

5

CoreNLP के लिए गुण फ़ाइल (या कमांड लाइन) में maxAdditionalKnownLCWords से 0 को सेट करने का प्रयास करें, और यदि एनएलटीके के लिए भी संभव हो। यह एक विकल्प अक्षम करता है जो एनईआर सिस्टम को टेस्ट-टाइम डेटा से थोड़ा सा सीखने की अनुमति देता है, जो कभी-कभी हल्के ढंग से अलग-अलग परिणामों का कारण बन सकता है।

+0

क्या मुझे पता है कि maxAdditionalKnownLCWords कैसे सेट करें? – Amir

+0

@ गैबर क्या आप इस पर थोड़ा सा व्याख्या कर सकते हैं? – Anish

+0

@ गैबर क्या आप कृपया maxAdditionalKnownLCWords सेट करने में मेरी सहायता कर सकते हैं? –

संबंधित मुद्दे