Программирование Викиданных/Аниме
В рамках статьи исследуется объект Викиданных «аниме». С помощью SPARQL-запросов, вычисляемых на объектах типа «аниме» в Викиданных, решены такие задачи: получен список сэйю, упорядоченный по числу озвученных ими аниме, построена гистограмма числа аниме, озвученных одним сэйю, построен граф, связывающий сэйю и озвученные ими аниме, получена оценка трудоспособного возраста сэйю.
Экземпляры объекта «Аниме»
правитьАниме — это японская мультипликация. У каждого аниме есть свои актёры озвучивания. В дальнейшем под «сэйю» будем понимать японского актёра озвучивания. В японской анимации слова «актёры озвучивания» и «сэйю» являются синонимами[1]. Под словом «тайтл» (от англ. «title», название) обычно понимают конкретное аниме[2]. В общем же смысле слово «тайтл» означает понятие, объединяющее различные виды продукции (от кинофильма до романа), созданные на основе конкретного произведения, за которым закреплено строго определённое название [3].
Чтобы работать со списком аниме, о которых есть информация на Викиданных, нам понадобятся собственно объект «аниме» (Q1107), а также свойство «экземпляр» (P31).
Получим список всех аниме без учёта подклассов с помощью такого запроса:
# List of instances of anime
SELECT ?anime ?animeLabel
WHERE
{
?anime wdt:P31 wd:Q1107. # instance of anime
SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en,ja" }
}
то получим 216 результатов. В 2017 году подобный запрос возвращал 683 результата. В действительности в Викиданных объектов аниме гораздо больше, но они являются экземплярами не объекта «аниме», а его подклассов.
Список жанров аниме (подклассов объекта «аниме» (Q1107)) можно получить следующим образом:
# Select anime and its subclasses with number of titles corresponding to these subclasses
SELECT ?subAnime ?subAnimeLabel (COUNT(?subAnimeInstance) AS ?count) WHERE {
?subAnime wdt:P279* wd:Q1107. # select anime subclass list
?subAnimeInstance wdt:P31 ?subAnime # connect titles and their subclasses
SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en,ja". }
}
GROUP BY ?subAnime ?subAnimeLabel
ORDER BY DESC(?count)
Полученная классификация аниме по жанрам не идеальна, так как есть большое смещение в сторону аниме-сериалов: из 4757 тайтлов 2917 отнесены к жанру «аниме-сериал» (61,3 %); вероятно, классификация жанров аниме в Викиданных требует дальнейшего уточнения. Также в подклассы попали понятия, относящиеся не к общей классификации, а к отдельным аниме, например, «Евангелион».
Получим список всех аниме, включая тайтлы, относящиеся к жанрам аниме:
# List of instances of anime and subclasses of anime
SELECT ?anime ?animeLabel
WHERE
{
?anime wdt:P31/wdt:P279* wd:Q1107. # instance of anime with subclasses
SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en,ja" }
}
SPARQL-запрос, 683 результата без учёта подклассов (2017) и 4756 результатов со всеми подклассами (жанрами) аниме (2021).
👍 Аниме, о которых есть наиболее полная информация на Викиданных — это Гуррен-Лаганн, Space Battleship Yamato, Project A-ko
👎 Аниме с малоинформативными записями на Викиданных: Doraemon, The Animal Conference on the Environment, Assassins Pride
Среди всех аниме-тайтлов в Викиданных больше всего свойств по данным сервиса ProWD у Fullmetal Alchemist: The Sacred Star of Milos (23 свойства).
Упорядоченный список сэйю по числу озвученных ими аниме
правитьРазумеется, в большинстве аниме есть не только один персонаж. Соответственно, разных персонажей озвучивают разные сэйю. Большинство сэйю озвучили за свою карьеру несколько тайтлов, а многие — несколько десятков тайтлов. Талантливых сэйю приглашают озвучивать сразу несколько персонажей в одном аниме. Одним из самых популярных сэйю является Хироси Камия, который за свою карьеру озвучил более 180 аниме. Самым известным аниме с его участием является «Атака титанов», где он озвучил одного из главных персонажей — капитана Леви.
Построим упорядоченный список сэйю по числу озвученных ими аниме.
# Ordered list of actors (seiyu) according to the number of anime where they took part in.
SELECT ?seiyu ?seiyuLabel (COUNT(?anime) AS ?count)
WHERE
{
?anime wdt:P31/wdt:P279* wd:Q1107; # instance of anime or its subclasses
wdt:P725 ?seiyu. # instance of seiyu (voice actor)
SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en,ja" }
}
GROUP BY ?seiyu ?seiyuLabel # group by seiyu
ORDER BY DESC(?count) # order by count of voiced anime
SPARQL-запрос, 148 результатов без подклассов (2017) и 2910 результатов со всеми подклассами аниме (2021).
График по числу сэйю, озвучивших одно и более аниме
правитьБыло бы интересно построить график (линейную диаграмму) сэйю, озвучивших аниме. Чем больше аниме озвучил сэйю, тем правее на диаграмме он будет находиться.
# Graph of the number of voice actings of different seiyu
#defaultView:LineChart # use line chart as result representation
SELECT ?seiyuRoles (COUNT(?seiyuRoles) AS ?quantity) WHERE { # count the number of seiyu that have a same number of roles
FILTER(?seiyuRoles < 71) # limit the output as there are few seiyu that act in more than 71 anime
{
SELECT (COUNT(?seiyu) AS ?seiyuRoles) WHERE { # count quantity of voice acting by one seiyu
?anime wdt:P31/wdt:P279* wd:Q1107; # instance of anime and its subclasses
wdt:P725 ?seiyu. # instance of seiyu
SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en,ja"}
}
GROUP BY ?anime # group list by number of voiced anime
ORDER BY DESC(?seiyuRoles) # order by voice acting quantity (descending)
}
}
GROUP BY ?seiyuRoles
ORDER BY DESC(?seiyuRoles) # grouping and sorting seiyu by number of voice actings
SPARQL-запрос, 13 результатов без подклассов (2017) и 58 результатов со всеми подклассами аниме (2021).
Очевидно, что чем большее количество аниме берётся в расчёт, тем меньшее количество сэйю участвует в озвучке (рис. 1). Многие сэйю, как показано на диаграмме, озвучили только одно аниме — на графике их оказалось 254. Это может быть связано с неполнотой Викиданных.
Граф, связывающий сэйю и озвученные ими аниме
правитьИтак, многие сэйю за свою карьеру успевают озвучить несколько аниме. Построим граф, связывающий сэйю и озвученные ими аниме, чтобы нагляднее показать эту взаимосвязь.
# Graph of seiyu with more than one anime
#defaultView:Graph
SELECT DISTINCT ?item ?itemLabel ?rgb ?link
WHERE
{ # voice actors (seiyu) with more than one anime
VALUES ?toggle { true false }
VALUES ?seiyu { wd:Q6381410 wd:Q1347031 wd:Q1207010
wd:Q233902 wd:Q1323728 wd:Q2440809
wd:Q355173 wd:Q957795 wd:Q50033}
?anime wdt:P31/wdt:P279* wd:Q1107; # instance of anime or its subclass
wdt:P725 ?seiyu; # seiyu who voiced this anime
SERVICE wikibase:label {bd:serviceParam wikibase:language "ru,en,ja"}
BIND(IF(?toggle,?anime,?seiyu) AS ?item).
BIND(IF(?toggle,?animeLabel,?seiyuLabel) AS ?itemLabel).
BIND(IF(?toggle,"FFFFFF","7FFF00") AS ?rgb).
BIND(IF(?toggle,"",?anime) AS ?link).
}
SPARQL-запрос, 826 результатов без подклассов (2017) и 494 результата со всеми подклассами аниме (2021).
Конструкция BIND(IF(?toggle, ?variable1, ?variable2)) позволяет определить тип вершины графа: например, в строке 14 если для объекта ?toggle принимает значение true, то этот объект соответствует аниме, иначе — сэйю. Аналогично в строках 15 и 16 определяется тип текстовой метки для вершины и цвет вершины.
Полнота Викиданных
правитьСписок тайтлов в Русской Википедии содержит 1638 аниме. Также можно посмотреть телевизионные показы аниме в России по годам.
В Английской Википедии можно наблюдать примерно такой же результат. Можно просмотреть все аниме с помощью категорий аниме, которых на данный момент 17.
На сайте [4] в списке аниме 801 страница по 20 наименований. Нетрудно посчитать, что на сайте есть информация о 16020 тайтлах, в то время как в Викиданных объектов, описывающих аниме, всего 4756. К тому же, стоит учитывать, что скорость выхода новых аниме довольно велика. Из этого можно сделать вывод, что Викиданные крайне неполно отражают данные (есть информация только о 29.6% аниме). То же самое касается и жанров: в разделе поиска [4] доступны 42 жанра аниме, в то время как Викиданные содержат информацию только о 17.
Возможно, приведённые ниже статьи и сайты не будут являться АИ, но с их помощью можно проанализировать информацию об имеющихся аниме и сделать дополнительные выводы о неполноте Викиданных.
На сайте [5] приведён список из 5756 аниме.
На сайте [6] приведён список из 1968 аниме.
На сайте [7] приведён список из 4795 аниме.
На сайте [8] приведён список из 420 аниме.
Можно сделать вывод, что различные сайты имеют разную информацию об имеющихся аниме. Какие-то сайты появились позже, какие-то раньше, поэтому количество аниме на них может разниться, причём довольно серьёзно. Если упорядочить все приведённые сайты, данные Русской Википедии, Английской Википедии и Викиданные по количеству аниме, то Викиданные окажутся не на последнем месте, но, например, сайту [4] они уступают почти в 4 раза.
Вспомним запрос, в котором говорилось о 2684 сэйю на Викиданных. Дело в том, что поиск производился только по актёрам озвучивания, связанным с аниме, поэтому результат оказался таким скромным. Если запросить информацию о всех актёрах озвучивания (то есть убрать ограничение на категорию аниме), то результат изменится.
# Ordered list of actors according to the quantity of projects voiced by them
SELECT ?actor ?actorLabel (COUNT(?project) AS ?count)
WHERE
{
?project wdt:P725 ?actor. # instance of voice actor
SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en,ja" }
}
GROUP BY ?actor ?actorLabel
ORDER BY DESC(?count) # order by number of voiced projects
SPARQL-запрос, 3965 результатов (2017) и 14744 результата (2021).
Значительный прирост числа результатов относительно вышеупомянутого запроса напоминает нам о том, что в индустрии озвучивания гораздо больше направлений, чем только аниме - например, озвучивание фильмов и видеоигр. Сэйю могут участвовать и в работе над такими проектами, и это нужно учитывать при формировании запросов.
Указана ли дата публикации у аниме?
правитьКаждый ценитель японской анимации желает знать, в каком году вышло его любимое аниме. Викиданные располагают этой информацией не в полной мере. Напишем скрипт, который бы показывал количество аниме с незаполненным полем "publication date" (дата публикации). То, что поле должно быть пустым, указано в шестой строке с помощью пустых квадратных скобок.
# List of anime the release date of which is empty
SELECT ?anime ?animeLabel
WHERE
{
?anime wdt:P31/wdt:P279* wd:Q1107; # instance of anime
FILTER NOT EXISTS { ?anime wdt:P577 [] } # return the list of anime the release date of which is empty
SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en,ja" }
}
SPARQL-запрос, 237 результатов без подклассов (2017), 2940 результатов со всеми подклассами аниме (2021).
На 2021 год из 4756 аниме на Викиданных у 2940, а это 61.8%, не указана дата выхода. В 2017-м из 683 аниме на Викиданных только 237 (то есть 34.7%) не имели указанной даты выхода. Похоже, что, к сожалению, увеличение количества информации не всегда сопровождается сохранением её качества.
Анализ возраста, в котором сэйю озвучивают аниме
правитьКак и в любой другой профессии, у актёра озвучки есть возраст, когда он находится в «расцвете сил» и озвучивает множество аниме, а спустя какое-то время уходит на пенсию. Использование SPARQL и внешних инструментов для анализа данных, таких как язык программирования Python, может позволить оценить такой возраст на основе информации из Викиданных.
Чтобы получить исходные данные для исследования, необходимо выполнить три SPARQL-скрипта и экспортировать результаты их выполнения в формате .csv (формате представления табличных данных, в котором таблица хранится в виде последовательности строк текста. Эти строки содержат значения полей таблицы, разделённые запятыми).
Получить список всех зарегистрированных в Викиданных сэйю и их дат рождения можно двумя способами:
# Get list of all seiyu objects, their names and birth dates
SELECT ?seiyu ?seiyuLabel ?bDate WHERE {
?anime (wdt:P31/(wdt:P279*)) wd:Q1107;
wdt:P725 ?seiyu. # seiyu is anime voice actors
?seiyu wdt:P569 ?bDate. # has a birthday
SERVICE wikibase:label {bd:serviceParam wikibase:language "ru,en,ja"}
}
GROUP BY ?seiyu ?seiyuLabel ?bDate
SPARQL-запрос, 2515 результатов (2021).
# Get list of all seiyu objects, their names and birth dates
SELECT ?seiyu (SAMPLE(?seiyu) AS ?seiyuLabel) ?bDate WHERE {
?anime (wdt:P31/(wdt:P279*)) wd:Q1107;
wdt:P725 ?seiyu. # seiyu is anime voice actors
?seiyu wdt:P569 ?bDate. # has a birthday
?seiyu rdfs:label ?label.
}
GROUP BY ?seiyu ?bDate
SPARQL-запрос, 2515 результатов (2021).
Различия между скриптами заключаются в том, что:
- метка (имя) сэйю в первом случае получается с помощью переменной ?seiyuLabel (в таком случае нужно указать команду SERVICE для установки языков, на котором будут возвращены имена), а во втором — с помощью конструкции rdfs:label;
- в первом варианте скрипта необходимо указывать ?seiyuLabel как параметр GROUP BY, чтобы связать объекты сэйю и их метки.
Получение списка всех зарегистрированных в Викиданных аниме и дат их выхода:
# Get all anime objects, their names and release dates
SELECT ?anime ?animeLabel ?animePubDate ?animeSeriesStartDate WHERE {
?anime (wdt:P31/(wdt:P279*)) wd:Q1107. # objects of anime and its subclasses
OPTIONAL { ?anime wdt:P577 ?animePubDate. } # anime may have a release date if it's a movie...
OPTIONAL { ?anime wdt:P580 ?animeSeriesStartDate. } # ...or start date if it's series; or have neither, it will be checked in Python
SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en,ja" }
}
SPARQL-запрос, 5264 результата (2021). Обратите внимание, что скрипт получает не только даты выхода полнометражных аниме (свойство P577), но и даты начала показа сериалов (свойство P580).
Получение ссылок между объектами сэйю и аниме, которые они озвучивали:
# List of links between seiyu and anime where they are involved in
SELECT DISTINCT ?item ?itemLabel ?link ?itemType
WHERE
{
VALUES ?toggle { true false }
?anime wdt:P31/wdt:P279* wd:Q1107; # instance of anime or its subclass
wdt:P725 ?seiyu. # list seiyu who acted in this anime
BIND(IF(?toggle,?anime,?seiyu) AS ?item). # connection of "from anime to seiyu" type
BIND(IF(?toggle,?animeLabel,?seiyuLabel) AS ?itemLabel). # similar connection between labels
BIND(IF(?toggle,?seiyu,?anime) AS ?link). # # connection of "from seiyu to anime" type
BIND(IF(?toggle,?seiyu,"seiyu") AS ?itemType). # service column to distinguish seiyu and anime items
# if the item describes a seiyu, its value is "seiyu",
# the link is kept otherwise
SERVICE wikibase:label {bd:serviceParam wikibase:language "ru,en,ja"}
}
SPARQL-запрос, 27092 результата (2021).
Результат анализа удобно представить в виде гистограммы. Для её построения можно воспользоваться средствами таких библиотек для Python, как Pandas для обработки табличных данных и Matplotlib для непосредственно построения графиков. Код скрипта, создающего гистограмму, опубликован на сервисе GitHub.
В результате получим гистограмму, по оси абсцисс которой отложен возраст в годах, а по оси ординат — суммарное количество ролей, озвученных всеми сэйю такого возраста. Получившаяся гистограмма представлена на рис. 3.
Отметим следующий забавный факт: в Викиданных нашлись случаи, когда сэйю родился позже, когда вышло аниме с его участием. Вероятно, это связано с отсутствием информации в Викиданных о втором сезоне/перезапуске аниме. Например, на 2021 год такая ситуация наблюдается для аниме Sazae-san и сэйю Нобунага Симадзаки.
Будущая работа
править- Вывести 10 самых популярных аниме, вышедших на экраны в текущем году. Популярность оценить по числу статей в разных языковых разделах. Для подсчёта числа статей об объекте Викиданных используйте SPARQL-конструкцию wikibase:sitelinks. Например, если статья про аниме есть в трёх Википедиях на русском, английском и испанском языках, то его популярность равна трём.
- Вывести пять аниме, в которых задействовано самое большое число сэйю-женщин.
- Построить пузырьковую диаграмму (BubbleChart) распределения аниме по жанрам (сколько аниме в каждом жанре), воспользовавшись свойством "подкласс".
- Отметить на карте места рождения сэйю.
- Построить гистограмму или пузырьковую диаграмму национальностей сэйю.
- Построить гистограмму количества вышедших аниме по годам или количества сэйю по годам рождения.
- Построить гистограммы, аналогичные рис. 3, но с учётом пола сэйю (одну для мужчин, другую для женщин).
Упражнения
править
Примечания
правитьЛитература
править- Andrew Krizhanovsky, Daria Boollieva Аниме. — 2017.
Ссылки
править- Индустрия аниме shikimori.org. — 2017.
- Parenchenkov E. Anime (англ.). ProWD (2021). Проверено 24 сентября 2021.