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

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


  1. samodum
    17.06.2015 12:14
    +2

    Как он будет определять эмоциональность выражений типа:
    «I don't hate this bastard!»
    «Awesome bastards!»
    «Do you hate this bastard?»


    1. Assistant_Branch_Manager Автор
      17.06.2015 14:56

      Выражения типа «Awesome bastards!» такой метод оценки может оценивать некорректно (скорее всего около нуля, так как присутствует одно сильно негативное и одно сильно положительное слово), хотя стоит заметить, что и человек испытывает сложности в оценки подобных выражений вырванных из контекста.
      В любом случае данный метод предназначен для оценки в среднем большого количества информации, а не единичных твитов. Например, если в данном месяце вместе со словом «Obama» стали чаще встречаться позитивные/негативные слова, (в сравнении с предыдущем месяцем), то можно сделать вывод об положительном/отрицательном изменении рейтинга. Главное, что бы реальное изменение настроений было больше чем погрешность измерений.
      Конечно дополнение данного метода возможностью распознавать словосочетания, а также отрицательные и вопросительные предложения, позволит повысить его точность и осмысленность.


      1. Error_403_Forbidden
        18.06.2015 18:58

        в оценкЕ
        с предыдущИМ
        ЧТОБЫ — слитно
        и т.д.
        ну и запятые.

        Русский язык слабоват. Рановато ещё заниматься обработкой текстов


  1. ServPonomarev
    17.06.2015 14:10
    +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


  1. AndrewNikolaevich
    18.06.2015 22:22

    Есть одна большая проблема — грамотность пользователей Twitter-a.


    1. Kaiser
      19.06.2015 14:58

      Можно пропускать твит через корректор и только потом добавлять его в обучающую выборку/классификатор. Но время на освоение PyEnchant или yandex speller (если проходите по лимитам) будет потрачено. А количество ошибок может остаться прежним. Когда я, например, твиты пишу, мне телефон/браузер явные опечатки исправляет.

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

      Но сам подход с присвоением баллов словам мне перспективным не кажется. Сейчас я бы попробовал bag of words + svm. Но, уверен, что для данной задачи на текстах есть более хитрые подходы с лучшим качеством.


  1. Assistant_Branch_Manager Автор
    18.06.2015 23:00

    Данный метод как раз позволяет добавлять слова с ошибками и сленг в словарь (главное, чтобы такие слова встречались вместе с другими корректными, уже оцененными словами в одном твите).
    ex: bro=-0.29


    1. AndrewNikolaevich
      19.06.2015 13:27

      но тогда если я всё правильно понял, то слову с ошибкой будет соответствовать другое число, нежели правильно написанному?


      1. Assistant_Branch_Manager Автор
        19.06.2015 16:50

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