CoderCastrov logo
CoderCastrov
Covid-19

Я провел парсинг твиттер-лент современных мировых лидеров и, удивительно, они повторяют ту же ошибку, которую совершили наши предки 100 лет назад во время пандемии!!!

Я провел парсинг твиттер-лент современных мировых лидеров и, удивительно, они повторяют ту же ошибку, которую совершили наши предки 100 лет назад во время пандемии!!!
просмотров
7 мин чтение
#Covid-19

История:

С 1918 по 1920 год Испанский грипп вызванный вирусом гриппа A подтипа H1N1, заразил 500 миллионов человек и убил около 20-50 миллионов людей по всему миру. Экстремальная нищета, вызванная Первой мировой войной, привела к переполненности медицинских лагерей и больниц, что способствовало распространению пандемии по всему миру. Еще одной малоизвестной причиной этой огромной катастрофы является нехватка коммуникации (из-за ограничений технологий), которая существовала 100 лет назад. Лидеры не могли достаточно предупредить своих людей о необходимости сдерживания или предотвращения распространения этой пандемии.

Через 100 лет, в 2020 году, мы столкнулись с аналогичной пандемией под названием COVID-19, которая влияет на повседневную жизнь по всему миру. Я решил проверить, достаточно ли текущие лидеры общаются с людьми относительно серьезности этой пандемии. Я проанализировал Twitter, который является одним из самых популярных средств коммуникации, известных лидеров Дональда Трампа, Нарендры Моди и Пинарайи Виджаяна, чтобы проверить, достаточно ли они общаются для сдерживания пандемии.

Цель:

Визуализировать количество и процент COVID-19 связанных твитов лидеров в марте, апреле, мае, июне, июле и августе 2020 года.

Визуализация:

Вот графики, которые я построил с помощью Python.

Синяя полоса указывает количество COVID-19 связанных твитов среди всех твитов. Удивительно, что наблюдается большой нисходящий тренд в COVID-19 связанных твитах, несмотря на значительный восходящий тренд в количестве пациентов с COVID-19 в течение этих месяцев.

Кроме того, в случае процента COVID-19 связанных твитов наблюдается заметный нисходящий тренд.

Вывод:

Следующие потенциальные причины могут объяснить эту убывающую тенденцию в количестве твитов от лидеров за эти месяцы.

Методология:

Я специально поместил это в конец поста. Если вам не интересна техническая часть исследования, не стесняйтесь пропустить ее.

Парсинг твитов:

Парсинг твитов был выполнен с помощью API Twitter, называемого Twint. После установки Twint можно с помощью любого интерфейса командной строки (CLI) извлекать твиты любого пользователя за определенный период в любом нужном формате. Я извлекал твиты в формате csv, однако пользователь может выбрать любой формат, который он хочет использовать.

$ twint -u vijayanpinarayi --since "2020-03-01" --until "2020-09-01" -o pinarayi.csv --csv

Здесь твиты г-на Пинарайи Виджаяна с 1 марта по 31 августа экспортируются в формате csv. Обратите внимание, что параметр '— until' исключает введенную пользователем дату. В случае твитов Пинарайи все твиты, связанные с COVID-19, имеют хэштег #covid19, поэтому перевод его малаяламских твитов на английский не был необходим.

В случае твитов г-на Нарендры Моди не все твиты имели хэштеги, поэтому я обработал как его твиты, так и хэштеги для классификации. Поскольку некоторые из его твитов были на других языках, я перевел все его твиты на английский. Twint использует Google Translate для перевода твитов, что делает работу отлично. Однако Google ограничивает количество переводов за сеанс, поэтому не все твиты удалось сохранить в csv-файле одной командой. Я справился с этой проблемой, парся твиты частями на основе даты твитов, а затем объединил их в один Dataframe.

$ twint -u narendramodi --since "2020-03-01" --until "2020-03-16" -o modi1.csv --csv --translate --translate-dest en

Приведенный выше код командной строки - это один из csv-файлов, который я создал, который переводит все твиты на английский независимо от используемого языка.

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

Подготовка данных:

После того, как все твиты были спарсены, мы можем начать классификацию каждого твита на связанный с COVID-19 или нет. Я использовал пакет pandas в Python для очистки данных.

В случае керальского главного министра Пинарайи Виджаяна, все связанные с COVID-19 твиты содержат хэштеги #covid19 или #covid19india, поэтому достаточно искать слово "covid" в хэштегах.

df_pin["Indexes"]= df_pin["hashtags"].str.find("covid")

Вышеприведенный код создает новый столбец (признак) "Indexes", который будет иметь значение -1, если хэштег не содержит слово "covid", и дает индекс позиции слова в противном случае. Например, значение 2 означает, что третий символ в хэштеге является словом "covid", начиная с (помните, что индексация в Python начинается с 0). Теперь мы можем непосредственно классифицировать твиты с помощью следующего кода: классифицировать твит как "Не связанный с COVID" если значение "Indexes" равно -1, и как "Связанный с COVID" в противном случае.

df_pin['Covid_Related'] = df_pin['Indexes'].apply(lambda x: 'False' if x == -1 else 'True')

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

Общие хэштеги, связанные с COVID-19, это '#indiafightscorona', '#indiafightscorona', '#jantacurfew', '#janatacurfew', '#stayhome' и '#rjcurfew' с словами 'corona', 'curfew' и 'stayhome' в качестве общих слов. Аналогично предыдущей классификации, создаются 3 новых столбца "Indexes", которые проверяют наличие этих слов в хэштегах.

df_modi["Index1"]= df_modi["hashtags"].str.find("corona")
df_modi["Index2"]= df_modi["hashtags"].str.find("curfew")
df_modi["Index3"]= df_modi["hashtags"].str.find("stayhome")

Теперь создается новый столбец "Covid_Tag", который проверяет, все ли эти индексы равны -1, и классифицирует их как False в столбце "Covid_Tag". Если хотя бы одно из ключевых слов хэштега ('corona', 'curfew' и 'stayhome') найдено, "Covid_Tag" классифицируется как True.

Затем, с помощью пользовательской функции, проверяются все его переведенные твиты на наличие ключевых слов, связанных с COVID-19, таких как 'janta', 'janata', 'mask', 'covid', 'corona', 'virus', 'curfew', 'distancing', 'chinavirus', 'lockdown', 'quarantine', 'pandemic', 'kovid', 'jairbolsonaro', 'borisjohnson', 'pm-cares' и 'hydroxychloroquine'.

def matcher(x):
    for i in words:
        if i in x.lower():
            return True
    else:
        return False

df_modi['Covid_Tweet'] = df_modi['translate'].apply(matcher)

С использованием этой функции создается новый бинарный столбец "Covid_Tweet", который дает True, если хотя бы одно из слов содержится в переведенном твите, и False, если нет. Теперь, используя оператор OR между столбцом "Covid_Tweet" и "Covid_Tag", создается новый столбец "Covid_Related".

df_modi['Covid_Related'] = df_modi['Covid_Tag'] | df_modi['Covid_Tweet']# | - оператор OR в Python

Наконец, для президента США Дональда Трампа используется та же функция "matcher" для фильтрации твитов, связанных с COVID-19.

df_trump['Covid_Related'] = df_trump['tweet'].apply(matcher)

Построение графиков:

Построение графиков осуществляется с использованием Pandas Dataframe Plot, который использует matplotlib.pyplot в качестве пакета для построения графиков. Например, с использованием группировки данных pandas по месяцам находится количество твитов, связанных с COVID-19, и количество твитов, не связанных с COVID-19, месяц за месяцем.

plt1 = df_pin.groupby(['month','Covid_Related'], sort = True).size().unstack()
plt1 = plt1.reindex(['Март', 'Апрель','Май', 'Июнь', 'Июль', 'Август'])
ax1 = plt1.plot(kind='bar', color = ['красный', 'синий'])
ax1.set_title('Классификация твитов Пинарайи Виджаяна, связанных с COVID-19')
for p in ax1.patches:
    ax1.annotate(str(int(p.get_height())), (p.get_x(), p.get_height()))

Здесь, после подсчета количества, объект Dataframe сортируется по месяцам с использованием метода reindex. Затем создается объект графика с помощью pandas.DataFrame.plot, где аргумент kind используется для указания типа графика, а color используется для установки цветов столбцов. Затем с помощью метода set_title создается заголовок для графика, а с помощью метода annotate аннотируются высоты столбцов фактическими значениями.

plt4 = df_pin.groupby(['month','Covid_Related'], sort = True).size().unstack()
plt4 = plt4.reindex(['Март', 'Апрель','Май', 'Июнь', 'Июль', 'Август'])
plt4['процент'] = round((plt4['True']/ (plt4['True']+ plt4['False'])*100),2)
ax4.set_title('Процент твитов, связанных с COVID-19: Пинарайи Виджаян')
ax4.set_ylim(0,100) # Установка одинакового масштаба от 0 до 100 для всех графиков
# Аннотация
for p in ax4.patches:
    width = p.get_width()
    height = p.get_height()
    x, y = p.get_xy() 
    ax4.annotate(f'{height}%', (x + width/2, y + height*1.02), ha='center') # Форматирование аннотации

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

Вуаля!!!

Если возникнут какие-либо вопросы, пожалуйста, задайте их здесь, в разделе комментариев, и я постараюсь разъяснить. Jupyter-ноутбук и набор данных можно найти в моем репозитории Github.

Заключение:

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

Ссылки:

Reddit-пост от u/desi_swagger

Twint