私はスタンフォード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を使用できますか?
CoreNLPを使用すると、PythonインターフェイスでStanfordツールを柔軟に使用することができます。しかし、私は朝食後にこれで私たちの方法をハックできるかどうか試してみましょう;) – alvas
あなたが実行したJavaコマンドは何ですか?コマンドラインで実行しましたか? – alvas
Gabor Angeliのソリューションは実際に動作したのですか? – user1412066