![](https://habrastorage.org/files/fad/2de/487/fad2de4870fc4112bb128057c9573980.png)
Скачать перевод в виде документа Mathematica, который содержит весь код использованный в статье, можно здесь (архив, ~76 МБ).
Введение
Некоторое время назад, если быть точным — 515 дней, вышел пост Маттиаса Одисио (Matthias Odisio) под названием “Random and Optimal Mathematica Walks on IMDb’s Top Films” (Случайные и оптимальные блуждания Mathematica по списку 250 лучших фильмов по версии IMDB). В нем рассказывается о том, каким образом можно получить оптимальную последовательность просмотра фильмов из соответствующего списка, основанную на близости жанров фильмов и близости постеров фильмов с точки зрения цвета.
In[1]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_2.png](https://habrastorage.org/getpro/habr/post_images/22b/558/3c1/22b5583c1ab974f6fe016006ba74bae8.png)
Out[1]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_3.png](https://habrastorage.org/getpro/habr/post_images/7a4/130/266/7a41302660c44a77b3266895ef833c66.png)
Идея этого поста показалась мне довольно интересной, но мне захотелось её существенно расширить и углубить, следуя нескольким идеям:
- Построить более совершенную функцию, оценивающую близость фильмов, так как мне кажется, что построение функции расстояния между фильмами на основе близости постеров фильмов по использующимся в них цветам и жанрам фильмов не достаточно объективно. Мне представляется разумным построить функцию расстояния между фильмами на основе нескольких факторов: жанров фильма, описания фильма, актерского состава, режиссера(-ов), года производства, сценариста(-ов) и пр.
- В статье Маттиаса использовались лишь данные Wolfram|Alpha, что, безусловно, упрощает задачу и компактизирует код. Мне же хочется рассказать о том, как можно использовать в расчетах данные, взятые откуда угодно, например, полученные с помощью веб-парсинга со страниц Википедии, подгруженные из текстовых баз данных и т. п.
Я не буду рассказывать в этой статье о том, как построить оптимальную последовательность просмотра списка 250 лучших фильмов КиноПоиска по той причине, что просто не хочется иметь проблем с условиями использования данного ресурса, которые довольно четко говорят (см. п. 6), что просто взять их список фильмов и произвести его анализ без их согласия не получится. При этом применить алгоритмы, которые я приведу ниже для этого списка довольно просто. Также мне хотелось бы отметить, что во время моей работы с одной из отечественных кинокомпаний для их нужд на языке Wolfram Language был написан парсер, который подгружал информацию о фильмах с сайта КиноПоиск (юридическая сторона вопроса была улажена) для последующего автоматического формирования рекламного буклета о нескольких тысячах фильмов, права на которые принадлежали этой компании. Ниже вы можете видеть пример одной такой полностью автоматически созданной страницы буклета (приведена неокончательная версия, ввиду NDA).
Пример страницы![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_4.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/1c8/27e/751/1c827e751f6e196e9b741e6d24b6c7ab.png)
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_4.png](https://habrastorage.org/getpro/habr/post_images/1c8/27e/751/1c827e751f6e196e9b741e6d24b6c7ab.png)
В данной статье будет использоваться информация о фильмах, представленная в Википедии, что позволит избежать любых проблем с правообладателями. Это с одной стороны усложняет задачу (парсер с централизованного хранилища вроде IMDB или КиноПоиска написать проще), но в тоже время позволяет построить некоторые дополнительные, интересные, программы.
Импорт данных с сайта Википедии
Для начала, подгрузим символьное представление HTML кода страницы Википедии “250 лучших фильмов по версии IMDb” (в документе отобразим при этом лишь часть результата с помощью функции Short):
In[2]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_5.gif](https://habrastorage.org/getpro/habr/post_images/0d6/4cc/a7b/0d64cca7bdd13037ba680e5e3e0d9e55.gif)
Out[3]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_6.png](https://habrastorage.org/getpro/habr/post_images/22a/0e6/1de/22a0e61de594d035ff82cec61cf4c2af.png)
Теперь выделим ссылки на фильмы, приведенные на странице в таблице:
In[4]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_7.png](https://habrastorage.org/getpro/habr/post_images/2d6/169/d98/2d6169d98818f04d385548b6475d3cb5.png)
Out[4]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_8.png](https://habrastorage.org/getpro/habr/post_images/19c/f5e/b1e/19cf5eb1e07f206714aae6ef0d3c5bc1.png)
Создадим функцию, которая подгрузит и сохранит символьное представление HTML кода страниц каждого из фильмов:
In[5]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_9.gif](https://habrastorage.org/getpro/habr/post_images/315/00f/623/31500f62399ae26b39d85dbaae635239.gif)
Вспомогательные функции
Создадим набор вспомогательных функций, который понадобится нам для обработки погруженного символьного HTML:
- Функция для удаления HTML-оберток, оставляющая только данные:
In[8]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_10.png](https://habrastorage.org/getpro/habr/post_images/4da/d0a/60a/4dad0a60ababd541d03daef161993042.png)
- Функция, которая определяет, может ли быть некоторая строка словом на русском языке (т. е. состоит из букв русского алфавита или дефиса):
In[9]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_11.png](https://habrastorage.org/getpro/habr/post_images/6a0/157/a1a/6a0157a1a4984c500d772c9c54882060.png)
In[10]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_12.gif](https://habrastorage.org/getpro/habr/post_images/500/afa/d8b/500afad8b89eec408c68de9308122b75.gif)
- Функция, которая определяет, может ли быть некоторая строка словом на русском или английском языке (т. е. состоит из букв русского, английского алфавита или дефиса):
In[12]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_13.png](https://habrastorage.org/getpro/habr/post_images/f9f/a24/69d/f9fa2469dd3f197dbf080c602fc10348.png)
In[13]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_14.gif](https://habrastorage.org/getpro/habr/post_images/673/ece/a39/673ecea399eeb9342953edcad4b8c5ec.gif)
- Функция, преобразующая (в строке) заглавные буквы русского алфавита в прописные:
In[15]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_15.png](https://habrastorage.org/getpro/habr/post_images/e07/71d/34b/e0771d34b9fdd123bf6ea72181047dbb.png)
In[16]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_16.png](https://habrastorage.org/getpro/habr/post_images/70a/34d/e1b/70a34de1b0175d974b0f707b1d697fd5.png)
- Для анализа описаний фильмов нам потребуется информация о словах русского языках и связях между формами одного и того же слова. Подгрузим морфологический словарь русского языка, созданный академиком Андреем Анатольевичем Зализняком:
In[17]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_17.png](https://habrastorage.org/getpro/habr/post_images/bb8/e0c/69b/bb8e0c69b6493970c59dcf05a12231dc.png)
Out[17]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_18.png](https://habrastorage.org/getpro/habr/post_images/25f/a26/d2b/25fa26d2b2b7be2db77ed7afde341a19.png)
- Обработаем данные словаря, составив на его основе список слов русского языка (russianWords) и список правил замены форм слов русского языка в их стандартную форму (russianWordsStandardForm):
In[18]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_19.png](https://habrastorage.org/getpro/habr/post_images/867/54b/ffa/86754bffa516e4875ddf5975a99f0e60.png)
В словаре содержится 2 645 347 слов:
In[19]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_20.gif](https://habrastorage.org/getpro/habr/post_images/52e/462/c65/52e462c6570b790cf8c79de55bbbd83f.gif)
Out[19]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_21.png](https://habrastorage.org/getpro/habr/post_images/232/06a/7f0/23206a7f05dd2fb51a83af9986a47ca9.png)
Out[20]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_22.png](https://habrastorage.org/getpro/habr/post_images/fcb/46c/313/fcb46c313c493bee983fb6d8ec5a9a0e.png)
- Создадим функцию, которая проверяет, содержится ли слово в словаре, а также функцию, преобразующую русское слово в его стандартную форму:
In[21]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_23.png](https://habrastorage.org/getpro/habr/post_images/da0/adf/24d/da0adf24ddfe4a4a5f1489b0b425a82c.png)
In[22]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_24.png](https://habrastorage.org/getpro/habr/post_images/c3d/c3e/f1f/c3dc3ef1fd124f631d9edbe51a007ff1.png)
Примеры работы функций:
In[23]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_25.png](https://habrastorage.org/getpro/habr/post_images/8e2/70d/42e/8e270d42ee8c4d6a42e7b8943573a046.png)
Out[23]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_26.png](https://habrastorage.org/getpro/habr/post_images/d46/e4e/245/d46e4e245af7054c10b4bf3d3385db20.png)
In[24]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_27.png](https://habrastorage.org/getpro/habr/post_images/e99/c8a/f6b/e99c8af6b274afbd751fe02fab1fe9b7.png)
Out[24]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_28.png](https://habrastorage.org/getpro/habr/post_images/649/6b6/1f8/6496b61f8eab24c421ce7e40a8bddce3.png)
- Создадим функцию, которая будет устанавливать, является ли слово прилагательным:
In[25]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_29.png](https://habrastorage.org/getpro/habr/post_images/b3d/c96/8c2/b3dc968c2b8ed2d110ca4ddadeaa012e.png)
In[26]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_30.png](https://habrastorage.org/getpro/habr/post_images/1ce/727/c37/1ce727c37ca7a19fdc46e28dcc03bdfe.png)
Обработка данных
Теперь можно обработать данные каждого из фильмов. При этом на выходе в переменной filmsData будет храниться база данных информации о фильмах, построенная на основе функции Association, что позволит нам очень легко обращаться к данным.
In[27]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_31.png](https://habrastorage.org/getpro/habr/post_images/3cc/d31/f03/3ccd31f035975bafc2ed9b16a925f8ca.png)
In[29]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_32.gif](https://habrastorage.org/getpro/habr/post_images/a08/a5c/0ba/a08a5c0bab6b643358e166c80dccce70.gif)
Пример обращения к сформированной базе по номеру фильма:
In[31]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_33.png](https://habrastorage.org/getpro/habr/post_images/4ac/39c/01a/4ac39c01aa0cc1b8900658cf4f953b2c.png)
Out[31]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_34.png](https://habrastorage.org/getpro/habr/post_images/bf6/b21/1a1/bf6b211a1bf2a17f9cecc007de495225.png)
Пример обращения с запросом о режиссёре и годе выхода каждого из фильмов:
In[32]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_35.png](https://habrastorage.org/getpro/habr/post_images/3b2/e4a/987/3b2e4a9878a07c92cee656e7bbb06820.png)
Out[32]//Short=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_36.png](https://habrastorage.org/getpro/habr/post_images/4fe/aba/b9a/4feabab9adfd5897587830f96e294d14.png)
Немного статистики на основе данных
Для начала, просто сформируем коллаж из постеров всех фильмов:
In[33]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_37.png](https://habrastorage.org/getpro/habr/post_images/868/05a/438/86805a438442fdfc33767c5d5f9762cf.png)
Out[33]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_38.png](https://habrastorage.org/getpro/habr/post_images/c9d/632/1d1/c9d6321d1a09717659e5356f42446768.png)
Построим распределение количества фильмов в зависимости от года:
In[34]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_39.png](https://habrastorage.org/getpro/habr/post_images/7b8/009/c87/7b8009c87ec7e68b92c2fdf57e3b57f6.png)
Out[34]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_40.png](https://habrastorage.org/getpro/habr/post_images/774/330/989/7743309899eb6d7210287a1b4fd16a0a.png)
Построим распределение фильмов по их продолжительности:
In[35]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_41.png](https://habrastorage.org/getpro/habr/post_images/17d/3d0/3ec/17d3d03ec7f3f23bf88dc6e29a7c4d07.png)
Out[35]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_42.png](https://habrastorage.org/getpro/habr/post_images/e9c/ef6/389/e9cef638975f7b2a2873e0ff035e20fb.png)
Построим распределение фильмов по их продолжительности и году выпуска:
In[36]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_43.png](https://habrastorage.org/getpro/habr/post_images/e18/f98/580/e18f98580fc3e362db1efe8263f1dbc0.png)
Out[36]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_44.png](https://habrastorage.org/getpro/habr/post_images/4e1/76d/0c4/4e176d0c4ddce2d0af960974e6a0e00e.png)
Первые 10 актеров по количеству фильмов, в которых они сыграли:
In[37]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_45.png](https://habrastorage.org/getpro/habr/post_images/76e/87b/c32/76e87bc32a8271220397c410760054fb.png)
Out[37]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_46.png](https://habrastorage.org/getpro/habr/post_images/222/cd5/b94/222cd5b94ee02dbaffbd1d26774be7c7.png)
Первые 10 режиссёров по количеству фильмов, которые они сняли:
In[38]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_47.png](https://habrastorage.org/getpro/habr/post_images/5ee/6d7/f41/5ee6d7f41505949dd146cd7c207454a4.png)
Out[38]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_48.png](https://habrastorage.org/getpro/habr/post_images/ed7/d8c/df9/ed7d8cdf91b1d98e802eae9bba799f05.png)
Первые 10 сценаристов по количеству фильмов, сценарий к которым они написали:
In[39]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_49.png](https://habrastorage.org/getpro/habr/post_images/505/4d7/a61/5054d7a6115ae9f52ce8389a2077b237.png)
Out[39]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_50.png](https://habrastorage.org/getpro/habr/post_images/8b0/f97/2c0/8b0f972c0ee5e8763c85bde7c3295a82.png)
Первые 10 композиторов по количеству фильмов, музыку к которым они написали:
In[40]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_51.png](https://habrastorage.org/getpro/habr/post_images/7da/fd4/91e/7dafd491e079f6119859ad6258fd5fd4.png)
Out[40]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_52.png](https://habrastorage.org/getpro/habr/post_images/1ee/66e/693/1ee66e6935e49d0c960bf2018d795313.png)
Первые 10 стран по количеству фильмов, которые были в них сняты:
In[41]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_53.png](https://habrastorage.org/getpro/habr/post_images/b07/9e5/e75/b079e5e75440442efda439dd6c4ee0c6.png)
Out[41]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_54.png](https://habrastorage.org/getpro/habr/post_images/56f/046/a3c/56f046a3c8ceb447ef730902059d8c83.png)
Первые 10 жанров по количеству фильмов, которые к ним относятся:
In[42]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_55.png](https://habrastorage.org/getpro/habr/post_images/883/f82/ffe/883f82ffea76f209e78204b0eaf4184f.png)
Out[42]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_56.png](https://habrastorage.org/getpro/habr/post_images/0c8/3c2/6bb/0c83c26bba38f0076b9af6ca06e271d5.png)
Для тех, кого интересуют жанры кино, могу порекомендовать написанную некоторое время назад статью “Фильмы и Mathematica: импорт и обработка информации из базы данных IMDB”, в которой, в частности, получено следующее распределение фильмов по жанрам:
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_57.png](https://habrastorage.org/getpro/habr/post_images/448/ec3/f79/448ec3f79d5733ae755cea68fc568ad7.png)
Функция, определяющая расстояние между фильмами
Для определения меры различия двух списков объектов мы будем использовать обобщение коэффициента (меры) Чекановского-Съёренсена:
In[43]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_58.gif](https://habrastorage.org/getpro/habr/post_images/d77/b34/392/d77b3439292413a0921d0772477342a0.gif)
Пример:
In[45]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_59.png](https://habrastorage.org/getpro/habr/post_images/3ae/864/4ab/3ae8644ab6746460a6236045dc7791ed.png)
Out[45]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_60.png](https://habrastorage.org/getpro/habr/post_images/42e/cf9/283/42ecf9283b4df16ba0e794a7db1033bf.png)
Для определения близости описаний с помощью этого коэффициента создадим функцию, выбирающую из описания фильма слова русского языка с переводом их в стандартную форму:
In[46]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_61.png](https://habrastorage.org/getpro/habr/post_images/380/c27/1b1/380c271b16e0898dc4a9ea89402e8dcd.png)
Пример работы функции (дополнительно было посчитана частота каждого слова с помощью функции Tally, при этом частоты были отсортированы по их уменьшению):
In[47]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_62.png](https://habrastorage.org/getpro/habr/post_images/ca3/1ee/2b4/ca31ee2b468d0feb7e52e1e22db681e5.png)
Out[47]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_63.png](https://habrastorage.org/getpro/habr/post_images/f07/d42/131/f07d42131b0fd7bd78c1e0f863da9fc3.png)
Теперь создадим функцию, определяющую степень близости фильмов между собой. Она представляет собой нормированную на единицу сумму нескольких параметров с разными весами. Всего взято 11 параметров (степеней) сходства: описание фильма, жанр(-ы), режиссёр, сценарист(-ы), актёры, оператор(-ы), композитор(-ы), страна(-ы) производства, год выхода, длительность, близость постеров. При этом можно задавать им разные веса, но по умолчанию они будут одинаковы.
In[48]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_64.gif](https://habrastorage.org/getpro/habr/post_images/6be/edd/7b5/6beedd7b5867f403b34f144026576f8a.gif)
Выберем для дальнейшей работы те фильмы, для которых известна хоть какая-то информация (ввиду того, что для нескольких фильмов их страницы Википедии пусты):
In[62]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_65.png](https://habrastorage.org/getpro/habr/post_images/038/ced/abe/038cedabe077d9f260daf9f14d835759.png)
Вычислим все меры близости (расстояния) между фильмами:
In[63]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_66.png](https://habrastorage.org/getpro/habr/post_images/bdb/294/994/bdb2949949c742f3d446c05fd17834fb.png)
Анализ связей между фильмами
Изучим связи между фильмами с помощью методов теории графов, а именно с помощью теории о структуре комьюнити в графах. Для этого создадим функцию на основе CommunityGraphPlot:
In[64]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_67.png](https://habrastorage.org/getpro/habr/post_images/f08/d59/e66/f08d59e668f65412b85ac172b59c1893.png)
Данная функция ищет, на основе построенной ранее функции расстояния между фильмами, комьюнити в графе, при этом чем краснее и толще связь между вершинами, тем они теснее связаны (ближе). При наведении на каждую из вершин графа вы можете получить всплывающую подсказку с постером и названием фильма (скачать документ с интерактивными графами и исходным кодом вы можете по ссылке, приведенной в самом начале поста).
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_68.png](https://habrastorage.org/getpro/habr/post_images/f54/a7b/bee/f54a7bbee9059df6a6ff9a653b680eb4.png)
In[65]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_69.png](https://habrastorage.org/getpro/habr/post_images/876/166/130/8761661308bb2330bf218d84f8bcdc60.png)
Out[65]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_70.png](https://habrastorage.org/getpro/habr/post_images/508/d46/a90/508d46a90f9a68d50259ff8235dea97e.png)
In[66]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_71.png](https://habrastorage.org/getpro/habr/post_images/a6e/f61/d7e/a6ef61d7ee9851701b75a81fda70d181.png)
Out[66]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_72.png](https://habrastorage.org/getpro/habr/post_images/2ad/1a2/b8b/2ad1a2b8b2682c61fcc84e87db46d944.png)
In[67]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_73.png](https://habrastorage.org/getpro/habr/post_images/9ee/6f2/c2d/9ee6f2c2d6f64e124a95ba1dde888955.png)
Out[67]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_74.png](https://habrastorage.org/getpro/habr/post_images/379/092/829/37909282987a5a2bfb5ef104a72f5b1c.png)
In[68]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_75.png](https://habrastorage.org/getpro/habr/post_images/bc9/d0e/309/bc9d0e309f11310e5460229ea58d88f5.png)
Out[68]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_76.png](https://habrastorage.org/getpro/habr/post_images/28c/d61/298/28cd6129814c03dbf2d608cd44442604.png)
In[69]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_77.png](https://habrastorage.org/getpro/habr/post_images/d1d/73c/566/d1d73c566807d750cf1eb3510dc19e4b.png)
Out[69]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_78.png](https://habrastorage.org/getpro/habr/post_images/044/74e/ba9/04474eba9c8972919639d18c1ff4ad47.png)
In[70]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_79.png](https://habrastorage.org/getpro/habr/post_images/080/66b/b36/08066bb362c634811a1b8e657b2c41a9.png)
Out[70]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_80.png](https://habrastorage.org/getpro/habr/post_images/ad4/272/d68/ad4272d681f968d52293c89aa9f643d9.png)
In[71]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_81.png](https://habrastorage.org/getpro/habr/post_images/24a/5b9/371/24a5b93715f83c86da52a2dd7553d6f6.png)
Out[71]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_82.png](https://habrastorage.org/getpro/habr/post_images/b18/d2f/bdc/b18d2fbdc8a711af9d517abb63a5f1b2.png)
In[72]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_83.png](https://habrastorage.org/getpro/habr/post_images/448/b01/e25/448b01e2509536fa392de1fc6cfd8e3b.png)
Out[72]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_84.png](https://habrastorage.org/getpro/habr/post_images/3bb/112/cff/3bb112cffe4909424adf49c614986073.png)
Построение оптимальной последовательности просмотра фильмов
Мы проделали довольно большую работу и теперь, наконец, можем построить оптимальную последовательность просмотра фильмов:
In[73]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_85.png](https://habrastorage.org/getpro/habr/post_images/fa7/207/eb8/fa7207eb82960d1d3a20e24e6e215eb5.png)
Итак, теперь мы можем получить ее (функция предусматривает вывод либо в виде таблицы, либо в виде плаката из постеров):
In[74]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_86.png](https://habrastorage.org/getpro/habr/post_images/5c5/f05/43f/5c5f0543f5bddfe8637b5cad93e7190d.png)
Таблица оптимальной последовательности просмотра фильмов из списка 250 лучших фильмов по версии IMDb
Out[74]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_87.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/9ec/4de/357/9ec4de357ef2a33845d886049944fe8b.png)
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_87.png](https://habrastorage.org/getpro/habr/post_images/9ec/4de/357/9ec4de357ef2a33845d886049944fe8b.png)
Также, можно отобразить её в виде плаката из постеров (последовательность просмотра фильмов при этом будет слева направо, сверху вниз):
In[75]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_88.png](https://habrastorage.org/getpro/habr/post_images/d7d/750/f1e/d7d750f1e6d4db1b034c122c4c4c9915.png)
Out[75]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_89.png](https://habrastorage.org/getpro/habr/post_images/3fd/d57/819/3fdd5781944c71ce914b3ca4d38316e5.png)
Мы может также рассмотреть оптимальные последовательности по отдельным критериям:
Последовательность просмотра на основе описания фильма
In[76]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_90.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/4e3/f7e/76e/4e3f7e76eb303a8f9241e34c067fc280.png)
Out[76]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_91.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/7da/32e/468/7da32e468ee81f1962cdf66920d14e4e.png)
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_90.png](https://habrastorage.org/getpro/habr/post_images/4e3/f7e/76e/4e3f7e76eb303a8f9241e34c067fc280.png)
Out[76]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_91.png](https://habrastorage.org/getpro/habr/post_images/7da/32e/468/7da32e468ee81f1962cdf66920d14e4e.png)
Последовательность просмотра на основе жанра фильма
In[77]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_92.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/325/c7c/eee/325c7ceee04d3acc9306b8b93a4c9f90.png)
Out[77]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_93.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/dec/677/440/dec677440dafc2f8d73c99523127aa29.png)
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_92.png](https://habrastorage.org/getpro/habr/post_images/325/c7c/eee/325c7ceee04d3acc9306b8b93a4c9f90.png)
Out[77]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_93.png](https://habrastorage.org/getpro/habr/post_images/dec/677/440/dec677440dafc2f8d73c99523127aa29.png)
Последовательность просмотра на основе актерского состава фильма
In[78]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_94.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/1c0/bad/6e4/1c0bad6e45fc359107002a2e67aa79ad.png)
Out[78]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_95.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/8e4/7c5/800/8e47c5800e603be230ab7cf7cd4a450e.png)
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_94.png](https://habrastorage.org/getpro/habr/post_images/1c0/bad/6e4/1c0bad6e45fc359107002a2e67aa79ad.png)
Out[78]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_95.png](https://habrastorage.org/getpro/habr/post_images/8e4/7c5/800/8e47c5800e603be230ab7cf7cd4a450e.png)
Последовательность просмотра на основе режиссёра фильма
In[79]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_96.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/915/3ea/ab5/9153eaab5e129a13867535c0352af6dc.png)
Out[79]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_97.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/d3d/216/c4e/d3d216c4ebd5b7ca4027f79dbc799e15.png)
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_96.png](https://habrastorage.org/getpro/habr/post_images/915/3ea/ab5/9153eaab5e129a13867535c0352af6dc.png)
Out[79]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_97.png](https://habrastorage.org/getpro/habr/post_images/d3d/216/c4e/d3d216c4ebd5b7ca4027f79dbc799e15.png)
Последовательность просмотра на основе сценаристов фильма
In[80]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_98.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/81c/d4c/c1b/81cd4cc1be98ff89e7d51bac885a690a.png)
Out[80]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_99.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/b42/c97/457/b42c97457e55b5b3c0a9c21d77cf7d17.png)
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_98.png](https://habrastorage.org/getpro/habr/post_images/81c/d4c/c1b/81cd4cc1be98ff89e7d51bac885a690a.png)
Out[80]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_99.png](https://habrastorage.org/getpro/habr/post_images/b42/c97/457/b42c97457e55b5b3c0a9c21d77cf7d17.png)
Последовательность просмотра на основе композиторов фильма
In[82]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_102.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/b4f/7b6/8c2/b4f7b68c2258fe2856cb19874a4a0b5c.png)
Out[82]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_103.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/558/a7d/bad/558a7dbad86f50d8dcaa7d2dde8a8f67.png)
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_102.png](https://habrastorage.org/getpro/habr/post_images/b4f/7b6/8c2/b4f7b68c2258fe2856cb19874a4a0b5c.png)
Out[82]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_103.png](https://habrastorage.org/getpro/habr/post_images/558/a7d/bad/558a7dbad86f50d8dcaa7d2dde8a8f67.png)
Последовательность просмотра на основе длительности фильма
In[83]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_104.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/d34/fdd/df7/d34fdddf745424d5b5c68e845749df46.png)
Out[83]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_105.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/452/eea/5e6/452eea5e6735a5d55ee06f12fa0051c0.png)
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_104.png](https://habrastorage.org/getpro/habr/post_images/d34/fdd/df7/d34fdddf745424d5b5c68e845749df46.png)
Out[83]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_105.png](https://habrastorage.org/getpro/habr/post_images/452/eea/5e6/452eea5e6735a5d55ee06f12fa0051c0.png)
Последовательность просмотра на основе постера фильма
In[84]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_106.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/7da/83b/7e7/7da83b7e78e0727552d92352c2613ec5.png)
Out[84]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_107.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/6cf/0a3/9d0/6cf0a39d0aeddabf31023cf340a7f4bc.png)
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_106.png](https://habrastorage.org/getpro/habr/post_images/7da/83b/7e7/7da83b7e78e0727552d92352c2613ec5.png)
Out[84]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_107.png](https://habrastorage.org/getpro/habr/post_images/6cf/0a3/9d0/6cf0a39d0aeddabf31023cf340a7f4bc.png)
Последовательность просмотра на основе страны производства фильма
In[85]:=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_108.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/ac0/87f/304/ac087f3047fed6eb00c1449207ac4299.png)
Out[85]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_109.png](https://habrastorage.org/r/w1560/getpro/habr/post_images/f5d/324/b02/f5d324b02eb755b6e9073a88a444627a.png)
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_108.png](https://habrastorage.org/getpro/habr/post_images/ac0/87f/304/ac087f3047fed6eb00c1449207ac4299.png)
Out[85]=
![Poisk-posledovatelnosti-prosmotra-spiska-250-luchshih-filmov-Wolfram-Language-Mathematica_109.png](https://habrastorage.org/getpro/habr/post_images/f5d/324/b02/f5d324b02eb755b6e9073a88a444627a.png)
Заключение
Надеюсь, что мой пост смог заинтересовать вас, а некоторые идеи и программы, представленные в нем окажутся вам полезны. Безусловно, можно придумать множество путей применения этих алгоритмов, их дальнейшего расширения и совершенствования. Многие вещи были специально упрощены мной, так как не все готовые коды могут быть выложены полностью в свободном доступе. Думаю, что если вам будет интересно, вы можете самостоятельно создать парсер с КиноПоиска или IMDB напрямую (в последнем случае вам может помочь статья о подгрузке и анализе информации из баз данных IMDB, выложенных этим ресурсов в свободном доступе) и на его основе уже произвести еще более подробный и качественный анализ кино, а также улучшить полученную в этой статье оптимальную последовательность просмотра фильмов. Надеюсь, что все эти задачи заинтересуют и вас!
Ресурсы для изучения Wolfram Language (Mathematica) на русском языке: http://habrahabr.ru/post/244451