Любое элегантное решение для поиска составных существительных прилагательных пар из предложения с помощью Spacy? - PullRequest
0 голосов
/ 27 ноября 2018

Я недавно знаком с Spacy и довольно заинтересован в этой библиотеке Python.Однако в моей спецификации я намереваюсь выделить составные пары существительное-прилагательное в качестве ключевой фразы из входного предложения.Я думаю, что Spacy предоставляет множество утилит для работы с задачей НЛП, но не нашел удовлетворительной подсказки для моей желаемой задачи.Я посмотрел очень похожий пост в SO, связанном посте , и решение не очень эффективно и не работает для пользовательского входного предложения.

Вот часть входного предложения:

sentence_1="My problem was with DELL Customer Service"
sentence_2="Obviously one of the most important features of any computer is the human interface."
sentence_3="The battery life seems to be very good and have had no issues with it."

Вот код, который я пробовал:

import spacy, en_core_web_sm
nlp=en_core_web_sm.load()

def get_compound_nn_adj(doc):
    compounds_nn_pairs = []
    parsed=nlp(doc)
    compounds = [token for token in sent if token.dep_ == 'compound']
    compounds = [nc for nc in compounds if nc.i == 0 or sent[nc.i - 1].dep_ != 'compound']
    if compounds:
        for token in compounds:
            pair_1, pair_2 = (False, False)
            noun = sent[token.i:token.head.i + 1]
            pair_1 = noun
            if noun.root.dep_ == 'nsubj':
                adj_list = [rt for rt in noun.root.head.rights if rt.pos_ == 'ADJ']
                if adj_list:
                    pair_2 = adj_list[0]
            if noun.root.dep_ == 'dobj':
                verb_root = [vb for vb in noun.root.ancestors if vb.pos_ == 'VERB']
                if verb_root:
                    pair_2 = verb_root[0]
            if pair_1 and pair_2:
                compounds_nn_pairs.append(pair_1, pair_2)
    return compounds_nn_pairs

Я предполагаю, что тип модификации должен быть применен над вспомогательной функцией, потому что она не вернула ожидаемое соединениесуществительные-прилагательные пары.Есть ли кто-нибудь, кто имеет хороший опыт работы с Spacy?Как я могу улучшить вышеуказанное эскизное решение?Любая лучшая идея?

Желаемый вывод :

Я ожидаю получить составные пары существительное-прилагательное из каждого входного предложения следующим образом:

desired_output_1="DELL Customer Service"
desired_output_2="human interface"
desired_output_3="battery life"

Есть ли способ получить ожидаемый результат?какое обновление потребуется для реализации выше?Есть еще мысли?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Я подозреваю, что это должно быть обработано с помощью базы данных составных существительных.Статус «составное существительное» происходит от общности употребления.Так что, возможно, источником могут быть различные n-граммовые базы данных (например, Google).

0 голосов
/ 05 декабря 2018

Похоже, что spaCy обнаруживает только сложные отношения в предложениях 1 и 3 и рассматривает 2 как amod отношение.(Вот небольшой код для проверки его синтаксического анализа: [(i, i.pos_, i.dep_) for i in nlp(sentence_1)]).

Чтобы получить соединения из 1 и 3, попробуйте следующее:

for i in nlp(sentence_1):
    if i.pos_ in ["NOUN", "PROPN"]:
        comps = [j for j in i.children if j.dep_ == "compound"]
        if comps:
            print(comps, i)

Для каждого существительного или правильного существительного впредложение проверяет свое поддерево на compound отношения.

Чтобы создать более широкую сеть, которая также выбирает прилагательные, вы можете искать прилагательные и существительные в поддереве слова, а не просто соединения:

for i in nlp(sentence_2):
    if i.pos_ in ["NOUN", "PROPN"]:
        comps = [j for j in i.children if j.pos_ in ["ADJ", "NOUN", "PROPN"]]
        if comps:
            print(comps, i)
...