. Рейтинг фантастических романов, или Я сделаю свой «IMDB для книг», с преферансом и библиотекаршами
Рейтинг фантастических романов, или Я сделаю свой «IMDB для книг», с преферансом и библиотекаршами

Рейтинг фантастических романов, или Я сделаю свой «IMDB для книг», с преферансом и библиотекаршами

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

И вот, терзаясь муками выбора, я забил в поиск «IMDB for books» и… не нашел ничего пристойного. Весь интернет забит рекомендательными сервисами для книг, и все они выдают полную чушь. Вот, например, топ имхонета для раздела «Самая лучшая фантастика и фэнтези»:

Эээ… Это совсем не то, что я ожидал увидеть на первых местах в рейтинге фантастики. «Мы пойдём другим путём», — подумал я. Отказавшись от идеи найти нормальный читательский рейтинг, я просто пошёл в Вики, нашёл список лауреатов премий Хьюго и Небьюла и выбрал пару-тройку книг — как, собственно, я всегда раньше и делал.

«А не замутить ли мне свой рейтинг книг, взяв за основу престижные премии?» — внезапно подумал я. И замутил. Знакомьтесь: top-books.info

Итак, мне потребовалось сделать следующее:

1. Найти и распарсить логи номинантов и победителей премий; 2. Сформировать из них списки книг и авторов; 3. Присвоить каждой книге рейтинг; 4. Найти и приклеить к каждой книге картинку и описание; 5. Найти и приклеить к каждому автору краткую биографическую справку; 6. Сделать по всему этому поиск; 7. Прикрутить голосовалку.

А теперь подробнее…

Логи премий

Я решил ограничиться тремя премиями: Hugo, Nebula и Locus. Все остальные либо узкоспециализированные, либо даются недавно.

С Locus оказалось сложнее. Списки номинантов пришлось собирать по годам: www.locusmag.com/SFAwards/Db/Locus.html

К тому же в этих списках огромное количество номинантов, штук по 20, большая часть из которых мне абсолютно ничего не говорила. Так что я ограничился первой пятеркой номинантов из категории «Best Novel» (выдавались в 1971-1981 гг) и категорий «SF Novel», «Fantasy Novel» (с 1982 по 2011).

Книги и авторы

Разбирал я всё это дело скриптами, написанными на лучшем в мире языке — JavaSсript-е :). Hugo и Nebula разобрались легко (в Википедии всё-таки единого стиля оформления придерживаются), с Locus пришлось немного помучиться. Вот так примерно выглядел разбор логов Locus-а:

В итоге я получил примерно вот такой список авторов:

И вот такой список книг:

У номинантов на Locus ещё есть поле place — занятое место. Hugo и Nebula ранжирования для номинантов не дают.

Рейтинги

Я перепробовал несколько вариантов, и в итоге остановился на вот такой формуле:

rating = 6 + 3 * (sum(s[i])) / possibleAwards + yearTotal / 100

Здесь possibleAwards — число наград, которые могла теоретически получить книга (= число премий, выдававшихся в год публикации книги), yearTotal — общее количество номинантов премий в год публикации книги, s[i] — набранный книгой балл по каждой премии.

s[i] считалось так: 1, если книга выигрывала премию; 1/число номинантов, если книга была номинирована на Hugo или Nebula, но не получала премию; (число номинантов — занятое место + 1)/число номинантов для претендентов на Locus.

Итого, каждая книга получала 6 баллов просто так, по факту попадания в шорт-лист какой-нибудь премии; от 0 до 3 баллов в зависимости от полученных премий (итого от 6 до 9); плюс небольшую поправку в виде общего числа номинантов в тот год / 100, для того, чтобы (а) немного пессимизировать книги, получавшие премии в самом начале, когда списков номинантов ещё не было; (б) из того соображения, что, если в какой-то год было много номинантов, то год в целом был удачнее предыдущих.

Например, возьмём «Проклятье Шалиона»:

Книга набирает 0.16(6) балла за номинацию на Хьюго (1 из 6 номинантов) + 0.6 балла за Локус (3-е место из 5) + 0.11 за общее число претендентов (6 + 5) на премии, в которых книга участвовала. Итого: 6.9.

В итоге, топ-10 приобрел следующий вид:

Из десятки лично я, правда, читал только «Паладин душ», «Дюну» и «Сами боги», но их нахождение в топ-10 представлялось мне вполне адекватным.

Рейтинг авторов

С рейтингом авторов пришлось помучиться. Мне хотелось, чтобы автор с большим количеством хороших книг был в топе выше автора с одной, но очень хорошей. Я перебрал много формул, и остановился на такой:

rating = (sum + 3)/(n + 1)

Здесь sum — сумма рейтингов книг автора, n — количество книг. Легко заметить, что эта формула фактически эквивалентна тому, что каждому автору засчитывается фиктивная книга с рейтингом 3, что и позволяет пессимизировать авторов с малым количеством книг. Топ-10 в итоге получился таким:

1 Heinlein, Robert A. 2 Le Guin, Ursula K. 3 Asimov, Isaac 4 Card, Orson Scott 5 Bujold, Lois McMaster 6 Willis, Connie 7 Brin, David 8 Haldeman, Joe 9 Clarke, Arthur C. 10 Pohl, Frederik

Вот этот топ меня полностью удовлетворил :)

Майним данные о книгах

Информацию о книгах я набрал из Amazon Product Advertising API — в рамках партнерской программы Амазон разрешает использовать информацию о продаваемых изданиях. Меня интересовали картинки и описания. В целом, схема работы была такая:

1. Выбираем книгу 2. Делаем запрос по заголовку книги с фильтром по одному из авторов 3. Ищем в ответе item-ы с тем же заголовком и автором 4. Записываем уникальный идентификатор (ASIN) и reviews. 5. Если чего-то не нашли, пробуем искать по другому заголовку (если у книги их несколько) либо в другом индексе.

Я искал сначала в индексе Kindle Store (я за прогресс и всё такое :)), а потом по бумажным книгам. В итоге, из 580 книг 378 удалось найти в Kindle Store.

Ищет Amazon PAAPI довольно адекватно, хотя на первые места могут проскакивать какие-то левые ответы. Единственное, что API полностью игнорирует диакритические знаки и не находит таких авторов, как Miéville и такие заголовки, как Tales of Nevèrÿon — их, в итоге, пришлось искать руками.

Майним данные об авторах

Авторов пришлось выцеплять из Википедии посредством Wikimedia API. Велосипед, честно говоря, тот ещё. В итоге, 90% запросов по авторам нормально отработало просто по имени и фамилии, но те 10%, у которых распространенные имена, пришлось потом перезабивать руками. Если же к поисковому запросу помимо имени дописать что-нибудь типа «author» или «fantasy writer» — то начнут нормально работать 10% неуникальных имен, но остальные 90% сломаются напрочь.

В итоге, для каждого автора я вытащил из википедии преамбулу к статье. Дорогие редакторы википедии, вам очень не помешает guideline для преамбул. Многие статьи сурово отдают капитанством (David Brin, например), в других в преамбуле целое сочинение написано (Isaac Asimov).

Поиск

Ну, тут особо выбора не было — Google Custom Search Engine. Пришлось немного пошаманить CSS-ом, чтобы расположить его там, где я хотел, но вроде работает.

Кстати, у Google CSE обратная к Амазону проблема — по Mieville отказывается искать, нужно забивать Miéville.

Голосовалка

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

Господа разработчики 2gis API и Leaflet API! Простите меня! Ваши API — сказка по сравнению с FB. Такого плохо организованного и отвратительно документированного API я ещё не встречал. Почти неделя мучений потребовалось мне, чтобы прикрутить эту байду.

Господа разработчики Фейсбука! Наведите порядок в документации! Невозможно работать совершенно.

Русская версия

В изначальных планах стояло так же создание и русскоязычной версии, но, как оказалось, никакого русскоязычного контента вытянуть я не могу. У Озона своего API нет, русская Вики и половины авторов не знает. Так что в этом месте полный фейл.

И что дальше?

Да ничего, особо. Господа любители фантастики — наслаждайтесь. Рейтинг, по моим ощущениям, более чем адекватен. (В порядке эксперимента я прочитал №1 в списке — "Американские боги" Нила Геймана. Очень крутая книжка, доложу я вам.) Если какие-то оценки кажутся вам неправильными — welcome, голосуйте. Только учтите, что у начальных оценок выставлен вес в 1000 голосов, так что перебить их, кхм, непросто. Лично я первым делом выставил десятки сильно недооценным, на мой взгляд, "Проклятью Шалиона", "Ночи в тоскливом октябре" и "Другому ветру".

Сразу предупреждаю, что у литературных премий в чести серьёзное чтиво, поэтому развлекательная фантастика представлена в рейтинге очень слабо. То же, к сожалению, относится и к пионерам фантастического жанра — в рейтинге широко представлена литература, начиная с 60-х годов, более ранняя — с перебоями. (Кстати, волевым волюнтаристским решением я добавил в рейтинг «Властелина колец» с рейтингом 9.0 и «Хоббита» с рейтингом 8.0, а то Толкиен с единственным «Сильмариллионом» выглядел странновато.)

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

📎📎📎📎📎📎📎📎📎📎