Предположим, нам надо оценить эмоциональную окраску твитов, например, для проведения различных социологических замеров (о том, могут ли такие замеры заменить классические соц. опросы см. здесь). В таком случае, очевидным подходом будет взять словарь эмоционально окрашенных слов, где эмоции выражены количественно, и оценивать твиты по наличию слов из этого словаря. Но тут возникает проблема: такие словари редки, малы и могут устареть, к тому же не соответствуют «живому» языку общения в соц. сетях. Кажется законным пополнять доступные словари новыми словами, при этом приписывая им эмоциональность твитов, в которых эти слова встречаются (точнее, среднее арифметическое по всем твитам, содержащим данное слово). Собственно такая задача предлагается к решению в курсе «Introduction to Data Science». Возникает вопрос: является ли такое продолжение законным? Будет ли полученный словарь зависеть от тех твитов на которых он расширялся или, точнее, насколько будут отличаться два словаря, полученные из одного и того же начального словаря, но дополненные на разных твитах?
Оценка твитов
Получить твиты, а, точнее, доступ к потоку новых твитов, можно, зарегистрировав приложение на сайте Твиттера через URL и используя python модуль — oauth2 (подробнее в описании соответствующего проекта в курсе, приведенном выше).
Лучше сохранять только сам текст для экономии места. Также можно отбросить другие языки, так как в дальнейшем будут анализироваться твиты только на английском.
Следующая часть — это оценка твитов на базе словаря. Я использовал словарь из 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)
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
AndrewNikolaevich
18.06.2015 22:22Есть одна большая проблема — грамотность пользователей Twitter-a.
Kaiser
19.06.2015 14:58Можно пропускать твит через корректор и только потом добавлять его в обучающую выборку/классификатор. Но время на освоение PyEnchant или yandex speller (если проходите по лимитам) будет потрачено. А количество ошибок может остаться прежним. Когда я, например, твиты пишу, мне телефон/браузер явные опечатки исправляет.
С точки зрения последовательности действий подход мне кажется верным. Сначала получаем приемлемый результат, убеждаемся в перспективности подхода, а потом занимаемся тонкой настройкой.
Но сам подход с присвоением баллов словам мне перспективным не кажется. Сейчас я бы попробовал bag of words + svm. Но, уверен, что для данной задачи на текстах есть более хитрые подходы с лучшим качеством.
Assistant_Branch_Manager Автор
18.06.2015 23:00Данный метод как раз позволяет добавлять слова с ошибками и сленг в словарь (главное, чтобы такие слова встречались вместе с другими корректными, уже оцененными словами в одном твите).
ex: bro=-0.29AndrewNikolaevich
19.06.2015 13:27но тогда если я всё правильно понял, то слову с ошибкой будет соответствовать другое число, нежели правильно написанному?
Assistant_Branch_Manager Автор
19.06.2015 16:50Если это действительно ошибка (совершается случайно), то вероятность употребления такого слова в правильном и искаженном написании рядом с положительными/отрицательными уже оцененными словами одинакова, следовательно при достаточно большом объеме твитов у слова и его искаженной версии будут одинаковые «числа».
Если же слово намеренно коверкается, скорее всего у него другое значение, следовательно вероятность встретиться с положительно/отрицательно оцененными словами разная для вариантов написания, таким образом и их оценка будет разная.
samodum
Как он будет определять эмоциональность выражений типа:
«I don't hate this bastard!»
«Awesome bastards!»
«Do you hate this bastard?»
Assistant_Branch_Manager Автор
Выражения типа «Awesome bastards!» такой метод оценки может оценивать некорректно (скорее всего около нуля, так как присутствует одно сильно негативное и одно сильно положительное слово), хотя стоит заметить, что и человек испытывает сложности в оценки подобных выражений вырванных из контекста.
В любом случае данный метод предназначен для оценки в среднем большого количества информации, а не единичных твитов. Например, если в данном месяце вместе со словом «Obama» стали чаще встречаться позитивные/негативные слова, (в сравнении с предыдущем месяцем), то можно сделать вывод об положительном/отрицательном изменении рейтинга. Главное, что бы реальное изменение настроений было больше чем погрешность измерений.
Конечно дополнение данного метода возможностью распознавать словосочетания, а также отрицательные и вопросительные предложения, позволит повысить его точность и осмысленность.
Error_403_Forbidden
в оценкЕ
с предыдущИМ
ЧТОБЫ — слитно
и т.д.
ну и запятые.
Русский язык слабоват. Рановато ещё заниматься обработкой текстов