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

Возьмем, к примеру, Анаконду. Развлечение поколения и противоречивое, получило 38% на Rotten Tomatoes. Несмотря на это, у фильма есть страстные поклонники, которые хвалят его великолепие и подтверждают его рецензии на Rotten Tomatoes. Наша группа, группа фанатиков Анаконды, была озадачена отсутствием консенсуса между обзорами и оценками не только качества Анаконды, но и других, казалось бы, удивительных или, наоборот, ужасных фильмов со смешанными отзывами и мнениями.

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

Агрегация данных

Мы начали с обеспечения достаточного охвата нашего набора данных, чтобы избежать предвзятости источников и охватить широкий круг обозревателей фильмов и сайтов с обзорами фильмов. Мы использовали API Rotten Tomatoes, API Meta Critic и CSV-файл IMDB для сбора оценок аудитории, оценок критиков, обзоров фильмов и метаданных фильмов (например, бюджетов, актеров и т. д.).

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

def get_movie():
option = st.selectbox('Select a Movie', movies_list)
option = option.lower()
movie_scraper = MovieScraper(movie_title=option)
movie_scraper.extract_metadata()
col1, col2 = st.columns(2)
col1.metric("Critic Score", movie_scraper.metadata.get("Score_Rotten"))
col2.metric("Audience Score", movie_scraper.metadata.get("Score_Audience"))x
return option

Мы решили ограничить количество фильмов, по которым мы собрали данные, списком 1000 лучших фильмов IMDB, чтобы ограничить использование памяти и оптимизировать время воспроизведения. Кроме того, это позволяет нам выполнять анализ данных только по более актуальным и известным фильмам.

Метакритический парсинг

В качестве дополнительного источника данных мы использовали бесплатный API Meta Critic, чтобы получить доступ к обзорам фильмов, на которых мы в конечном итоге сможем запустить NLP. Во-первых, мы должны убедиться, что данные, которые мы получаем, действительно нужны и достаточно чисты, чтобы их можно было использовать.

Чтобы получить настоящие отзывы о фильмах через API Meta Critic, сначала нам нужно найти идентификационный номер фильма. Приведенный ниже код не только получает этот идентификатор, но и использует его для получения файла JSON с доступными данными об этом фильме.

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

import requests
 
##Make API call for speicfic movie (Dune as example)
url = "https://imdb-api.com/en/API/searchMovie/$APIKEY/Dune"
response = requests.request("GET", url)
data = response.json()
##Save movie ID
ID = data['results'][0]['id']
##Make API call for critic reviews with API Key and Movie ID
url = "https://imdb-api.com/en/API/MetacriticReviews/k_2h75ivfz/%s" %(ID)
response = requests.request("GET", url, headers=headers, data = payload)
data = response.json()
##Print Movie meta data
print(data['items'])

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

length = len(data['items'])
score = 0
##Iterate through reviews and scores
for i in range(length):
    ##print(data['items'][i])
    print("SCORE:   ",data['items'][i]['rate'])
    score = score + int(data['items'][i]['rate'])
    print("REVIEW:   ",data['items'][i]['content'])
##Calculate avg reviewer score 
avg_score = score / length
print("   ")
print("AVG Score:",avg_score)

Теперь, когда это работает для одного фильма, мы можем перебирать любые фильмы в нашем наборе данных и получать оценки и комментарии для выполнения анализа!

Анализ настроений

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

В большинстве анализов тональности низкого уровня используются тщательно отобранные наборы данных слов в сочетании с введенными вручную показателями тональности для оценки (например, «грустный» = -1, «счастливый» = 1). Это грубый способ оценки неформального текста, основанный на контексте, особенно в отношении обзоров фильмов. Чтобы получить более точный и сложный анализ тональности, мы использовали встраивание слов, которое может фиксировать скрытую синтаксическую семантическую информацию. По сути, встраивание слов учитывает контекст и окружающий текст при расчете оценки тональности.

Мы использовали библиотеку встраивания слов Flair для проведения анализа настроений в наших обзорах фильмов. Встраивание слов и предложений — это форма обработки естественного языка (NLP), в которой отдельные слова представлены в виде векторов с действительными значениями в предопределенном векторном пространстве. Каждое слово сопоставляется с одним вектором, и значения вектора изучаются способом, напоминающим нейронную сеть. Слова, имеющие одинаковое значение, имеют аналогичное представление в векторном пространстве.

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

Анализ данных

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

Как мы видим, существует значительная положительная корреляция между оценкой критиков Rotten Tomatoes и оценкой их аудитории, что свидетельствует об общем согласии между ними. Есть несколько заметных отклонений, таких как (35,90), которые можно объяснить малобюджетными или низкокачественными фильмами с культовыми поклонниками, такими как «Комната» (2003), которая печально известна своей культовостью.

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

Режиссер, Комбинации актеров

Помимо обзоров фильмов, нас также интересовало, какие режиссеры и актеры зарабатывают больше всего и снимают лучшие фильмы. Хотя у вас могут быть любимые режиссеры и актеры, мы проанализировали пары режиссеров и актеров, чтобы выяснить, у кого исторически сложилась лучшая химия. Мы просмотрели Базу данных 1000 лучших фильмов IMDB, чтобы проанализировать наиболее релевантные фильмы и убедиться, что наш набор данных управляем.

Кристофер Нолан и Кристиан Бэйл опередили Дэвида Йейтса и Эмму Уотсон в рейтинге дуэта с самым высоким рейтингом на Metacritic (75,33). Дэвид Йейтс и Дэниел Рэдклифф также были успешным дуэтом, получив наибольший доход в размере 1269,9 миллиона долларов).

for k in Dict:
v = Dict.get(k)
v2 = Dict_rev.get(k)
avg_score = sum(v)/len(v)
avg_rev = sum(v2)/len(v2)
if len(v) >= min_movies:
combo_names.append(k)
combo_avg_scores.append(avg_score)
combo_avg_rev.append(avg_rev)
combinations["id"] = combo_names
combinations["avg_metascore"] = combo_avg_scores
combinations["avg_Revenue"] = combo_avg_rev
st.dataframe(combinations)

Заключение

Напомним, что мы успешно внедрили НЛП предложений Флэра, чтобы получить большую выборку обзоров фильмов. Затем мы смогли сравнить эти оценки настроений с оценками критиков и аудитории. Мы обнаружили отсутствие существенной корреляции между оценкой настроений фильмов и оценкой критиков/аудитории.

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

Мы хотели бы оставить вас с важным вопросом, который с самого начала определял исследование данных: что представляет собой законный отзыв? Является ли нефильтрованный, интуитивно понятный рейтинг лучшим отражением мнения о фильме, чем тщательно продуманный письменный обзор? На какой счет зрители должны обращать больше внимания или даже полагаться, решая, что смотреть? Тебе решать. В конце концов, если вы считаете, что фильм выглядит интересным, может быть, просто посмотрите его и составьте для себя мнение :)

Исходники и ссылка на GitHub

Гитхаб

Сокращенные данные обзора

Очищенные метаданные фильма

Скребок для тухлых помидоров

1000 лучших фильмов IMDB в формате CSV