Отказ от ответственности: изначально я опубликовал эту статью в моем старом блоге. С тех пор я заблокировал этот блог по юридическим причинам, которые мои юристы рекомендуют мне не обсуждать, но сохранил статьи, чтобы я мог использовать наиболее популярные из них на нашем носителе. Это была одна из самых эффективных статей, поэтому я решил обновить ее и опубликовать здесь.

Мое обоснование

Для создания BandNameOrigins.com мне нужно было заполнить базу данных широким набором музыкальных исполнителей, чтобы для начала у нее был богатый набор контента, который побуждал бы пользователей участвовать в сообществе и вносить дополнительный контент.

Когда я обычно задавал вопрос о том, откуда взялось название группы, я зашел в Википедию. Истоки большинства названий групп существуют, но они, как правило, скрыты глубоко внутри страницы, в непоследовательных местах с несовместимыми ключевыми словами.

Кроме того, Википедия, вероятно, содержит самый широкий, хорошо организованный набор музыкальных исполнителей, которых я мог себе представить, которые могли бы иметь информацию в Интернете о том, откуда взялось название их группы.

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

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

Получение данных

Экспорт данных из английской Википедии периодически снимается и распространяется здесь. В одном из единственных законных способов использования протокола Torrent они распространяются именно так. Нам нужна последняя версия файла « pages-article-multistream.xml.bz2 », который содержит все текущие версии всех страниц в Википедии, за исключением страниц обсуждения и пользователей.

Эти файлы большие, поэтому мне показалось, что проще всего проделать всю эту работу на арендованном виртуальном экземпляре из Google Cloud Engine. Вы можете работать на AWS или на своем локальном компьютере, если хотите, но эта статья написана в контексте полностью свежей версии debian.

Я скачиваю файлы через торрент из командной строки:

# install node and webtorrent
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo npm install webtorrent-cli -g
# download and unzip the export
webtorrent http://itorrents.org/torrent/09EED43E8A9C5E086F3728F66F986CFE3B9FD0DD.torrentbzip2 -dk enwiki-20170820-pages-articles-multistream.xml.bz2

Он загрузился менее чем за 10 минут. Неплохо для суммы всех человеческих знаний. Мы живем в поистине удивительное время !!

С другой стороны, разархивирование файла заняло у меня намного больше времени, чуть больше часа. Если вы хотите почувствовать прогресс, вы можете запустить сценарий просмотра, чтобы проверить размер несжатого файла, который в конечном итоге достигнет 58 гигабайт.

watch ls -lah enwiki-20170820-pages-articles-multistream.xml

Категоризация каждой концепции во Вселенной

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

По сути, Википедия моделирует категории как ориентированный граф категорий и подкатегорий. Всего существует 1 652 623 различных категории. Учитывая, что статей около 6 миллионов, это примерно 1 категория на каждые 4 статьи. Такое количество данных, содержащихся в графе категоризации, просто поразительно.

Если вы посетите страницу Википедии, вы увидите внизу список категорий. Категории здесь - это категории, к которым принадлежит сама статья, и они имеют тенденцию быть гиперспецифичными, например, «Музыкальные группы, упраздненные в 2014 году».

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

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

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

Щелкая по категориям, вы попадаете на несколько разных типов страниц, ни одна из которых полностью не объясняет критерии включения, но большинство из них не требуют пояснений.

Используя экспорт, мы также можем более подробно изучить график категорий, чтобы точно определить, что мы здесь ищем.

Файл экспорта XML

Этот XML-дамп содержит только страницы, которые в целом охватывают ряд целей в Википедии, включая статьи и категории. Каждая страница имеет некоторые ограниченные метаданные, а затем состоит из вики-текста, который можно проанализировать, чтобы получить всевозможные интересные свойства.

Для наших целей нам не нужен полноценный синтаксический анализатор wikitext, поскольку мы действительно хотим извлекать только отношения категорий. В викитексте категории выражаются с помощью тега типа [[Категория: Антикапитализм]]«, который мы можем извлечь с помощью простого регулярного выражения. («Полная документация здесь).

XML-файл, как мы знаем, довольно большой, поэтому, если у вас нет массивного компьютера для работы, о его разборе в память не может быть и речи. У XML есть замечательное свойство возможности итеративного анализа, поэтому мы будем использовать для этого библиотеку python lxml. Во-первых, возьмите любую из зависимостей, которые могут вам понадобиться:

sudo apt-get install python3-dev python3-pip libxml2-dev libxslt-dev
sudo pip3 install lxml

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

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

nohup python3 extract-categories.py enwiki.xml &> extract-categories.log &

Не стесняйтесь взять файл, созданный в результате экспорта 20.08.17. (Он большой, 633 Мбайт в сжатом виде, так что убедитесь, что вы справитесь с этим.)

Изучение графика категорий

Теперь, когда у нас есть метаданные графа категорий, извлеченные в файл гораздо меньшего размера (всего 3 гигабайта из 59), мы можем пойти дальше и извлечь только отношения между категориями и подкатегориями. Оттуда, как только мы найдем наш основной набор категорий верхнего уровня, мы сможем пролистать иерархию и перечислить всю нашу вселенную страниц.

Всего имеется 1 411 252 уникальных категорий, на которые ссылаются страницы, и в общей сложности 1 626 013 категорий, содержащих страницы. Это было неожиданно. Всего существует 241 371 категория, которая не содержит страниц, и 26 610 категорий, не имеющих связанной страницы категории. Также стоит отметить, что есть некоторые циклы категорий, в том числе случаи, когда дочерний элемент и родитель явно поменялись местами по ошибке. Этого и следовало ожидать с набором данных, выращиваемым так же органично, как в Википедии.

Мы можем взять этот необработанный набор категорий и создать узлы и грани метаграфа категории с помощью следующего кода Python:

В результате получается граф с 1 652 623 узлами и 3 417 964 ребрами (что занимает всего лишь), который мы затем можем преобразовать в правильный граф для анализа с помощью превосходной библиотеки python-graph.

Не стесняйтесь взять файл, созданный в результате экспорта 20.08.17. (Сжатие 75M)

Во-первых, нам нужно установить библиотеку графа:

git clone https://github.com/Shoobx/python-graph
cd python-graph/
make install-core
make install-dot
cd core
python3 setup.py install
cd ../dot
python3 setup.py install

Затем мы можем проанализировать файл графика и немного начать его изучение.

Затем мы можем исследовать либо граф родитель-потомок, исследуя G, либо граф потомок-родитель, исследуя GR.

Забавная игра для исследования - распечатать иерархию, переходя от дочерней категории вверх или от родительской категории вниз.

Если мы начнем с нескольких примеров страниц, которые мы хотим включить в нашу категорию, мы можем взглянуть на категории первого уровня и пойти вверх. Например, начнем с моей любимой группы Rilo Kiley.

Одна из категорий Рило Кили - Инди-рок-музыкальные группы из Калифорнии. Давайте сделаем DFS этой категории по восходящей ...

Если вы сделаете это, вы обнаружите, что общее количество итераций составляет около 14 тысяч категорий! Это намного больше, чем мы имели в виду, и понятно, почему это происходит. В конце концов мы попадаем в очень широкие категории, такие как «Искусство», «Творчество» и «Сознание».

При движении в этом направлении безопаснее устанавливать предел глубины! При исследовании выделяется одна вещь - Музыкальные группы, но неясно, будут ли они содержать сольных исполнителей.

Например, если мы обратимся к Дженни Льюис, ни одна из ее категорий не содержит упоминания о термине Музыкальные группы. Тем не менее, я вижу общий тип категории между этими двумя: Артисты Saddle Creek Records.

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

Хотя в этой категории могут отсутствовать некоторые артисты, которые не подписаны или у которых нет этой информации в Википедии, она, скорее всего, будет охватывать большинство групп, достаточно популярных, чтобы удовлетворить обоим условиям. Мы всегда можем взять объединение «Музыкальных групп» и «Артистов по звукозаписывающим компаниям», если нам не нравятся результаты, но для наших целей этого должно хватить.

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

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

Если мы проверим иерархию «Исполнители по лейблу», мы получим в основном то, что ищем, хотя некоторые идут в странном направлении, например, G-Unit выходит из-под контроля ...

Хотя кажется, что если мы ограничимся категориями, заканчивающимися на «артисты», у нас все хорошо. Мы можем экспортировать все эти категории в файл, а затем использовать их для извлечения списка статей для этих категорий. Мы собираемся изучить 808 различных звукозаписывающих компаний.

Извлечение статей из этих категорий

Мы можем вернуться к нашей полной статье - ›диаграмме категорий, чтобы перечислить все статьи, которые существуют в любой из предоставленных категорий. Следующий код Python сделает это (из списка категорий, разделенных строками).

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

Альтернативный способ извлечения элементов по категориям высокого уровня

Есть несколько способов снять шкуру с кошки, и иерархия категорий - довольно запутанный зверь.

Для некоторых очень распространенных типов вещей в Википедии есть специальная функция, известная как информационное окно, которая ожидает определенных свойств для этого типа элемента. Если ваша категория достаточно распространена, чтобы гарантировать это, это может быть еще одним полезным способом перечисления элементов по категориям. Полный список инфобоксов здесь.

У музыкального артиста есть именно такое информационное окно, поэтому мы можем найти все статьи, которые содержат это информационное окно!

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

Код Python, работающий из исходного XML-файла ниже:

В результате этого экспорта мы получили 88 580 статей, содержащих инфобокс «музыкальный исполнитель». К сожалению, это, по-видимому, включает участников группы, которые не выпускают музыку самостоятельно, поэтому этот набор данных не подходит для наших целей. Но теоретически вы можете найти это ценным для своих целей или использовать некоторые подробные свойства информационного окна для дальнейшего уточнения своей вселенной.

Вывод

Для моих целей я использовал иерархию под категорией «Исполнители по лейблу» для заполнения моей базы данных, что и было моей целью.

Набор данных Википедии невероятно богат, хотя и немного неорганизован, но чего можно ожидать от объединения всех человеческих знаний в один файл, достаточно малый, чтобы поместиться на мобильном телефоне?

Я бы с удовольствием провел неделю, просто просматривая данные категоризации, чтобы получить полезную информацию. Выражаясь философски на секунду, категоризация - это фундаментальный человеческий идеал. В каком-то смысле вы можете описать практически любой факт просто как классификацию. Платон и Аристотель много думали о категоризации по одной причине: это критически важно.

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

На следующей неделе мы рассмотрим ранжирование этих статей по важности.