Как определить новую сущность в Spacy NLP - PullRequest
0 голосов
/ 28 мая 2019

Я хочу определить новую сущность в Spacy.

Мой код должен достичь следующего:

  • поиск текста по определенному ключевому слову (здесь: "Streitwert")

  • если ключевое слово в тексте, найдите предложение, в котором встречается слово

  • в этом предложении найдите число

  • это число должно быть объектом с меткой "ключевое слово"

Это мой код, но он не работает:

def get_keyword_value(token):
    if "Streitwert" in token.doc.text: 
        for sent in token.doc.sents:
            if "Streitwert" in sent.text:
                for token in sent:
                    if token.pos_ == "NUM":
                        return token.text


import spacy
from spacy.tokens import Token
nlp = spacy.load("de_core_news_sm")
Token.set_extension("Streitwert", getter=get_keyword_value, force=True)

text = "Die ist ein langer Text. Der Streitwert wird auf EUR 12.000 EUR festgesetzt"
doc = nlp(text)

[(token.text, token._.Streitwert) for token in doc]

Код не работает должным образом и имеет две проблемы

  1. каждый токен имеет токен ._. Streitwert = 12.000 (но это должен быть только токен 12.000

  2. как определить новые документы с меткой "Streitwert"

Что я на самом деле хочу, так это то, что «12.000» помечается как «Streitwert», когда я делаю

[(ent.text, ent.label_) for ent in doc.ents]

1 Ответ

0 голосов
/ 29 мая 2019

Что касается определения нового пользовательского объекта, вы можете легко добавить его в список объектов: ents. Чтобы узнать, как вы можете это сделать, я рекомендую взглянуть на этот сравнительно короткий пример SpaCy, который делает нечто очень похожее на то, что вы хотите сделать: https://spacy.io/usage/rule-based-matching#on_match

В этом примере они соответствуют слову и, основываясь на совпадении, добавляют пользовательский объект. Здесь они используют свойство ORTH, но вы можете использовать {"POS": "NUM"} в соответствии с вашими потребностями. Кроме того, вам может быть полезно использовать Matcher Explorer на основе правил, чтобы поиграть со своими матерями в приятном дружественном пользовательском интерфейсе. В этом примере нет необходимости устанавливать пользовательский атрибут.

Если, однако, вы решите пойти по пути пользовательского атрибута, то вы правы, что вам нужно использовать Token.set_extension (...), чтобы включить пользовательское свойство уровня токена. Я предполагаю, что вы хотите установить значение по умолчанию False, а затем перезаписать это False с помощью True, если токен является «Streitwert». Вы можете сделать это, добавив параметр по умолчанию.

Token.set_extension("Streitwert", default=None, force=True)

Кроме того, я заметил, что ваш метод get_key_word (...) большую часть времени ничего не возвращает. т.е. если какое-либо из условий False, какое значение должно быть возвращено?

...