Затем в рамках основного теста программой были обработаны 10 текстов: по два отрывка из авторских статей изданий «Аргументы и Факты» и «Грани», по два отрывка новостных статей с сайтов изданий «Газета. Ru» и «РИА Новости», а также два отрывка статьи отрытой интернет-энциклопедии «Луркоморье». Все отрывки представлены в Приложении 2. Сводные результаты работы программы в сравнении с работой человека представлены в таблице ниже:
Таблица 2 - Соответствие маркеров, выделенных программой и выделенных человеком
|
Текст № |
Обращений к пользователю / объём текста (сл) |
Список маркеров |
Список маркеров, обнаруженных человеком |
|
|
1 (АиФ) |
21 / 102 (20%) |
антирусский, уничтожение, распадаться, агрессивный, ненавидеть |
антирусским, уничтожения, разрушение, распадается, агрессивную |
|
|
2 (АиФ) |
25/262 (9%) |
фига, незалежный, нелегально, бесправный, наживаться, криминалитет, обеднеть, слыть, матерный |
фигу, Незалежной, наживается, криминалитет, флирта |
|
|
3 (Грани) |
46 / 183 (25%) |
скандалить, титул, ненавистник, эдак, завистник, обзывать, невежда, норовить, наотмашь, сгубить, мразь, конченый, униматься, схватить, клеветник, голосовать, распоследний, плагиатор, плагиат, враг, свеженаколоть |
скандалит, ненавистники, эдак, завистники, обзывая, невеждой, норовят, наотмашь, сгубившие, мрази, конченые, унимаются, схвачено, клеветникам, распоследней, плагиатором, плагиате, враги, свеженаколотую |
|
|
4 (Грани) |
15/194 (7%) |
начистоту, сомнение, юлита(юлить), неявка, неясный, приговаривать, сажать |
юлит, (не)явки, корзиночке, приговаривайте, ерундой |
|
|
5 (Газета) |
14 / 92 (15%) |
шпионаж, шпионаж |
шпионаж, шпионаже |
|
|
6 (Газета) |
10/220 (4%) |
- |
- |
|
|
7 (РИА) |
15 / 67 (22%) |
- |
- |
|
|
8 (РИА) |
4/175 (2%) |
- |
- |
|
|
9 (Лурк) |
36 / 132 (27%) |
школота, невольный, блджад, иудаизм, круглоголовый, арменоид, фошыст, срать, западло, похуй |
школота, блджад, круглоголовыми, арменоидами, фошысты, срать, западло, похуй, ЕРЖ, маргинальной |
|
|
10 (Лурк) |
36/193(18%) |
алконавт, халявный, жрачок(жрачка), корпоративчик, поцреот, мизантроп, скатерть, бухло, нажираться, трещать, невзначай, скормить, завалять, зохавать, просрать, деньга(деньги), просираться, выблёвываться |
алконавт, планктон, халявной, жрачки, корпоративчике, поцреоты, ТП, бухлом, нажираться, невзначай, скормить, завалявшие, талым, зохавать, просрать, просираются, выблёвываются |
Как можно видеть из таблицы 2, в среднем программа обращается к пользователю менее чем в четверти случаев, причём основные трудности, как уже сказано выше, связаны с именами собственными, их производными и сокращениями, а также с редкими и/или специфическими для конкретной области словами, обсценной лексикой и намеренным искажением написания слова (такие слова по решению пользователя могут не заноситься в словарь, но всё равно учитываются в общем подсчёте).
Стоит обратить внимание на метрики точности программы, полученные по результатам тестирования. Они представлены в таблице ниже:
Таблица 3 - Метрики точности программы, основанной на словарях
|
Текст |
Accuracy |
Precision |
Recall |
F-measure |
|
|
1 |
0,97 |
0,6 |
0,75 |
0,66 |
|
|
2 |
0,97 |
0,4 |
0,8 |
0,53 |
|
|
3 |
0,98 |
0,9 |
1,0 |
0,94 |
|
|
4 |
0,97 |
0,57 |
0,8 |
0,66 |
|
|
5 |
1,0 |
1,0 |
1,0 |
1,0 |
|
|
6 |
1,0 |
1,0 |
1,0 |
1,0 |
|
|
7 |
1,0 |
1,0 |
1,0 |
1,0 |
|
|
8 |
1,0 |
1,0 |
1,0 |
1,0 |
|
|
9 |
0,96 |
0,8 |
0,8 |
0,8 |
|
|
10 |
0,97 |
0,9 |
0,8 |
0,85 |
|
|
Среднее |
0,98 |
0,82 |
0,89 |
0,84 |
Из таблицы 3 можно видеть, что программа показывает достаточно высокие результаты, особенно на текстах из новостных сводок (№№ 5-8), которые содержат исключительно фактическую информацию без авторской оценки. Ошибки могут быть связаны с несколькими факторами. Так, программа не может разрешать семантическую неоднозначность, а также иронию, сарказм и другие приёмы, которые не маркируются специфической лексикой. Однако алгоритм чаще маркирует нейтральные слова как интолерантные, а не наоборот, и оба типа ошибок могут исправляться пользователем путём редактирования словарей, что также позволит уменьшить число случаев обращения программы к пользователю при длительном использовании. Хотя стоит заметить, что снизить это число до абсолютного нуля не представляется возможным, так как в большинстве текстов найдутся неизвестные программе имена, фамилии или названия, а также во многих текстах авторы будут специально искажать слова, что также не будет входить в поле распознавания программы. Однако, если пользователю необходим только поиск определённых маркеров, он может пользоваться программой без режима «ручного корректирования», что значительно упростит работу тем исследователям, кто уже знает, маркеры какого типа хочет найти в тексте.
3.2 Классификаторы на основе методов машинного обучения
В ходе данной работы были опробованы 3 алгоритма: Наивный Байесовский классификатор, логистическая регрессия и случайный лес. Все классификаторы были обучены и протестированы на одних и тех же данных.
3.2.1 Тренировочные данные и процесс обучения
Для корректной работы алгоритмы должны быть обучены на большом количестве правильно размеченных данных - текстах с указанием их тональности (положительная/нейтральная или отрицательная). Так как собрать корпус достаточного размера с равным количеством положительных и отрицательных примеров не представляется возможным, было решено использовать готовый корпус коротких текстов на русском языке, собранный на основе постов микроблоггинговой платформы twitter Ю.В. Рубцовой Рубцова Ю. В. Построение корпуса текстов для настройки тонового классификатора // Программные продукты и системы, 2015, №1(109), - С.72-78. От тренировочных корпусов отзывов эту коллекцию отличает то, что микроблоги более общетематические, они охватывают больше предметных областей, менее структурированы, а значит, классификатор обучится нескольким разнообразным паттернам, в них более сильно выражены эмоционально-оценочные коннотации. От корпусов новостей они отличны более широкой охватываемой тематикой, а также тем, что их возможно разделить по полярности, в то время как новости более нейтральны и более узкоспециализированы.
Кроме того, основное назначение алгоритмов в рамках данной задачи - не классификация сама по себе, а анализ того, как определённые слова влияют на результаты классификации, что также обосновывает использование корпуса твитов для обучения, так как в результате алгоритмы будут получать конкретные вероятности того, что текст положителен или отрицателен. При этом итоговый результат классификации не настолько важен, хотя, как показала проверка классификаторов, они корректно определяют новостные тексты как «неотрицательные».
Таким образом, обучающая выборка состояла из 114 991 позитивной и 111 923 негативных записей, при этом из 12 атрибутов были выделены 2, необходимых для классификации: класс сообщения и его текст. Все тексты были лемматизированы при помощи инструмента MorphAnalyzer библиотеки pymorhy2 Korobov M.: Morphological Analyzer and Generator for Russian and Ukrainian Languages // Analysis of Images, Social Networks and Texts, pp 320-332 (2015). и преобразованы в матрицы, где каждое слово представлено как его метрика Tf-Idf (произведение отношения числа вхождений слова к числу слов в документе и обратной частоты документа, используется для оценки важности слова в тексте) с помощью инструмента TfIdfVectorizer библиотеки sklearn, применённого с параметрами по умолчанию. Затем преобразованные тексты были разделены для применения кросс-валидации с помощью метода KFold. Классификаторы также применялись с параметрами по умолчанию.
Для оценки качества обучения использовались следующие метрики качества:
Accuracy - доля правильно классифицированных объектов;
Precision - доля истинно положительных объектов;
Recall - доля всех найденных положительных объектов;
F-measure -
Результаты всех классификаторов даны в таблице ниже:
Таблица 4 - Значения метрик качества обученных классификаторов
|
Классификатор |
Accuracy |
Precision |
Recall |
F-measure |
|
|
Наивный Байес |
0.74 |
0.76 |
0.72 |
0.74 |
|
|
Логистическая регрессия |
0.75 |
0.74 |
0.69 |
0.76 |
|
|
Случайный лес (100 деревьев) |
0.72 |
0.73 |
0.69 |
0.71 |
3.2.2 Принцип работы основного алгоритма
Так как классификаторы обучены на коротких текстах, решено использовать два вида классификации: на уровне абзаца и на уровне предложения. Для этого текст первоначально разбивается на абзацы либо предложения, затем каждая часть лемматизируется и очищается от пунктуационных знаков и заимствований на иностранных языках. Затем алгоритм проходит по множеству слов текста и для каждого слова создаёт новый объект, получающийся из старого путём удаления всех вхождений данного слова. Все полученные объекты (основной текст и его варианты) трансформируются аналогично объектам тренировочной выборки. Для основного объекта делается предсказание выбранным классификатором, в результате чего алгоритм получает вероятности принадлежности объекта к негативному и позитивному классам. Затем такие же предсказания делаются для каждого из полученных вариантов, и в отдельный словарь для конкретного слова записывается разница вероятностей по типу: {w: pmain(-1) - pnew(-1)}, где w - удаляемое из текста слово, pmain(-1) - вероятность основного текста принадлежать к негативному классу, pnew(-1) - вероятность варианта текста без данного слова принадлежать к негативному классу.
После записи разниц вероятностей для всего множества слов текста алгоритм сортирует их по убыванию и извлекает слова, для которых эта разница больше определённого порогового значения threshold, установленного 0.1. Эти слова, как наиболее влияющие на вероятность текста принадлежать к негативно-оценочному классу, считаются принадлежащими к интолерантной лексике.
3.2.3 Тестирование и результаты
Все классификаторы были протестированы на тех же десяти текстах, на которых тестировалась программа на основе словарей. Результаты тестирования представлены в таблицах ниже:
Таблица 5 - Результат тестирования Наивного Байесовского классификатора
|
Текст № |
Список маркеров на уровне абзаца |
Список маркеров на уровне предложения |
Список маркеров, обнаруженных человеком |
|
|
1 (АиФ) |
разрушение, присягнуть |
который, разрушение, река, польша, ненавидеть, удаться, с, увидеть, куски, агрессивный, уничтожение, превращаться |
антирусским, уничтожения, разрушение, распадается, агрессивную |
|
|
2 (АиФ) |
ограничения, сразу, страдать, европеец, жаловаться, стран, италии, от, то, гопак, в, частый, танцевать, отказ, работник, не |
фига, для, же, дело, самый, о, забывают, на, уехать, италии, что, обвинять, всё, украинец, власть, насколько, считают, ближний |
фигу, Незалежной, наживается, криминалитет, флирта |
|
|
3 (Грани) |
хотя, плагиат, предпоследний, россии, этот, вак, награждать, хозяин, являться, образование, а, весь, цензор, даже, скандалит, ненавистник, итальянский, васильевой, инстанция, уже, открывается, к, автореферат, тоже свеженаколоть, такой, двое, из, однако, с, вдруг, неприятелями, министр, умереть |
министр, выписывать, награждать, этот, венеция, а, хозяин, мразь, на, конченый, за, отказываться, уже, недоумение, происходящим, коллега, сообщив, распоследней, образование, лицо, что, плагиатор, хотя, в, не, он, обвинять, открывается, к, автореферат, такой, двое, тоже, однако, из, карту, рукав, свеженаколоть, козырный |
скандалит, ненавистники, эдак, завистники, обзывая, невеждой, норовят, наотмашь, сгубившие, мрази, конченые, унимаются, схвачено, клеветникам, распоследней, плагиатором, плагиате, враги, свеженаколотую |
|
|
4 (Грани) |
сажать, письменный, показания, совпадают, загрузить |
не, сомнение, тут, может, юлита(юлит), он, человек, загрузить, что, а, делами, районный, и, другой, какой-то, ужасно |
юлит, (не)явки, корзиночке, приговаривайте, ерундой |
|
|
5 (Газета) |
данный, госбезопасность, шпионаже, что, шаройко |
что, шаройко, данный, госбезопасность, шпионаже, задержать, разведывательный, сам, под, минск, покинуть, же |
шпионаж, шпионаже |
|
|
6 (Газета) |
правда, страна, год, дональд, ли, ни |
всему, в, противовес, срок, сдержка, американский |
- |
|
|
7 (РИА) |
- |
по, сирийский, проходить, женеве, уже, состояться |
- |
|
|
8 (РИА) |
- |
ранний, абзалов, он, в, очень, понятно, до |
- |
|
|
9 (Лурк) |
- |
западло, но, по, так, и, только, треть, принять, общий, упоминание, похуй, арменоидами |
школота, блджад, круглоголовыми, арменоидами, фошысты, срать, западло, похуй, ЕРЖ, маргинальной |
|
|
10 (Лурк) |
буквальный, фразеологизм, праздник, унитаз, самый, праздничный, и, потому, выблёвываются, просираются, только, не, использовать, деньги, значении, |
основной, условный, при, включаться, телевизору, чуда, тп, водки, офисный, путин, жрачок, закончится, терять, одной, а, трещать, деньга, и, значении, потому, праздник, следующий, атрибут, на, поцреот, халявный, корпоративчике, планктон |
алконавт, планктон, халявной, жрачки, корпоративчике, поцреоты, ТП, бухлом, нажираться, невзначай, скормить, завалявшие, талым, зохавать, просрать, просираются, выблёвываются |