Пытаюсь получить резюме книг из Википедии о книгах проекта Гутенберга

#python #optimization #wikipedia #project-gutenberg

Вопрос:

У меня есть полный проект английской библиотеки Гутенберга в виде csv — файлов в алфавитном порядке со столбцами — id, title, text . Вот id в таком формате /ebooks/15809 . Затем я использую пакет python Википедии. Я могу получить полный текст страниц и множество других подробностей, используя пакет.

Это первые 10 книг от Гутенберга —

     ['A Apple Pie',
     'A Apple Pie and Other Nursery Tales',
     'Aaron in the Wildwoods',
     'Aaron Rodd',
     "Aaron's Rod",
     'Aaron the Jew: A Novel',
     'Aaron Trow',
     'Abaft the Funnel',
     'Abandoned',
     'The Abandoned Country; or']
 

Теперь , когда я бегаю pg = wikipedia.page('A Apple Pie') , я получаю результат для Яблочного пирога, пустыни, а не для книги. Очевидно, что API работает, когда мы вызываем wikipedia.page('xxxx') его wikipedia.search('xxxx') , который возвращает список результатов поиска и возвращает вики-страницу для первого результата, который в данном случае —

 >>> wikipedia.search('A Apple Pie')
['Apple pie', 'Pie', 'Apple Pie ABC', 'American Pie (film)', 'Sam Apple Pie', "Mom's Apple Pie", 'Apple Pie Hill', 'Pie à la Mode', 'Apple crisp', 'Pieing']
>>> 
 

Таким образом, мне действительно нужна третья книга в списке. Способ, который я понял, заключается в изучении категорий для каждой записи в Гутенберге и Википедии.

Что касается первой книги Гутенберга, то она относится к следующим категориям —

 s = 'https://www.gutenberg.org/ebooks/15809'

import requests
from bs4 import BeautifulSoup as bs

#page_url = base_url   alphabet
page = requests.get(s)
soup = bs(page.content, 'html.parser')
bibrec_tbl = soup.find("table", {"class": "bibrec"})
for td in list(bibrec_tbl.findChildren('td')):
    lowered = str(td).lower()
    if 'itemprop' in lowered:
        a = lowered[lowered.find('itemprop')   10 :]
        b = a[: a.find('"')]
        print('itemprop', 't', b, 't', td.text.strip())
    elif 'property' in lowered:
        a = lowered[lowered.find('property')   10 :]
        b = a[: a.find('"')]
        print('property', 't', b, 't', td.text.strip())



itemprop     creator     Greenaway, Kate, 1846-1901
itemprop     headline    A Apple Pie
property     dcterms:subject     Children's poetry
property     dcterms:subject     Nursery rhymes
property     dcterms:subject     Alphabet rhymes
property     dcterms:subject     Alphabet
property     dcterms:type    Text
itemprop     datepublished   May 10, 2005
property     dcterms:rights      Public domain in the USA.
itemprop     interactioncount    188 downloads in the last 30 days.
itemprop     pricecurrency   $0.00
 

И для третьего результата Википедии —

 pg = wikipedia.page('Apple Pie ABC')
print(pg.categories)

['Alphabet books',
 'Articles with short description',
 'British picture books',
 'CS1 maint: discouraged parameter',
 'Commons category link is on Wikidata',
 "English children's songs",
 'English folk songs',
 'English nursery rhymes',
 'Short description matches Wikidata',
 "Traditional children's songs"]
 

Поэтому я могу сделать косинусное сходство между обеими категориями и надеяться, что порог достаточно близок, чтобы соответствовать названию категории.

Есть ли лучший или более эффективный способ сделать это? Спасибо.

Комментарии:

1. Помогает ли это ввести более конкретный поисковый запрос для Википедии, например, если вы укажете имя автора?

2. @PranavHosangadi Нет, это не так — « страницы = википедия.поиск(«Яблочный пирог Гринуэй, Кейт») страницы [«Яблочный пирог», «Азбука яблочного пирога», «Кейт Гринуэй», «Медаль Карнеги (литературная премия)»,» Премия детской художественной литературы Guardian»,» Список культурных икон Англии», «1971 год в музыке», «Список писателей детской литературы», «Культура Соединенного Королевства», «Список режиссерских дебютов»] «