Подготовка данных и разработка функций для прогнозного моделирования с использованием реальных данных

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

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

Когда мы поднимаем наши очки за последний год 2010-х и его восьмые и заключительные президентские дебаты от Демократической партии, которые намечены на 19 декабря, я подумал, что было бы неплохо восполнить этот пробел небольшим исследованием и анализом данных.

В этом посте я буду:

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

После 12 декабря (это последняя дата, к которой кандидаты должны соответствовать всем требованиям доноров и голосований, чтобы получить право на участие в следующих дебатах), у меня будет вся необходимая информация, чтобы:

  • Создайте модель классификации, которая предсказывает, кто будет претендовать на дебаты 19 декабря, используя только речевые особенности, указанные в этом посте, с помощью scikit-learn. Так что следите за обновлениями! (А сейчас она здесь.)

Беглый взгляд на исходный текст

На сегодняшний день (7 декабря 2019 г.) мы завершили в общей сложности восемь первичных дебатов Демократической партии на выборах 2020 года:

Я взял стенограммы дебатов из единственного источника, The Washington Post (с июня по ноябрь 2019 года). Вот пример, а внутри он выглядит так:

Каждый блок текста (например, часть, выделенная серым цветом выше) соответствует тегу <p> в исходном коде HTML, к которому можно перейти, выделив раздел текст и щелкнув правой кнопкой мыши «Осмотреть». Обратите внимание, что граница каждого говорящего обозначена тегом говорящего, который представляет собой фамилию говорящего, написанную заглавными буквами («BIDEN», «COOPER» и т. Д.). Я буду называть часть, которая следует за тегом динамика в каждом блоке, сегментом. Поскольку только первый из последовательных блоков одного и того же говорящего содержит тэг говорящего, необходимо было изменить форму каждого блока исходного текста в виде пары тэг-сегмент, например:

# block 1
Speaker tag: BIDEN
Segment: Look, my son's statement ... no potential conflict,
# block 2
Speaker tag: BIDEN
Segment: My son made a judgment ... we should be focusing on.
# block 3
Speaker tag: COOPER
Segment: Senator Sanders, your response?

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

1. Извлеките блоки <p>.

2. Преобразование необработанного текста в кортежи сегментов говорящего.

3. Поместите все в фрейм данных

Выход:

Теперь мы готовы к серьезному развлечению - извлечению функций для числового представления речи кандидатов. Для анализа ниже я удалил все строки, содержащие сегменты, произнесенные модераторами (например, Купером). Я не исключил транскрипции, такие как (APPLAUSE) и (CROSSTALK), если они были связаны с одним из кандидатов, на случай, если они позже послужат важной функцией. После этого у меня было 4 069 строк.

# subset the dataframe based on speaker info  
df = original_df[original_df['speaker'].isin(CANDIDATE_NAMES)].reset_index(drop=True)
df['speaker'].value_counts().sum()  #4069 

Сравнение речи кандидата

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

⏳ Кто говорил больше всего?

Байден и Уоррен больше всего высказались в отношении segment length (общее количество токенов во всех дебатах) и number of sentences. Примечательно, что Сандерс занимал наименьшее место среди наших главных соперников, немного уступая Харрису, Букеру, Буттиджичу и Клобучар. Эти результаты коррелируют со временем выступления кандидата .

Кстати, большинство гистограмм, представленных в этом посте, можно изобразить примерно так:

import matplotlib.pyplot as plt
mean_df = original_df.groupby('speaker').agg('mean')
mean_df[['segment_length']].sort_values('segment_length', ascending=False).plot(kind='bar')

Еще одна характеристика длины, которую следует учитывать, - mean sentence length, которая рассчитывается путем деления общего количества токенов (слов) на количество предложений в сегменте и усреднения по всем сегментам. Этот график показывает, что Габбарду, О’Рурку и Стейеру удалось уместить в свои предложения наибольшее количество слов:

Те же три кандидата также показали наибольшую вариацию в длине предложения, как определено standard deviation of sentence length (в токенах). Другими словами, у них было хорошее сочетание длинных и коротких предложений (это то, что ваш учитель английского языка в средней школе, возможно, хотел бы, чтобы вы использовали в своих эссе).

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

Преобразование текста в spaCy Doc предоставило простой способ извлечь следующие характеристики длины:

🤹‍ Кто говорил наиболее подробно? ️

То есть чья речь наиболее сложна в синтаксисе? Я использовал две функции, чтобы измерить это: number of complex clauses и number of words before the main verb.

Я определяю сложные предложения как любые конструкции уровня предложения, которые являются более сложными, чем простые переходные или непереходные предложения с точки зрения структуры аргументов («субъект», «объект» и т. Д.), Содержат модификацию наречного клауза и / или содержат вложенное предложение. . Например:

  1. Дательные конструкции, содержащие два внутренних аргумента, прямой объект и косвенный объект: «Я дал ему деньги».
  2. Прилагательные предложения: «Если вы хотите изменить мир, вы должны заправлять постель каждое утро».
  3. Клаузал добавляет: «Я никогда не думал, что она выйдет из гонки так рано»)

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

Number of words before the main verb конкретно измеряет до-вербальную структурную сложность. Чем длиннее текст перед основным глаголом, тем больше вероятность, что он содержит модификатор клаузии (и / или модификатор подлежащего). Это довольно грубая мера синтаксической сложности, но она быстро дает нам кое-что полезное.

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

Сволвелл показал несколько отклоняющуюся модель: он получил самый низкий балл по number of complex clauses, который измеряет как довербальную, так и поствербальную сложность (но в основном последнюю), но он лишь чуть выше центра для другого мера, number of words before the main verb. Эта асимметрия в локусе сложности предполагает, что, хотя часть после его основных глаголов, как правило, была простой и короткой, он довольно средне, когда дело доходит до того, как он начинает свои предложения (то есть перед основными глаголами).

Примечательно, что четыре из шести кандидатов, уже прошедших квалификацию для участия в дебатах 19 декабря, - Сандерс, Уоррен, Байден и Харрис - показали относительно низкий уровень синтаксической сложности, что говорит о том, что они говорят довольно просто на стадии обсуждения.

Вот функции на основе spaCy, используемые для извлечения этих двух синтаксических свойств:

🧸 Чья речь понятна пятикласснику?

Категория, тесно связанная с синтаксической сложностью, - это удобочитаемость. Я использовал textstat, библиотеку Python, предоставляющую разнообразную статистику для измерения читабельности текста. Различные меры описаны на веб-сайте, но, подозревая, что некоторые из них взаимосвязаны, я создал быструю матрицу корреляции, приняв реализацию здесь:

import seaborn as sns
READABILITY_FEATURES = ['n_difficult_words',
 'automated_readability_index',
 'coleman_liau_index',
 'dale_chall_readability',
 'flesch_kincaid_grade',
 'flesch_reading_ease',
 'gunning_fog',
 'linsear_write_formula',
 'smog_index',
 'text_standard']
corr_matrix = df[READABILITY_FEATURES].corr().abs()
fig, ax = plt.subplots(figsize=(9,5))
sns.heatmap(corr_matrix)

Объекты, которые пересекаются в более светлых ячейках, сильно коррелированы, например gunning_fog и linear_write_formula, и в меньшей степени flesh_flesch_kincaid_grade и flesh_reading_ease, а также text_standard и gunning_fog.

Судя по тому, что описано на веб-сайте textstat, text_standard - это своего рода агрегированный показатель, который возвращает приблизительный уровень оценки, необходимый для понимания текста на основе всех других тестов, поэтому я решил построить график этого здесь:

df.agg('mean')['text_standard']
6.077291717866798

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

Эти два кандидата также получили наивысшие оценки по number of difficult words (за сегмент), еще одному показателю удобочитаемости, который, как было показано, не коррелировал с другими показателями. Обратите внимание, что Уоррен, один из наших лидеров, говорил с наименьшим количеством сложных слов на сегмент. (Она также была среди тех, кто набрал самый низкий результат на text_standard, как вы можете видеть выше.)

🦚 Кто в их речи самый эгоцентричный *?

(* Я использую этот термин для описания модели речевого поведения, которая характеризуется многочисленными словесными ссылками на самого себя. Его не следует интерпретировать как синоним других терминов, которые, возможно, несут более негативный оттенок, например, «нарциссический» или «эгоистичный». .)

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

  1. Количество местоимений 1-го лица единственного числа (1sg): «я», «мой», «мой», «я», «я»
  2. Количество местоимений 1-го лица множественного числа (1pl): «Мы», «наш», «наш», «нас», «мы»
  3. Разница между двумя числами

Будет немного тесновато со всеми двойными полосами, поэтому я разделю визуал на два графика: один для кластера кандидатов, прошедших квалификацию для дебатов 19 декабря, и один для кластера, который не участвовал (или находятся на пороге с 12/7):

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

Напротив, Ян был наименее эгоцентричным по этому показателю как в абсолютном, так и в относительном выражении, используя в среднем 1,64 местоимения «мы» против жалких 0,58 местоимений «я» на сегмент. Разница между двумя наборами местоимений от первого лица для Ян намного более разительна, чем для любого другого кандидата. Это можно легче визуализировать с помощью следующего графика, который показывает разницу между местоимениями «I» и местоимениями «мы» (местоимения «I» минус местоимения «мы»).

Чем положительнее эта разница, тем больше местоимений «я» использовал кандидат. Возвращаясь к более раннему моменту, мы подтверждаем с помощью этого графика, что, хотя Клобучар использовала больше всего местоимений «I» на сегмент, она использовала их в более умеренной пропорции к местоимениям «мы» по сравнению с Гиллибранд и Кастро, которые показали наибольшую разницу между двумя наборами местоимений.

И экстрактор функций:

🔮 Кто в своем выступлении больше всего ориентирован на будущее?

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

Используя теги spaCy, я подсчитал количество следующих слов / фраз в сегментах как грубую меру ориентированности на будущее:

  • Будущие модальные вспомогательные устройства («будет», «буду»)
  • Going + to + non-finite clause конструкции
  • Такие слова, как «завтра» и «будущее»

Вот общее количество ориентированных на будущее выражений, используемых каждым кандидатом:

В речи Уоррена и Харриса было больше всего слов, ориентированных на будущее. Это интересно, но мы должны помнить, что они также были среди кандидатов, которые говорили в целом больше всех. Поэтому, чтобы контролировать это, я взял сумму пропорций (%) ориентированных на будущее выражений по всем сегментам.

proportion_future_oriented = (df4['n_future_oriented_words'] / df['segment_length']) # segment_length == number of tokens per segment
df['proportion_future_oriented'] = proportion_future_oriented
df[['speaker', 'proportion_future_oriented']].groupby('speaker').agg('sum').sort_values('proportion_future_oriented', ascending=False).plot(kind='bar', color='navy')

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

⚔ ️Кто больше всего упоминал Трампа?

Харрис чаще всего упоминал Трампа во всех восьми дебатах, за ним следуют Янг и Букер:

Но опять же, мы должны помнить, что Харрис был среди тех, кто говорил больше всего в целом, поэтому я снова взял сумму пропорций (%) упоминаний Трампа для длины сегментов по всем сегментам.

proportion_trump_mentions = (df4['n_trump_mentions'] / df4['segment_length'])
df5['proportion_trump_mentions'] = proportion_future_oriented
df5[['speaker', 'proportion_trump_mentions']].groupby('speaker').agg('sum').sort_values('proportion_trump_mentions', ascending=False).plot(kind='bar', color='orange')

После этой корректировки мы видим, что Харрис по-прежнему остается тем, кто больше всего упоминал Трампа (то есть даже в относительном выражении). Однако, что касается Янга, несмотря на то, что он упомянул Трампа более 30 раз в этих дебатах, доля его упоминаний Трампа относительно остальной части его речи относительно низка, не более чем в среднем по сравнению со всеми другие кандидаты.

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

Пока что прошли квалификацию Байден, Буттигег, Клобучар, Уоррен, Сандерс, Стейер и Харрис (хотя последний выбыл). Ян и Габбард еще не выполнили все требования, но мы узнаем, будут ли они соответствовать 12 декабря или ранее.

Следите за обновлениями, чтобы увидеть следующий пост, в котором я использую функции, описанные в этом посте, для построения модели машинного обучения, чтобы ответить на главный вопрос: могут ли характеристики речи (сами по себе) предсказать вероятность того, что кандидат попадет в следующие дебаты? а значит, вполне возможно, их избрание президентом?