#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 год в музыке», «Список писателей детской литературы», «Культура Соединенного Королевства», «Список режиссерских дебютов»] «