Как извлечь информацию из информационного ящика Википедии?

Этот причудливый информационный блок есть в ‹какой-то статье Википедии›. Как мне узнать значение ‹этого поля и этого›?


person Tgr    schedule 23.11.2015    source источник
comment
Спасибо за вопрос и ответ, который имеет смысл, и я могу указать на сотни плохо сформулированных вопросов по этому поводу. :)   -  person Nemo    schedule 10.06.2016
comment
Возможный дубликат Получение данных Infobox из Википедии   -  person Termininja    schedule 09.12.2016


Ответы (2)


Неправильный способ: попытка разобрать HTML

Для получения HTML-код статьи статьи, затем используйте парсер DOM для извлечения table.infobox tr[3] td / использовать регулярное выражение.

На самом деле в большинстве случаев это действительно плохая идея. HTML-код Википедии не особенно удобен для синтаксического анализа (особенно информационные блоки, которые представляют собой систему рукописных шаблонов), точная структура меняется от информационного блока к информационному блоку, а структура информационного блока может меняться со временем. Вы также можете упустить некоторые функции, которые были бы доступны в противном случае, например интернационализацию.

Другой неправильный способ: попытка разобрать викитекст

На первый взгляд вики-текст некоторых статей выглядит так, как будто это довольно простое представление информационного окна:

{{ Infobox Foo
| param1 = bar
| param2 = 123
...

На самом деле это не так. Шаблоны рекурсивны, поэтому вы можете столкнуться с такими вещами, как param1 = {{convert|10|km|mi}}; параметры шаблона могут содержать сложный викитекст или разметку HTML; некоторые параметры могут отсутствовать в викитексте статьи и быть извлечены шаблоном из подстраницы или другого хранилища данных. Просто выяснить, где параметр начинается и заканчивается, может быть непростым делом, если он содержит другие шаблоны, у которых есть свои собственные параметры.

Идеальный способ: использовать структурированный источник данных

Существуют различные проекты по предоставлению информации, содержащейся в информационных ящиках Википедии, в структурированной форме; два больших - это Викиданные и DBpedia.

Wikidata - это проект по созданию базы знаний, содержащей структурированные данные; он поддерживается тем же глобальным движением, которое создало Википедию, поэтому информация находится в процессе перемещения. Это ручной процесс, поэтому не вся информация в Википедии доступна через Викиданные, с другой стороны, есть много информации, которая есть в Викиданных, но не в Википедии. Вы можете найти страницу Викиданных статьи и посмотреть, какая информация в ней содержится, перейдя по ссылке Элемент Викиданных на левой панели инструментов на странице статьи; программно вы можете получить доступ к информации Викиданных с помощью модуля API wbgetentities (песочница a>, объяснение концепций), например org / w / api.php? action = wbgetentities & sites = enwiki & title = Albert_Einstein. Также существует конечная точка SPARQL, дампы базы данных и клиенты в PHP, Java и Python.

DBPedia - это проект по автоматическому сбору информации информационного ящика Википедии и публикации ее в структурированной форме. Вы можете найти страницу DBPedia для статьи в Википедии, перейдя на http://dbpedia.org/page/<Wikipedia article name>, например http://dbpedia.org/page/Albert_Einstein. Он имеет множество форматов данных, дампы, конечную точку SPARQL и прочее.

Неправильные способы сделать правильно

Если нужная вам информация недоступна через Викиданные или DBpedia, все еще существуют полуструктурированные способы извлечения данных из информационных ящиков. Для извлечения на основе HTML вы можете использовать REST Content API (например, https://en.wikipedia.org/api/rest_v1/page/html/Albert_Einstein), который возвращает более богатый и семантический HTML, чем тот, который используется на обычных страницах статей, и сохраняет в нем некоторую информацию о структуре шаблона.

Кроме того, вы можете начать с вики-текста и преобразовать его в синтаксическое дерево, используя более простой клиентский mwparserfromhell Модуль Python (docs) или более мощный parsoid-jsapi, который взаимодействует со службой содержания REST Википедии.

Библиотека Python более высокого уровня, которая пытается извлечь содержимое информационного окна из вики-текста, называется wptools.

person Community    schedule 23.11.2015
comment
Я могу использовать викиданные SPARQL или DBPedia? Что лучше для получения данных из Википедии? - person Alexan; 25.09.2016
comment
@Alex зависит от вашего варианта использования. DBPedia имеет тенденцию быть более полной; Викиданные имеют тенденцию быть более глубокими и семантическими. - person Tgr; 26.04.2017
comment
Я не уверен, что это идеальный способ, хотя вы бы получили меньше результатов, чем анализируете его самостоятельно, даже если анализировать его самостоятельно, это дольше, потому что dpedia ok дает вам дату, но в большинстве случаев пропускает всю дату, например здесь нет года в дате dbpedia.org/page/Victory_Tests, в то время как фактическая страница википедии тоже год en.wikipedia.org/wiki/Victory_Tests так что не знаю, он длиннее, но ручной парсинг лучше - person rob.m; 06.08.2017
comment
Также помните, что DBPedia не синхронизируется в реальном времени с Википедией, у вас может возникнуть задержка в несколько месяцев между версией Википедии и соответствующей записью в DBPedia. - person ThomasFrancart; 30.07.2019
comment
Бьюсь об заклад, около половины людей, получивших этот ответ, пытаются проанализировать Википедию с намерением добавить данные в викиданные. - person Matthias Winkelmann; 28.09.2020

Принятый ответ верен по всем пунктам, и особенно по подтексту, что синтаксический анализ wikitexxt ужасен.

Если, однако, получение ваших данных из Викиданных не совсем подходит для вас, потому что (чисто гипотетически) вы пытаетесь переместить данные из WP в WD, я считаю, что формат, который вы ищете for - это дерево разбора. Вот как это выглядит:

<...lots of other stuff omitted>
<template lineStart= "1">
   <title>Datatable TableRow</title>
   <part>
      <name>Picture         </name>
      <equals>=</equals>
      <value> Picture 2013-07-26.jpg</value>
   </part>
   <part>
      <name>Inscription    </name>
      <equals>=</equals>
      <value> This is an Inscription on visible on the image</value>
   </part>
   <part>
      <name>NS           </name>
      <equals>=</equals>
      <value> 54.0902049</value>
   </part>
   <part>
      <name>EW           </name>
      <equals>=</equals>
      <value> 12.1364164</value>
   </part>
   <part>
      <name>Region       </name>
      <equals>=</equals>
      <value> DE-MV</value>
   </part>
   <part>
      <name>Name         </name>
      <equals>=</equals>
      <value> Person, Anna</value>
   </part>
   <part>
      <name>Location          </name>
      <equals>=</equals>
      <value> Lange Stra\u00dfe&amp;nbsp;14&lt;br /&gt;&lt;small&gt;ex: Lange Stra\u00dfe&amp;nbsp;89&lt;/small&gt;</value>
   </part>
   <part>
      <name>Date </name>
      <equals>=</equals>
      <value> </value>
   </part>
</template>

Вот URIwiki для такого запроса API с медиа. Обратите внимание на список свойств, который включает parsetree. Я включил несколько других категорий (включая категории) на всякий случай, и вы, вероятно, захотите сократить список до того, что вам действительно нужно, чтобы сэкономить свое время и чужие серверы.

person Matthias Winkelmann    schedule 29.09.2020
comment
Дерево синтаксического анализа определенно полезно, но не решает проблемы, связанные с тем, что 1) параметр информационного окна может быть самим шаблоном (преобразование единиц измерения, математика даты, многострочное форматирование и т. Д.) 2) часть информации может поступать откуда-то еще (например, информационные окна города часто используют демографическую информацию, хранящуюся на другой странице вики; в более ужасных случаях данные хранятся в огромной таблице Lua) 3) информационное окно может выполнять довольно сложные манипуляции с аргументами (например, многие информационные окна enwiki генерируют описание страницы, но на самом деле нет способа догадаться об этом по необработанному вики-тексту). - person Tgr; 30.09.2020
comment
Правда, другие методы, наверное, тоже не будут лучше. Если вы хотите получить максимальную информацию об информационном блоке, Parsoid HTML, вероятно, является наиболее богатым, поскольку он содержит как имена шаблонов, так и параметры, а также визуализированный HTML, но, вероятно, более сложный в использовании. - person Tgr; 30.09.2020