[Занимательные задачки, Python, Алгоритмы, Читальный зал, Лайфхаки для гиков] Извлечение троих: Как найти пасхалки в книгах Стивена Кинга с помощью NLP алгоритмов
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
ПредысторияКоторую вы можете пропустить, но не станете, верно?Дело было за последней прочитанной мной книгой Стивена Кинга - "Томминокеры". В очередной раз скользнув по "еще одному американскому имени не очень-то главного героя", я вдруг задумалась: "А что, если имя, которое я даже толком не прочитала, было важным? Что, если это имя персонажа другой уже прочитанной мной истории? Что, если из-за того что я, среднестатистический человек в пятницу вечером, не держу в голове целый город (или даже штат) имен всех персонажей, я упускаю детали мира дядюшки Кинга?" Стало немного-невыносимо больно за возможные утраченные пасхалки.Не желая с этим мириться, я стала думать: "Как это можно исправить?". Гуглить каждое имя в книге - опасно, в первую очередь для пока еще свободного вечера пятницы. Более того, можно нарваться на спойлеры. Посмотреть уже созданные кем-то "карты" связей романов - можно, но эти карты создаются людьми, такими же, как мы с вами, а значит а) что-то могло быть упущено, б) снова могут быть спойлеры. Перечитывать книги (также, как я пересматривала сериал "Lost") для того, чтобы записывать отсылки в блокнот и рисовать карту - опасно, но уже для ментального здоровья. Но что, если перечитывать буду не я, а машина? Читать, выписывать себе имена персонажей, сопоставлять их с персонажами из других книг и на основе этого автоматически строить карту взаимосвязей. Звучит, как план.Базаи данных, и методов.Для начала необходимо было найти данные, а именно текст нескольких романов. Повезло, что подходящий датасет быстро нашелся на Kaggle : https://www.kaggle.com/ttalbitt/stephen-king-books. Архив содержит 16 романов на английском языке: часть цикла "Темной башни", "Кэрри", "Мизери", "Сияние" и др. Он стал основой, с одной единственной поправкой: к нему был добавлен текст "Томминокеров", ведь, как я говорила, это последняя прочитанная мной книга "короля ужасов", а потому проверять работу алгоритмов на ее примере мне было наиболее удобно.Реализовывала я все на Python, а потому сразу подгрузила главные библиотеки, из интересного здесь:
- zipfile - для работ с архивами, если вы, как и я, цените каждый свободный байт.
- nltk - банально, но эффективно для работы с NLP задачами, особенно на английском языке.
- spacy - еще одна NLP библиотека с акцентом на извлечение именованных сущностей.
- regex (re) - с текстом работаем? - работаем, а значит, без регулярок не обойтись.
- networkx - будем строить карты связей или графы.
Томминокерыстучатся в дверь первыми.Сначала, попробуем достать все необходимое (персонажи) хотя бы из одного романа: "Томминокеры". По ходу дела, заодно и узнаем, кто же все-таки главный герой романа (Бобби или Гард?). А если все сработает, то, повторив трюк с извлечением персонажей для всех, сможем соединить романы посредством совместно упоминаемых персонажей.Но как заставить машину извлечь имена персонажей? Под это в NLP выделили отдельную область NER (Named Entity Recognition) или распознавание именованных сущностей. Методы NER позволяют вычленить из текста сущности (объекты) и присвоить им тип: Личность, Локация, Организация, Дата и т.д. Разные библиотеки имеют разный набор типов сущностей, разные алгоритмы их извлечения для разных языков.Я остановилась на библиотеке SpaCy, на ее довольно точной модели для английского языка "en_core_web_lg". NLTK тоже неплохо справлялся, но SpaCy:
а) распознала чуть больше человеков,
б) была удобнее для обработки результатов: выдавала лист string-ов, а не tuple.Как сделали:
- Отдали текст романа модели, чтобы распознать все возможные сущности.
- Извлекли только те, что имеют тип "PERSON".
- Убрали принадлежность в виде " 's" (можно назвать примитивным стеммингом)
- Также убрали Mrs, Mr, Ms, но решили не убирать Dr.
- Оставили только имена состоящие более, чем из двух слов (например, Бобби Андерсон или Джим Гарденер), т.к. по отдельной извлеченной фамилии или имени точно определить персонажа не представляется возможным: а вдруг брат/сестра/тезка.
- Интереса ради: посчитали частоту упоминаний каждого имени.
Что получилось:Оказалось, что главный герой "Томминокеров" все-таки Бобби Андерсон, а Джим даже не на втором месте. Прости, Джим.
Топ-5 наиболее часто упоминаемых персонажей "Томминокеры"Однако, чтобы результаты были совсем честными, при подсчете стоило учитывать отдельно упоминаемые фамилии и имена, которые мы выкинули, и объединять их разные формы в одну (Джим Гарденер, Джеймс Гарденер и т.д.). Это все можно сделать, например, разбив на имя и фамилию или использовав NEL алгоритмы (связывание сущностей), но для первоначальной идеи поиска пасхалок нам это не требовалось. Все персонажи и не только они!Настал момент истины: повторим проделанное с "Томминокерами" для всех имеющихся романов и посмотрим, кто из "уважаемых" встречался в нескольких книгах и каких."И что получилось?" - 117 "человек", которые встречаются в 2 и более книгах. И если не знать американскую культуру 70-80-х (что вполне простительно), то можно строчка за строчкой просматривать имена и удивляться насколько хорошо мы с вами сработали. И даже такие попадания, как "Mike Mike" (простое дублирование имени) или "Roland Eddie" (сочетание имен героев) не омрачают наше счастье. Но длится оно все-таки недолго:
- На 10-й строчке вы встречаете Silva Compass - и нет, это не кличка очередного ребенка, а компания производящая... компасы.
- На 13-й строчке фирменный хук с правой нашей логике дает Sherlock Holmes. "Элементарно!" - кричите вы и понимаете, что сюда попали и другие знаменитые люди и персонажи, и среди них:
- Charlie the ChooChoo - 3 раза
- Elvis Presley - 5 раз
- Donald Duck - 3 раза
- Jesus Christ - 11 раз
"Ну и что делать?" - Можно было бы: настроить автоматическое обращение куда-то сюда или спарсить оттуда же лист персонажей и последовательно проверять, кто из наших героев в него входит, а кто остается за рамками."А что в итоге сделали?" - Вручную (ну не только) отсмотрели все 117 имен и присвоили каждому наблюдению категорию. Распределение по категориям можно видеть ниже.
Категории "упоминаемых" и кол-во вошедших в ту или иную категорию"Но почему?" - Потому что интересно! Интересно, кто такой Джон Дири, каких президентов любит/ненавидит, но упоминает Кинг, и какие в принципе люди/персонажи заслужили упоминания автора аж в нескольких книгах. Например, Джон Дири - вовсе не персонаж, а фирма выпускающая сельхоз технику: тракторы, ведь "Больше тракторов богу тракторов... или не тракторов (см. график ниже)" .
Самые "упоминаемые" и кол-во книг, в которых они встречаются"А карты то будут?" - Теперь точно будут. Когда мы знаем, кто есть кто, мы наконец можем взять только персонажей и извлечь книги, в которых они упомянуты. На основе этого для каждой книги мы можем получить следующее: книгу-соседа и силу связи (кол-во совместно упоминаемых персонажей), а значит построить и карту ниже.
Если со «Смиренными сёстрами Элурии» (The Little Sisters of Eluria), «Стрелком» (The Gunslinger), «Извлечением троих» (The Drawing of the Three), «Бесплодными землями» (The Waste Lands), «Колдуном и кристаллом» (Wizard and Glass), «Песней Сюзанны» (Song of Susannah) и самой «Тёмной башней» (The Dark Tower) все ясно и предсказуемо: все это книги цикла Темная башня, то связи с «Салимовым Уделом» (Salems Lot) и «Черным домом» (Black House) как раз то, к чему мы все это время шли: неочевидные отсылки, которые можно упустить, если не выписывать себе все имена.Так, можно упустить, что один из главных героев книги "Салемов удел", отец Каллагэн - второстепенный герой цикла «Темная Башня» (части: "Волки Кальи", "Песнь Сюзанны" и "Темная башня"). А "Черный дом" тесно связан с "Темной башней" другим персонажем, но упоминать и раскрывать детали я не буду во избежание спойлеров. Что дальшеи как обнаружить больше пасхалок?
- Можно посмотреть на локации, т.к. любой фанат Кинга может с лету назвать список городов и других мест "нежелательных для посещения" в силу происходящих там страстей: от Дерри до Хевена, через Оверлук и обратно. Действие некоторых романов и рассказов происходят в одной и той же местности (например, "Оно" или "Ловец Снов"), в других же просто может содержаться указатель на эти популярные места (например, дорожный знак «На Салимов Удел» упоминается в «Оно», «Кладбище домашних животных», «Ловец снов» и «Волки Кальи»).
- Можно попробовать зайти с дат (если уж мы идем по именованным сущностям), т.к. действительно интересно, могли ли события в разных книгах совпадать по времени. Однако извлечь полную дату из текста (день, месяц, год) будет тем еще испытанием.
- Повышая уровень сложности, можно взглянуть на совпадения во фразах/присказках/пословицах. Эта идея пришла ко мне, когда я пыталась объяснить связь "Салемова Удела" с другими книгами и натолкнулась на интересный факт, что в «Оно» главный герой повторяет для самоконцентрации ту же поговорку, что и Марк Петри в «Салемов Удел».
- Самое сложное: описание непосредственно событий. Читатели разных серий наверняка испытывали недюжее удовольствие, когда в упомянутой, казалось бы, вскользь истории распознавали отсылку на сюжет той или иной книги. У Кинга так же, вот только, как научить машину видеть такие неформализованные отсылки - очень интересный вопрос.
Признаюсь, что собираюсь двигаться дальше по описанному плану: искать географические, временные и другие отсылки, не зависимо от того, зайдет эта статья или нет. Но скорость моего "домашнего анализа", а тем более публикаций скорее всего будет коррелировать с чьим-то кроме моего интереса. Если у вас есть идеи, дополнения, комментарии, как и что можно сделать лучше/быстрее/просто сделать - делитесь, будет интересно посмотреть на это вместе коллективными глазами и разумом.Для тех, кому интересна реализация (главное, верить в себя), я залила весь код в специальный репозиторий.P.S. Имена ... самих книгведь это тоже имена!Я не стала выносить это в отдельную часть, ведь названия романов - это тоже своего рода имена, да и к тому же никакой магии анализа в этом нет: Ctrl+F и никакого мошенничества. Эту идею я взяла из самих "Томминокеров", где Кинг, не стесняясь, дает ссылку на "Сияние", хоть и экранизированное: "Grab Bobbi's ax and make like Jack Nicholson in The Shining?".Смотрим, что вышло:
Вышел неожиданный, но интересный граф! Из него видно, что сами романы упоминаются в других книгах чаще, чем их герои. Конечно, получившаяся паутинка не идеальна: название романа "Стрелок" и "кличка" Роланда из Темной башни будут идентичны (the Gunslinger), Misery может быть как названием романа, так и простым отчаянием с большой буквы и т.д. "И что же делать?" - Только с упоением читать романы и проверять самостоятельно, ведь этот анализ всего лишь прелюдия к главному удовольствию: чтению старой доброй страшной истории на ночь.
"Если вам кажется, что я вас обманываю, значит, вы невнимательно слушали вечерние новости". Стивен Кинг
===========
Источник:
habr.com
===========
Похожие новости:
- [Open source, Python] Dramatiq как современная альтернатива Celery: больше нет проблем с версиями и поддержкой Windows
- [Бизнес-модели, Энергия и элементы питания, Финансы в IT, Транспорт] General Motors вложится в добычу лития в Калифорнии для электромобилей
- [Читальный зал] Covid fake FAQ___draft_final_4 (окончательное доказательство)
- [Читальный зал, Научно-популярное, Экология, Биология] Охотник на охотника: как пауки ловят змей
- [Python, API] Сохраняем комментарии youtube в csv
- [Учебный процесс в IT, Читальный зал, Лайфхаки для гиков, IT-компании] Как совмещать работу и учебу? Опыт студентов онлайн-магистратуры
- [Читальный зал, История IT, Старое железо, Игры и игровые приставки] Всё, что мы знаем о RPG для мейнфреймов 1970-х годов, и почему мы больше не можем в них поиграть (перевод)
- [Python, Машинное обучение] Эволюция OLEG AI. Нейросеть, утечки памяти, нагрузка
- [Python, Алгоритмы, Big Data, Машинное обучение, Искусственный интеллект] Data Phoenix Digest — 01.07.2021
- [Python, Алгоритмы, Big Data, Машинное обучение, Искусственный интеллект] Data Phoenix Digest — 01.07.2021
Теги для поиска: #_zanimatelnye_zadachki (Занимательные задачки), #_python, #_algoritmy (Алгоритмы), #_chitalnyj_zal (Читальный зал), #_lajfhaki_dlja_gikov (Лайфхаки для гиков), #_nlp, #_stiven_king (Стивен Кинг), #_pashalki (пасхалки), #_multivselennaja (мультивселенная), #_python, #_ner, #_zanimatelnye_zadachki (
Занимательные задачки
), #_python, #_algoritmy (
Алгоритмы
), #_chitalnyj_zal (
Читальный зал
), #_lajfhaki_dlja_gikov (
Лайфхаки для гиков
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 02:38
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
ПредысторияКоторую вы можете пропустить, но не станете, верно?Дело было за последней прочитанной мной книгой Стивена Кинга - "Томминокеры". В очередной раз скользнув по "еще одному американскому имени не очень-то главного героя", я вдруг задумалась: "А что, если имя, которое я даже толком не прочитала, было важным? Что, если это имя персонажа другой уже прочитанной мной истории? Что, если из-за того что я, среднестатистический человек в пятницу вечером, не держу в голове целый город (или даже штат) имен всех персонажей, я упускаю детали мира дядюшки Кинга?" Стало немного-невыносимо больно за возможные утраченные пасхалки.Не желая с этим мириться, я стала думать: "Как это можно исправить?". Гуглить каждое имя в книге - опасно, в первую очередь для пока еще свободного вечера пятницы. Более того, можно нарваться на спойлеры. Посмотреть уже созданные кем-то "карты" связей романов - можно, но эти карты создаются людьми, такими же, как мы с вами, а значит а) что-то могло быть упущено, б) снова могут быть спойлеры. Перечитывать книги (также, как я пересматривала сериал "Lost") для того, чтобы записывать отсылки в блокнот и рисовать карту - опасно, но уже для ментального здоровья. Но что, если перечитывать буду не я, а машина? Читать, выписывать себе имена персонажей, сопоставлять их с персонажами из других книг и на основе этого автоматически строить карту взаимосвязей. Звучит, как план.Базаи данных, и методов.Для начала необходимо было найти данные, а именно текст нескольких романов. Повезло, что подходящий датасет быстро нашелся на Kaggle : https://www.kaggle.com/ttalbitt/stephen-king-books. Архив содержит 16 романов на английском языке: часть цикла "Темной башни", "Кэрри", "Мизери", "Сияние" и др. Он стал основой, с одной единственной поправкой: к нему был добавлен текст "Томминокеров", ведь, как я говорила, это последняя прочитанная мной книга "короля ужасов", а потому проверять работу алгоритмов на ее примере мне было наиболее удобно.Реализовывала я все на Python, а потому сразу подгрузила главные библиотеки, из интересного здесь:
а) распознала чуть больше человеков, б) была удобнее для обработки результатов: выдавала лист string-ов, а не tuple.Как сделали:
Топ-5 наиболее часто упоминаемых персонажей "Томминокеры"Однако, чтобы результаты были совсем честными, при подсчете стоило учитывать отдельно упоминаемые фамилии и имена, которые мы выкинули, и объединять их разные формы в одну (Джим Гарденер, Джеймс Гарденер и т.д.). Это все можно сделать, например, разбив на имя и фамилию или использовав NEL алгоритмы (связывание сущностей), но для первоначальной идеи поиска пасхалок нам это не требовалось. Все персонажи и не только они!Настал момент истины: повторим проделанное с "Томминокерами" для всех имеющихся романов и посмотрим, кто из "уважаемых" встречался в нескольких книгах и каких."И что получилось?" - 117 "человек", которые встречаются в 2 и более книгах. И если не знать американскую культуру 70-80-х (что вполне простительно), то можно строчка за строчкой просматривать имена и удивляться насколько хорошо мы с вами сработали. И даже такие попадания, как "Mike Mike" (простое дублирование имени) или "Roland Eddie" (сочетание имен героев) не омрачают наше счастье. Но длится оно все-таки недолго:
Категории "упоминаемых" и кол-во вошедших в ту или иную категорию"Но почему?" - Потому что интересно! Интересно, кто такой Джон Дири, каких президентов любит/ненавидит, но упоминает Кинг, и какие в принципе люди/персонажи заслужили упоминания автора аж в нескольких книгах. Например, Джон Дири - вовсе не персонаж, а фирма выпускающая сельхоз технику: тракторы, ведь "Больше тракторов богу тракторов... или не тракторов (см. график ниже)" . Самые "упоминаемые" и кол-во книг, в которых они встречаются"А карты то будут?" - Теперь точно будут. Когда мы знаем, кто есть кто, мы наконец можем взять только персонажей и извлечь книги, в которых они упомянуты. На основе этого для каждой книги мы можем получить следующее: книгу-соседа и силу связи (кол-во совместно упоминаемых персонажей), а значит построить и карту ниже. Если со «Смиренными сёстрами Элурии» (The Little Sisters of Eluria), «Стрелком» (The Gunslinger), «Извлечением троих» (The Drawing of the Three), «Бесплодными землями» (The Waste Lands), «Колдуном и кристаллом» (Wizard and Glass), «Песней Сюзанны» (Song of Susannah) и самой «Тёмной башней» (The Dark Tower) все ясно и предсказуемо: все это книги цикла Темная башня, то связи с «Салимовым Уделом» (Salems Lot) и «Черным домом» (Black House) как раз то, к чему мы все это время шли: неочевидные отсылки, которые можно упустить, если не выписывать себе все имена.Так, можно упустить, что один из главных героев книги "Салемов удел", отец Каллагэн - второстепенный герой цикла «Темная Башня» (части: "Волки Кальи", "Песнь Сюзанны" и "Темная башня"). А "Черный дом" тесно связан с "Темной башней" другим персонажем, но упоминать и раскрывать детали я не буду во избежание спойлеров. Что дальшеи как обнаружить больше пасхалок?
Вышел неожиданный, но интересный граф! Из него видно, что сами романы упоминаются в других книгах чаще, чем их герои. Конечно, получившаяся паутинка не идеальна: название романа "Стрелок" и "кличка" Роланда из Темной башни будут идентичны (the Gunslinger), Misery может быть как названием романа, так и простым отчаянием с большой буквы и т.д. "И что же делать?" - Только с упоением читать романы и проверять самостоятельно, ведь этот анализ всего лишь прелюдия к главному удовольствию: чтению старой доброй страшной истории на ночь. "Если вам кажется, что я вас обманываю, значит, вы невнимательно слушали вечерние новости". Стивен Кинг
=========== Источник: habr.com =========== Похожие новости:
Занимательные задачки ), #_python, #_algoritmy ( Алгоритмы ), #_chitalnyj_zal ( Читальный зал ), #_lajfhaki_dlja_gikov ( Лайфхаки для гиков ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 02:38
Часовой пояс: UTC + 5