Распознавание сущностей в Stanford NLP с использованием Python

1

Я использую 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 дает следующий результат:

Изображение 174551

То же самое, если я буду работать на веб-сайте Stanford, вывод для NER - Изображение 174551

Есть проблемы с моим кодом Python:

1. "$" и "50-миллиард" должны быть объединены и обозначены как единое целое. Аналогичным образом, я хочу, чтобы "25" и "процент" были единым целым, так как он отображается в онлайн-выпуске stanford.
2. В моем выступлении "Вашингтон" показан как государство, а "Китай" показан как страна. Я хочу, чтобы оба они отображались как "Loc", как на выходе веб-сайта stanford. Возможное решение этой проблемы заключается в документации. Изображение 174551

Но я не знаю, какую модель я использую, и как изменить модель.

Теги:
python-3.x
stanford-nlp

1 ответ

0

Вот как вы можете это решить

Обязательно загрузите 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"
  • 0
    Я получаю эту ошибку «NameError: имя« return_annotation »не определено». Также, где находится файл 'ner-server.properties'?
  • 0
    Извините, я должен быть не возвращен
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню