2016-01-06 18 views
5

私はスタンフォードNERタガーを実行するためにpythonとjavaの両方を使用していますが、結果に違いが見られます。 "このための主要なソフトウェアとしてのERwinを使用したデータモデリングのあらゆる側面に関与"結果スタンフォードNERタガーの違いNLTK(python)vs JAVA

例えば、I入力文、

JAVA結果:

"ERwin": "PERSON" 

Pythonの結果:

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ラッパーはPERSONとして「ERwin」をキャッチできません。

ここで興味深いのは、PythonとJavaの両方で2015-04-20でリリースされた同じ訓練データ(english.all.3class.caseless.distsim.crf.ser.gz)が使用されています。

私の究極の目標は、PythonをJavaと同じように動作させることです。

私が修正できるものがあるかどうかを調べるには、nltk.tagのStanfordNERTaggerを見ています。

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 

それとも、それが原因で異なる分類子を使用するかどう(Javaコードで、それはAbstractSequenceClassifierを使用しているようだ、一方、PythonのNLTKラッパーはCRFClassifierを使用しています。)方法があります:下のラッパーコードがあります私はPythonラッパーでAbstractSequenceClassifierを使用できますか?

+0

CoreNLPを使用すると、PythonインターフェイスでStanfordツールを柔軟に使用することができます。しかし、私は朝食後にこれで私たちの方法をハックできるかどうか試してみましょう;) – alvas

+0

あなたが実行したJavaコマンドは何ですか?コマンドラインで実行しましたか? – alvas

+0

Gabor Angeliのソリューションは実際に動作したのですか? – user1412066

答えて

5

CoreNLPのプロパティファイル(またはコマンドライン)でmaxAdditionalKnownLCWordsを0に設定し、可能であればNLTKでも設定してみてください。これは、NERシステムがテスト時のデータから少しでも覚えることを可能にするオプションを無効にします。これは時々軽度の結果を引き起こす可能性があります。

+0

maxAdditionalKnownLCWordsを設定する方法は知っていますか? – Amir

+0

@Gaborこれについて少し説明できますか? – Anish

+0

@Gabor maxAdditionalKnownLCWordsを設定してもらえますか? –

関連する問題