Я использую Stanford Core NLP, используя Python. Я взял код здесь.
Ниже приведен код:
from stanfordcorenlp import StanfordCoreNLP
import logging
import json
class StanfordNLP:
def __init__(self, host='http://localhost', port=9000):
self.nlp = StanfordCoreNLP(host, port=port,
timeout=30000 , quiet=True, logging_level=logging.DEBUG)
self.props = {
'annotators': 'tokenize,ssplit,pos,lemma,ner,parse,depparse,dcoref,relation,sentiment',
'pipelineLanguage': 'en',
'outputFormat': 'json'
}
def word_tokenize(self, sentence):
return self.nlp.word_tokenize(sentence)
def pos(self, sentence):
return self.nlp.pos_tag(sentence)
def ner(self, sentence):
return self.nlp.ner(sentence)
def parse(self, sentence):
return self.nlp.parse(sentence)
def dependency_parse(self, sentence):
return self.nlp.dependency_parse(sentence)
def annotate(self, sentence):
return json.loads(self.nlp.annotate(sentence, properties=self.props))
@staticmethod
def tokens_to_dict(_tokens):
tokens = defaultdict(dict)
for token in _tokens:
tokens[int(token['index'])] = {
'word': token['word'],
'lemma': token['lemma'],
'pos': token['pos'],
'ner': token['ner']
}
return tokens
if __name__ == '__main__':
sNLP = StanfordNLP()
text = r'China on Wednesday issued a $50-billion list of U.S. goods including soybeans and small aircraft for possible tariff hikes in an escalating technology dispute with Washington that companies worry could set back the global economic recovery.The country\ tax agency gave no date for the 25 percent increase...'
ANNOTATE = sNLP.annotate(text)
POS = sNLP.pos(text)
TOKENS = sNLP.word_tokenize(text)
NER = sNLP.ner(text)
PARSE = sNLP.parse(text)
DEP_PARSE = sNLP.dependency_parse(text)
Меня интересует только распознавание сущностей, которое сохраняется в переменной NER. Команда NER дает следующий результат:
То же самое, если я буду работать на веб-сайте Stanford, вывод для NER -
Есть проблемы с моим кодом Python:
1. "$" и "50-миллиард" должны быть объединены и обозначены как единое целое. Аналогичным образом, я хочу, чтобы "25" и "процент" были единым целым, так как он отображается в онлайн-выпуске stanford.
2. В моем выступлении "Вашингтон" показан как государство, а "Китай" показан как страна. Я хочу, чтобы оба они отображались как "Loc", как на выходе веб-сайта stanford. Возможное решение этой проблемы заключается в документации.
Но я не знаю, какую модель я использую, и как изменить модель.
Вот как вы можете это решить
Обязательно загрузите Stanford CoreNLP 3.9.1 и необходимые модели банок
Настройте свойства сервера в этом файле "ner-server.properties"
annotators = tokenize,ssplit,pos,lemma,ner
ner.applyFineGrained = false
Запустите сервер с помощью этой команды:
java -Xmx12g edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 -timeout 15000 -serverProperties ner-server.properties
Убедитесь, что вы установили этот пакет Python:
https://github.com/stanfordnlp/python-stanford-corenlp
Запустите этот код Python:
import corenlp
client = corenlp.CoreNLPClient(start_server=False, annotators=["tokenize", "ssplit", "pos", "lemma", "ner"])
sample_text = "Joe Smith was born in Hawaii."
ann = client.annotate(sample_text)
for mention in ann.sentence[0].mentions:
print([x.word for x in ann.sentence[0].token[mention.tokenStartInSentenceInclusive:mention.tokenEndInSentenceExclusive]])
Вот все поля, доступные в EntityMention для каждого объекта:
sentenceIndex: 0
tokenStartInSentenceInclusive: 5
tokenEndInSentenceExclusive: 7
ner: "MONEY"
normalizedNER: "$5.0E10"
entityType: "MONEY"