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?
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
Was ist der Java-Befehl, den du ausgeführt hast? Hast du es in der Kommandozeile ausgeführt? – alvas
hat die Lösung von Gabor Angeli tatsächlich funktioniert oder nicht? – user1412066