Как я использовал базовое НЛП, чтобы посмотреть, как пол соотносится с определенными предметами на Netflix.

Пару лет назад, когда я впервые познакомился с наукой о данных, меня поразила статья с данными под названием Она хихикает, он скачет », в которой анализировался гендерный аспект в направлении экрана в тысячах сценариев. Он специально идентифицировал все глаголы, следующие за он и она, чтобы исследовать гендерные тропы. Теперь, когда я узнал больше о науке о данных, я подумал, что могу попробовать применить аналогичный анализ к другому набору данных.

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

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

Данные

Сторонняя поисковая система Netflix, Flixable, выпустила набор данных, в котором перечислены все фильмы и телешоу на Netflix по состоянию на 2019 год. Он предоставляет несколько различных атрибутов с названием, включая их состав и описание. С помощью этих двух атрибутов мы можем отслеживать тенденции в отношении пола (-ов) актеров и содержания фильма или телешоу. Для своего анализа я решил посмотреть на пол главного актера / актрисы.

Однако набор данных Flixable не включает пол актеров. Я не собираюсь маркировать все 6000+ записей вручную, поэтому мне помог IMDb, у которого есть несколько общедоступных наборов данных, которые обновляются ежедневно. Один из этих наборов данных подробно описывает имена актеров, актрис, писателей и т. Д. И их профессии. Учитывая актерский состав названия, я обнаружил, что могу сопоставить имена участников актерского состава с именами в наборе данных IMDb, посмотреть, помечены ли они как актер или актриса, и таким образом автоматизировать определение пола.

Прежде чем я натолкнулся на этот гениальный план, я попробовал соскабливать пол, выполняя поиск в Google по имени каждого актера, находя их страницу на IMDb, а затем извлекая их вакансии. На запуск потребовалось несколько дней, и я был только примерно на полпути, когда понял, что у IMDb есть набор данных, который может мне помочь. Я с большим энтузиазмом использовал веб-скрапинг, поскольку узнал об этом совсем недавно, но это заставило меня вспомнить, что определенные инструменты созданы для определенных целей. Веб-скрапинг позволяет самому собирать данные, но мне не нужно его использовать, если данные уже где-то там есть.

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

genders = [''] * len(data)
# loop through each row
for i, row in data.iterrows():
    cast = row['cast']
    cast_genders = []
    # for each cast member, get their gender
    for name in cast.split(','):
        gender = ''
        # professions_key stores a given name's professions
        if (name in professions_key.keys()):
            professions = professions_key[name]
            if ('actor' in professions):
                gender = 'male'
            elif ('actress' in professions):
                gender = 'female'
        cast_genders.append(gender)
    genders[i] = ','.join(cast_genders)
# store as new column in dataframe
data['genders'] = genders

Языковая модель SpaCy

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

Инструмент, который позволяет нам выбирать эти определенные слова, - это пакет обработки естественного языка под названием spaCy. Мы используем очень простые функции языковой модели spaCy. По сути, языковая модель - это функция, которая присваивает вероятность заданным словам или предложениям, но в модель spaCy добавлены функции, которые обрабатывают общие функции НЛП. В нашем случае мы можем создать объект документа из модели spaCy, что позволит нам выбрать каждый токен (в нашем случае слово) из предложения и получить доступ к его части речи и леммы.

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

Лемма слова - это корневая форма слова. Например, лемма для слов «играл» и «играет» - это «играть». Это полезно, потому что для нас не так важно, используются ли разные формы слова, а просто то, что слово используется в Общее.

Это пример использования языковой модели прямо из документации spaCy:

import spacy
nlp = spacy.load(“en_core_web_sm”)
doc = nlp(“Apple is looking at buying U.K. startup for $1 billion”)
for token in doc:
    print(token.text, token.lemma_, token.pos_, token.tag_, token.dep_, token.shape_, token.is_alpha, token.is_stop)

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

Облака слов

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

pos_words = {}
for description in data[‘description’]:
    doc = nlp(description)
    for token in doc:
        pos = token.pos_
        pos_words[pos].append(token.lemma_)

Здесь не так много сюрпризов, но это дает нам общее представление о словах в описаниях.

Гендерные слова

Что касается гендерных слов, я специально хотел создать что-то вроде статьи, которую я прочитал. Они рассчитали значения того, насколько более вероятно, что слово будет отображаться в женском или мужском контексте, поэтому я хотел сделать то же самое. Для этого я сначала собрал количество каждого слова (по частям речи) для каждого пола. Затем я вычислил вероятность того, что он появится в описании фильма определенного пола. Затем я взял отношение большей из двух вероятностей к меньшей из двух и дал ему знак, указывающий, какой пол более вероятен, т. Е. Отрицательный означает более вероятный женский пол, положительный означает более вероятный мужской.

Я исключил слова, которые встречаются только в одном роде, потому что я хотел посмотреть на слова, которые я мог бы сравнить, насколько более вероятно, что один пол был над другим, и слова, которые появлялись только в одном роде, чаще были просто словами, которые использовались очень редко, а не слова, которые особенно указывали на конкретный пол.

# retrieving counts
pos_counts = {}
for i, row in data.iterrows():
    leading_gender = str(row['genders']).split(',')[0]
    
    doc = nlp(str(row['description']))
    for token in doc:
        pos_counts[leading_gender][token.pos_][token.lemma_] += 1
# calculating probabilities
pos_probs = {}
for pos in all_pos.keys():
    for word in all_pos[pos]:
        male_count = pos_counts['male'][p][word] / male_total
        female_count = pos_counts['female'][p][word] / female_total
        male_prob = male_count / (male_count + female_count)
        female_prob = female_count / (male_count + female_count)
        prob = (max(male_prob, female_prob) / (min(male_prob, female_prob)))
        prob *= 1 if (male_prob > female_prob) else -1
        pos_probs[pos][word] = prob

Некоторые действительно резкие гендерные различия, которые я заметил, заключались в том, что среди женских слов были «психиатр» и «блоггер», а среди мужских слов были «эксперт» и «профессор». Я бы рассмотрел эти в основном гендерно-нейтральные термины, но они встречаются среди существительных, наиболее поляризованных по гендерному признаку, в описаниях этих фильмов и телешоу.

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

Жанровое представление

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

leading = defaultdict(lambda: defaultdict(lambda: 0))
for i, row in data.iterrows():
    leading_gender = row['genders'].split(',')[0]
    
    genres = row['listed_in'].split(',')
    for genre in genres:
        leading[leading_gender][genre] += 1

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

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

Заключение

Пытаясь воссоздать вдохновляющий меня анализ, я обнаружил новые идеи и приобрел новые навыки. Использование этого нисходящего подхода к обучению навыкам по мере необходимости заставило меня использовать два набора данных для получения желаемых результатов и дало мне возможность изучить и использовать основы НЛП. Эта практика оказалась для меня очень полезной, и я думаю, что другие начинающие специалисты по данным могут многому научиться, делая то же самое.