О расширении словаря эмоционально окрашенных слов на базе сообщений Твиттера +3


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

Предположим, нам надо оценить эмоциональную окраску твитов, например, для проведения различных социологических замеров (о том, могут ли такие замеры заменить классические соц. опросы см. здесь). В таком случае, очевидным подходом будет взять словарь эмоционально окрашенных слов, где эмоции выражены количественно, и оценивать твиты по наличию слов из этого словаря. Но тут возникает проблема: такие словари редки, малы и могут устареть, к тому же не соответствуют «живому» языку общения в соц. сетях. Кажется законным пополнять доступные словари новыми словами, при этом приписывая им эмоциональность твитов, в которых эти слова встречаются (точнее, среднее арифметическое по всем твитам, содержащим данное слово). Собственно такая задача предлагается к решению в курсе «Introduction to Data Science». Возникает вопрос: является ли такое продолжение законным? Будет ли полученный словарь зависеть от тех твитов на которых он расширялся или, точнее, насколько будут отличаться два словаря, полученные из одного и того же начального словаря, но дополненные на разных твитах?

Оценка твитов


Получить твиты, а, точнее, доступ к потоку новых твитов, можно, зарегистрировав приложение на сайте Твиттера через URL и используя python модуль — oauth2 (подробнее в описании соответствующего проекта в курсе, приведенном выше).

Сам по себе твит выглядит так (словарь списков словарей ....), текст выделен жирным
{u'contributors': None, u'truncated': False, u'text': u"Nice to know you aren't going to disappear on me again", u'in_reply_to_status_id': None, u'id': 608365231232978944L, u'favorite_count': 0, u'source': u'Twitter for iPhone', u'retweeted': False, u'coordinates': None, u'timestamp_ms': u'1433880548662', u'entities': {u'user_mentions': [], u'symbols': [], u'trends': [], u'hashtags': [], u'urls': []}, u'in_reply_to_screen_name': None, u'id_str': u'608365231232978944', u'retweet_count': 0, u'in_reply_to_user_id': None, u'favorited': False, u'user': {u'follow_request_sent': None, u'profile_use_background_image': False, u'default_profile_image': False, u'id': 906813948, u'verified': False, u'profile_image_url_https': u'https://pbs.twimg.com/profile_images/608142391472570368/b0RxTzZS_normal.jpg', u'profile_sidebar_fill_color': u'000000', u'profile_text_color': u'000000', u'followers_count': 186, u'profile_sidebar_border_color': u'000000', u'id_str': u'906813948', u'profile_background_color': u'000000', u'listed_count': 0, u'profile_background_image_url_https': u'https://abs.twimg.com/images/themes/theme1/bg.png', u'utc_offset': -18000, u'statuses_count': 1197, u'description': u«There's something with you that makes me smile», u'friends_count': 184, u'location': u'CCTX', u'profile_link_color': u'AF65D4', u'profile_image_url': u'http://pbs.twimg.com/profile_images/608142391472570368/b0RxTzZS_normal.jpg', u'following': None, u'geo_enabled': True, u'profile_banner_url': u'https://pbs.twimg.com/profile_banners/906813948/1431466945', u'profile_background_image_url': u'http://abs.twimg.com/images/themes/theme1/bg.png', u'name': u'Abigail Garcia', u'lang': u'en', u'profile_background_tile': False, u'favourites_count': 8431, u'screen_name': u'AbigailG_23', u'notifications': None, u'url': None, u'created_at': u'Fri Oct 26 21:33:39 +0000 2012', u'contributors_enabled': False, u'time_zone': u'Central Time (US & Canada)', u'protected': False, u'default_profile': False, u'is_translator': False}, u'geo': None, u'in_reply_to_user_id_str': None, u'possibly_sensitive': False, u'lang': u'en', u'created_at': u'Tue Jun 09 20:09:08 +0000 2015', u'filter_level': u'low', u'in_reply_to_status_id_str': None, u'place': None}

Лучше сохранять только сам текст для экономии места. Также можно отбросить другие языки, так как в дальнейшем будут анализироваться твиты только на английском.

Следующая часть — это оценка твитов на базе словаря. Я использовал словарь из 2500 слов, каждому слову приписано значение от -5 до 5.

Схема оценки твитов:



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

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

Схема составления нового словаря:



Сравнение словарей


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

Параметры, которые вычислялись


корреляция — чем ближе к +1, тем лучше. Словари с корреляцией равной +1 «ведут» себя одинаково.
среднее разности векторов — насколько в среднем различалась оценка твитов двумя словарями
стандартное отклонение среднего — чтобы подсчитать вероятность того, что разница в оценке твита двумя словарями — «случайная» ошибка.

Что получилось


Если словари создавать на базе из 8 тыс. твитов, то:
корреляция — 0.66
среднее разности — 0.105
стандартное отклонение — 0.042

То есть, отклонение среднего разности от нуля (предполагаем, что ошибка случайна) равно 2.5 стандартных отклонений, что, конечно, многовато. Но в принципе, можно сказать, что словари оценивают похоже. Если же базу брать в размере 60 тыс. твитов для каждого словаря, то результаты намного лучше:
корреляция — 0.89
среднее разности — 0.00086
стандартное отклонение — 0.0080

То есть, отклонение среднего разности от нуля равно 0.1 стандартных отклонений, что позволяет сделать вывод о «случайности» ошибки (разности).

Таким образом, мы получили, что словари, расширенные на базе более 60 тыс. твитов, не зависят от самой базы. На практике это означает, что 30 минут скачивания потока Твиттера (60 тыс. отфильтрованных сообщений) позволяют получить новый, расширенный словарь с количеством слов — 16.5 тыс. вместо 2.5 в начальном словаре.

Дальнейшая работа заключается в том, чтобы проверить, что такой расширенный словарь будет не только «единственным» но и правильным: например, встроить процедуру корректировки значений на некоторой известной базе или процедуру конечной сверки полученного словаря с неиспользованной частью начального словаря.




К сожалению, не доступен сервер mySQL