Как решить проблему соединения при разборе зависимостей с помощью spacy? - PullRequest
0 голосов
/ 18 апреля 2019

Я использовал простой пример кода для извлечения отношений сущностей. Код работает нормально, если есть предложение типа «Доход MacDonald в прошлом году составил 1 миллион долларов». Но когда я попробовал предложение «Доход MacDonald's составил 1 миллион долларов в прошлом году и 2 миллиона долларов в этом году». это показывает мне тот же результат, что и выше. Может ли кто-нибудь помочь мне изменить код, чтобы я мог получить желаемый результат.

import spacy
TEXTS = ["MacDonald's revenue was $1 million last year and $2 million this year "]

def extract_currency_relations(doc):
    # merge entities and noun chunks into one token
    spans = list(doc.ents) + list(doc.noun_chunks)
    for span in spans:
        span.merge()

    relations = []
    for money in filter(lambda w: w.ent_type_ == "MONEY", doc):
        if money.dep_ in ("attr", "dobj"):
            #subject = [w for w in money.head.lefts if w.dep_ == "nsubj"]
            subject = [w for w in money.head.lefts if w.dep_ == "nsubj"]
            if subject:
                subject = subject[0]
                relations.append((subject, money))
        elif money.dep_ == "pobj" and money.head.dep_ == "prep":
            relations.append((money.head.head, money))
    return relations

model="en_core_web_sm"
nlp = spacy.load(model)
print("Loaded model '%s'" % model)
print("Processing %d texts" % len(TEXTS))


for text in TEXTS:
    doc = nlp(text)
    relation = extract_currency_relations(doc)
    for r1, r2 in relation:
         print("\n\n","{:<10}\t{}\t{}".format(r1.text, r2.ent_type_, r2.text))

Я ожидаю, что результат составит '' ' Доход MacDonald ДЕНЬГИ $ 1 млн. ' '' '' ' Доход MacDonald's ДЕНЬГИ $ 2 млн. ' ''

Но фактический объем производства составляет всего '' ' Доход MacDonald'а ДЕНЬГИ $ 1 млн. ' ''

...