Как улучшить результаты textacy.extract.semistructured_statements () - PullRequest
0 голосов
/ 07 апреля 2020

Для этого проекта я использую модули Wikipedia, spacy и textacy.extract.

Я использовал модуль Википедии, чтобы получить страницу, на которую я установил тему. Он вернет строку своего содержимого.

Затем я использую textacy.extract.semistructured_statements () для фильтрации фактов. Требуется два обязательных аргумента. Первый - это документ, а второй - это сущность.

В целях тестирования я попытался установить тему для Ubuntu и Билла Гейтса.


#The Subject we are looking for
subject = 'Bill Gates'

#The Wikipedia Page
wikiResults = wikipedia.search(subject)
wikiPage = wikipedia.page(wikiResults[0]).content

#Spacy
nlp = spacy.load("en_core_web_sm")
document = nlp(wikiPage)

#Textacy.Extract
statments = textacy.extract.semistructured_statements(document, subject)

for statement in statements:
    subject, verb, fact = statement

    print(fact)

Поэтому, когда я запускаю программу, я получаю несколько результатов поиска в Ubuntu, но не Билла Гейтса. Почему это так и как я могу улучшить свой код, чтобы извлечь больше фактов со страницы Википедии?


Редактировать: Вот конечные результаты

Ubuntu: enter image description here

Билл Гейтс: enter image description here

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Вам нужно обработать документ, используя разные реплики, чтобы извлечь общие глаголы, используемые для описания предмета, а также вам нужно разбить строку, если у вас есть несколько слов для поиска. Например, для Билла Гейтса вам нужно будет искать комбинации «Билл», «Гейтс», «Билл Гейтс» и извлекать различные глаголы базовых сигналов, используемые для описания человека / объекта интереса.

Так, например, поиск «Gates»:

statments = textacy.extract.semistructured_statements(document, "Gates", cue = 'have',  max_n_words = 200, )

даст вам больше таких вещей, как:

* entity: Gates , cue: had , fact: primary responsibility for Microsoft's product strategy from the company's founding in 1975 until 2006
* entity: Gates , cue: is , fact: notorious for not being reachable by phone and for not returning phone calls
* entity: Gates , cue: was , fact: the second wealthiest person behind Carlos Slim, but regained the top position in 2013, according to the Bloomberg Billionaires List
* entity: Bill , cue: were , fact: the second-most generous philanthropists in America, having given over $28 billion to charity
* entity: Gates , cue: was , fact: seven years old
* entity: Gates , cue: was , fact: the guest on BBC Radio 4's Desert Island Discs on January 31, 2016, in which he talks about his relationships with his father and Steve Jobs, meeting Melinda Ann French, the start of Microsoft and some of his habits (for example reading The Economist "from cover to cover every week
* entity: Gates , cue: was , fact: the world's highest-earning billionaire in 2013, as his net worth increased by US$15.8 billion to US$78.5 billion

Обратите внимание, что глаголы могут быть отрицательными, как в результат 2!

Я также отметил, что использование max_n_words с более чем 20 словами по умолчанию может привести к более интересным операторам.

Вот мой полный сценарий:

import wikipedia
import spacy
import textacy
import en_core_web_sm

subject = 'Bill Gates'

#The Wikipedia Page
wikiResults = wikipedia.search(subject)
#print("wikiResults:", wikiResults)
wikiPage = wikipedia.page(wikiResults[0]).content
print("\n\nwikiPage:", wikiPage, "'\n")
nlp = en_core_web_sm.load()
document = nlp(wikiPage)
uniqueStatements = set()
for word in ["Gates", "Bill", "Bill Gates"]:
    for cue in ["be", "have", "write", "talk", "talk about"]:
        statments = textacy.extract.semistructured_statements(document, word, cue = cue,  max_n_words = 200, )
        for statement in statments:
            uniqueStatements.add(statement)

print("found", len(uniqueStatements), "statements.")
for statement in uniqueStatements:
    entity, cue, fact = statement
    print("* entity:",entity, ", cue:", cue, ", fact:", fact)

Разные предметы и глагол cues дают мне 23 результата вместо одного.

0 голосов
/ 22 апреля 2020

Хочу поблагодарить Габриэле м . Для указания направления.

Я добавил ["Это", "он", "она", "они"], которые я видел в примере neuralcoref модуля.

Приведенный ниже код сделает работу за вас

import wikipedia
import spacy
import textacy
import en_core_web_sm

subject = 'Bill Gates'

#The Wikipedia Page
wikiResults = wikipedia.search(subject)

wikiPage = wikipedia.page(wikiResults[0]).content

nlp = en_core_web_sm.load()
document = nlp(wikiPage)
uniqueStatements = set()

for word in ["It","he","she","they"]+subject.split(' '):    
    for cue in ["be", "have", "write", "talk", "talk about"]:
        statments = textacy.extract.semistructured_statements(document, word, cue = cue,  max_n_words = 200, )
        for statement in statments:
            uniqueStatements.add(statement)

for statement in uniqueStatements:
    entity, cue, fact = statement
    print(entity, cue, fact)
...