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

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

Предположим, нам надо оценить эмоциональную окраску твитов, например, для проведения различных социологических замеров (о том, могут ли такие замеры заменить классические соц. опросы см. здесь). В таком случае, очевидным подходом будет взять словарь эмоционально окрашенных слов, где эмоции выражены количественно, и оценивать твиты по наличию слов из этого словаря. Но тут возникает проблема: такие словари редки, малы и могут устареть, к тому же не соответствуют «живому» языку общения в соц. сетях. Кажется законным пополнять доступные словари новыми словами, при этом приписывая им эмоциональность твитов, в которых эти слова встречаются (точнее, среднее арифметическое по всем твитам, содержащим данное слово). Собственно такая задача предлагается к решению в курсе «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 в начальном словаре.

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

Комментарии 9

    +2
    Как он будет определять эмоциональность выражений типа:
    «I don't hate this bastard!»
    «Awesome bastards!»
    «Do you hate this bastard?»
      0
      Выражения типа «Awesome bastards!» такой метод оценки может оценивать некорректно (скорее всего около нуля, так как присутствует одно сильно негативное и одно сильно положительное слово), хотя стоит заметить, что и человек испытывает сложности в оценки подобных выражений вырванных из контекста.
      В любом случае данный метод предназначен для оценки в среднем большого количества информации, а не единичных твитов. Например, если в данном месяце вместе со словом «Obama» стали чаще встречаться позитивные/негативные слова, (в сравнении с предыдущем месяцем), то можно сделать вывод об положительном/отрицательном изменении рейтинга. Главное, что бы реальное изменение настроений было больше чем погрешность измерений.
      Конечно дополнение данного метода возможностью распознавать словосочетания, а также отрицательные и вопросительные предложения, позволит повысить его точность и осмысленность.
        0
        в оценкЕ
        с предыдущИМ
        ЧТОБЫ — слитно
        и т.д.
        ну и запятые.

        Русский язык слабоват. Рановато ещё заниматься обработкой текстов
      +2
      Что такое хорошо, что такое плохо (скипграммы):

      Enter word or sentence (EXIT to break): хорошо

      Word: хорошо Position in vocabulary: 1322

      Word Cosine distance
      — хоршо 0.748067
      хорощо 0.713937
      прекрасно 0.682211
      отлично 0.679190
      плохо 0.675239
      неплохо 0.641755
      интересно 0.638518
      просто 0.636137
      спокойно 0.634527
      всегда 0.620789
      даже 0.620331
      замечательно 0.617962
      так 0.616831
      зорошо 0.615472
      только 0.612478
      вообще 0.610174
      очень 0.608186
      хоошо 0.608186
      то 0.607600
      хрошо 0.603901
      ужасно 0.599045
      страшно 0.598783
      но 0.590102
      легко 0.588955
      круто 0.586992
      хуже 0.586305
      хороо 0.585358
      наоборот 0.585256
      понятно 0.584545
      весело 0.583578
      совсем 0.581358
      наверное 0.575665
      шорошо 0.575417
      потому 0.572287
      странно 0.569226
      она 0.568151
      харошо 0.567638
      хлрошо 0.567548
      еще 0.565177
      приятно 0.563256
      Enter word or sentence (EXIT to break): плохо

      Word: плохо Position in vocabulary: 1465

      Word Cosine distance
      — полохо 0.755004
      плозо 0.743426
      плоха 0.740933
      сильно 0.695998
      плохл 0.687667
      слабо 0.678554
      нормально 0.678436
      хорошо 0.675239
      туго 0.657558
      не 0.657456
      рлохо 0.644137
      поохо 0.642739
      тяжело 0.642100
      постоянно 0.639980
      долго 0.636029
      пдохо 0.634517
      медленно 0.626684
      плхо 0.620504
      плохр 0.610601
      хуже 0.591879
      постояно 0.591841
      плоо 0.588206
      часто 0.585112
      плрхо 0.585109
      иплохо 0.580389
      медлено 0.579150
      тежело 0.578908
      неприятно 0.578856
      нармально 0.571858
      плоъо 0.568687
      плочо 0.567627
      плоховато 0.560026
      что 0.558980
      ужасно 0.558124
      иногда 0.553562
      резко 0.552327
      хреново 0.551475
      почемуто 0.549690
      почему 0.548091
      похо 0.547614

      (багофвордс):

      Enter word or sentence (EXIT to break): хорошо

      Word: хорошо Position in vocabulary: 1450

      Word Cosine distance
      — хоршо 0.790929
      хорощо 0.745507
      отлично 0.701097
      одихаем 0.691935
      плохо 0.684141
      хороо 0.675422
      хороошо 0.670692
      вавилушка 0.661926
      преживай 0.654526
      рэпцентр 0.651677
      ъорошо 0.651287
      хоошо 0.648912
      хорошол 0.646242
      эжить 0.644421
      хорлшо 0.643647
      сеобудит 0.643139
      замечтательно 0.642189
      хрошо 0.641470
      неплохо 0.641023
      каторжником 0.635752
      прекрасно 0.633564
      хорошр 0.631457
      замечательно 0.628330
      зорошо 0.627905
      хорошоскачать 0.625179
      русижить 0.624352
      хорошоъ 0.619743
      хооршо 0.614906
      чбокси 0.611316
      посвищут 0.609207
      правдоискательства 0.606537
      оболда 0.606388
      чобски 0.603656
      хороршо 0.603111
      эить 0.601693
      вердючка 0.600977
      звенина 0.598875
      оболдуеве 0.598266
      дочур 0.594444
      некрвсов 0.593791
      Enter word or sentence (EXIT to break): плохо

      Word: плохо Position in vocabulary: 1591

      Word Cosine distance
      — плоха 0.740065
      нормально 0.693406
      полохо 0.688477
      хорошо 0.684141
      не 0.674494
      рлохо 0.660781
      пдохо 0.651909
      плоо 0.648410
      медленно 0.647129
      пложо 0.646863
      плозо 0.645705
      плдохо 0.639308
      прлохо 0.638288
      слабо 0.629214
      сильно 0.628831
      хьютор 0.626530
      иногда 0.623982
      плхо 0.620968
      почемуто 0.620181
      долго 0.620131
      пдлохо 0.619860
      перестал 0.618821
      нлохо 0.617709
      дыит 0.617141
      тяжело 0.615071
      пплохо 0.612485
      плохл 0.612272
      хуже 0.611977
      перестала 0.611066
      прерывесто 0.609763
      плочо 0.609388
      неровно 0.607406
      почему 0.606728
      нармально 0.606544
      пережимаешь 0.605609
      постоянно 0.605018
      неустойчиво 0.600829
      заврдится 0.600277
      плохол 0.599486
      мало 0.599094
        0
        Есть одна большая проблема — грамотность пользователей Twitter-a.
          0
          Можно пропускать твит через корректор и только потом добавлять его в обучающую выборку/классификатор. Но время на освоение PyEnchant или yandex speller (если проходите по лимитам) будет потрачено. А количество ошибок может остаться прежним. Когда я, например, твиты пишу, мне телефон/браузер явные опечатки исправляет.

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

          Но сам подход с присвоением баллов словам мне перспективным не кажется. Сейчас я бы попробовал bag of words + svm. Но, уверен, что для данной задачи на текстах есть более хитрые подходы с лучшим качеством.
          0
          Данный метод как раз позволяет добавлять слова с ошибками и сленг в словарь (главное, чтобы такие слова встречались вместе с другими корректными, уже оцененными словами в одном твите).
          ex: bro=-0.29
            0
            но тогда если я всё правильно понял, то слову с ошибкой будет соответствовать другое число, нежели правильно написанному?
              0
              Если это действительно ошибка (совершается случайно), то вероятность употребления такого слова в правильном и искаженном написании рядом с положительными/отрицательными уже оцененными словами одинакова, следовательно при достаточно большом объеме твитов у слова и его искаженной версии будут одинаковые «числа».
              Если же слово намеренно коверкается, скорее всего у него другое значение, следовательно вероятность встретиться с положительно/отрицательно оцененными словами разная для вариантов написания, таким образом и их оценка будет разная.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое