Пользователь
0,0
рейтинг
15 августа 2012 в 02:23

Разработка → Обучаем компьютер чувствам (sentiment analysis по-русски)



Sentiment analysis (по-русски, анализ тональности) — это область компьютерной лингвистики, которая занимается изучением мнений и эмоций в текстовых документах. Недавно на хабре появилась статья про использование машинного обучения для анализа тональности, однако, она была настолько плохо составлена, что я решил написать свою версию. Итак, в этой статье я постараюсь доступно объяснить, что такое анализ тональности, и как реализовать подобную систему для русского языка.


Анализ тональности


Целью анализа тональности является нахождение мнений в тексте и определение их свойств. В зависимости от поставленной задачи нас могут интересовать разные свойства, например:
  1. автор — кому принадлежит это мнение
  2. тема — о чем говорится во мнении
  3. тональность — позиция автора относительно упомянутой темы (обычно «положительная» или «отрицательная»)

Пример: "Главный итог завершившихся Игр ХХХ Олимпиады в Лондоне – то чувство гордости за нашу страну, которое испытывали болельщики благодаря выступлениям российских олимпийцев», — считает Александр Жуков"
автор: Александр Жуков
тема: "выступление российских олимпийцев"
тональность: "положительная"

В литературе встречаются разные способы формализировать модель мнений. Я лишь привел в пример одну из них. Также используется и разная терминология. В английском языке эту область исследования обычно называют opinion mining and sentiment analysis (дословно: «поиск мнений и анализ чувств»). В русских статьях обычно употребляется термин «анализ тональности». Несмотря на то, что тональность является лишь одной из характеристик мнения, именно задача классификации тональности является наиболее часто изучаемой в наши дни. Это можно объяснить несколькими причинами:
  1. Определение автора и темы является гораздо более трудными задачами чем классификация тональности, поэтому имеет смысл сначала решить более простую задачу, а затем уже переключиться на остальные.
  2. Во многих случаях нам достаточно лишь определить тональность, т.к. другие характеристики нам уже известны. Например, если мы собираем мнения из блогов, обычно авторами мнений являются авторы постов, т.е. определять автора нам не требуется. Также зачастую нам уже известна тема: например, если мы производим в Твиттере поиск по ключевому слову «Windows 8», то затем нам нужно лишь определить тональность найденных твитов. Конечно же, это работает не во всех случаях, а лишь в большинстве из них. Но эти допущения позволяют в значительной мере упростить и так нелегкую задачу.


Анализ тональности находит свое практическое применение в разных областях:
  1. социология — собираем данные из соц. сетей (например, о религиозных взглядах)
  2. политология — собираем данные из блогов о политических взглядах населения
  3. маркетинг — анализируем Твиттер, чтобы узнать какая модель ноутбуков пользуется наибольшим спросом
  4. медицина и психология — определяем депрессию у пользователей соц. сетей


Подходы к классификации тональности


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



  1. Подходы, основанные на правилах
  2. Подходы, основанные на словарях
  3. Машинное обучение с учителем
  4. Машинное обучение без учителя

Первый тип систем состоит из набора правил, применяя которые система делает заключение о тональности текста. Например, для предложения «Я люблю кофе», можно применить следующее правило:
если сказуемое ("люблю") входит в положительный набор глаголов ("люблю", "обожаю", "одобряю" ...) и в предложении не имеется отрицаний, то классифицировать тональность как "положительная"


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

Подходы, основанные на словарях, используют так называемые тональные словари (affective lexicons) для анализа текста. В простом виде тональный словарь представляет из себя список слов со значением тональности для каждого слова. Вот пример из базы ANEW, переведенный на русский:
слово валентность (1-9)
счастливый 8.21
хороший 7.47
скучный 2.95
сердитый 2.85
грустный 1.61


Чтобы проанализировать текст, можно воспользоваться следующим алгоритмом: сначала каждому слову в тексте присвоить его значением тональности из словаря (если оно присутствует в словаре), а затем вычислить общую тональность всего текста. Вычислять общую тональность можно разными способами. Самый простой из них — среднее арифметическое всех значений. Более сложный — обучить классификатор (напр. нейронная сеть).

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

Машинное обучение без учителя представляет собой, наверное, наиболее интересный и в то же время наименее точный метод анализа тональности. Одним из примеров данного метода может быть автоматическая кластеризация документов.

Машинное обучение с учителем

Процесс создания системы анализа тональности очень похож на процесс создания других систем с применением машинного обучения:
  1. необходимо собрать коллекцию документов для обучения классификатора
  2. каждый документ из обучающей коллекции нужно представить в виде вектора признаков
  3. для каждого документа нужно указать «правильный ответ», т.е. тип тональности (например, положительная или отрицательная), по этим ответам и будет обучаться классификатор
  4. выбор алгоритма классификации и обучение классификатора
  5. использование полученной модели


Количество классов

Количество классов, на которые делят тональность, обычно задается из спецификации системы. Например, заказчику требуется, чтобы система различала три вида тональности: «положительная», «нейтральная», «отрицательная». В исследованиях обычно рассматривается задача бинарной классификации тональности, т.е. классов всего два: «положительный» и «отрицательный». Из своего опыта могу сказать, что классификация тональности на более чем два класса — это очень сложная задача. Даже с тремя классами очень сложно достичь хорошей точности независимо от применяемого подхода.

Если стоит задача классификации на более чем два класса, то тут возможны следующие варианты для обучения классификатора:
  • Плоская классификация — обучаем лишь один классификатор для всех классов

  • Иерархическая классификация — делим классы на группы и обучаем несколько классификаторов для определения групп. Например, если у нас 5 классов («сильно положительный», «средне положительный», «нейтральный», «средне отрицательный», «сильно отрицательный»), то можно сначала обучить бинарный классификатор, который отделяет нейтральные тексты от субъективных; затем обучить классификатор, который отделяет положительные мнения от отрицательных; и в итоге классификатор, который отделяет сильно выраженные мнения от средних.


  • Регрессия — обучаем классификатор для получения численного значения тональности, например от 1 до 10, где большее значение означает более положительную тональность.


Обычно иерархическая классификация дает лучшие результаты чем плоская, т.к. для каждого классификатора можно найти набор признаков, который позволяет улучшить результаты. Однако, он требует больших времени и усилий для обучения и тестирования. Регрессия может показать лучшие результаты, если классов действительно много (от 5 и более).

Выбор признаков

Качество результатов напрямую зависят от того, как мы представим документ для классификатора, а именно, какой набор характеристик мы будем использовать для составления вектора признаков. Наиболее распространенный способ представления документа в задачах комп. лингвистики и поиска — это либо в виде набора слов (bag-of-words) либо в виде набора N-грамм. Так, например, предложение «Я люблю черный кофе» можно представить в виде набора униграмм (Я, люблю, черный, кофе) или биграмм (Я люблю, люблю черный, черный кофе).

Обычно униграммы и биграммы дают лучшие результаты чем N-граммы более высоких порядков (триграммы и выше), т.к. выборка обучения в большинстве случаев недостаточна большая для подсчета N-грамм высших порядков. Всегда имеет смысл протестировать результаты с применением униграмм, биграмм и их комбинации (Я, люблю, черный, кофе, Я люблю, люблю черный, черный кофе). В зависимости от типа данных униграммы могут показать лучшие результаты чем биграммы, а могут и наоборот. Также иногда комбинация униграммов и биграммов позволяет улучшить результаты.


Стемминг и лемматизация
В некоторых исследованиях при представлении текста все слова проходят через процедуру стемминга (удаление окончания) либо лемматизации (приведение к начальной форме). Цель этой процедуры — уменьшение размерности задачи, иными словами — если в тексте встречаются одинаковые слова, но с разными окончаниями, при помощи стемминга и лемматизации можно их привести к одному виду. Однако, на практике это обычно не дает никаких ощутимых результатов. Причина этому в том, что, избавляясь от окончаний слов, мы теряем морфологическую информацию, которая может быть полезна для анализа тональности. Например, слова «хочу» и «хотел» имеют разную тональность. Если в первом случае тональность скорее всего положительная, т.к. автор может выражать надежду и положительные эмоции, то у глагола в прошлом времени, тональность может быть отрицательной, если автор выражает сожаление.


Другой способ представления текста — символьные N-граммы. Текст из примера можно представить в виде следующих 4-символьных N-грамм: «я лю», " люб", «юблю», «блю », и т.д. Несмотря на то, что такой способ может показаться слишком примитивным, т.к. на первый взгляд набор символов не несет в себе никакой семантики, тем не менее этот метод иногда дает результаты даже лучше чем N-граммы слов. Если присмотреться, то можно увидеть, что N-граммы символов соответствуют в какой-то мере морфемам слов, а в частности корень слова («люб») несет в себе его смысл. Символьные N-граммы могут быть полезны в двух случаях:
  1. при наличии орфографических ошибок в тексте — набор символов у текста с ошибками и набор символов у текста без ошибок будет практически одинаков в отличие от слов.
  2. для языков с богатой морфологией (например, для русского) — в текстах могут встречаться одинаковые слова, но в разных вариациях (разные род или число), но при этом корень слов неизменяется, а следовательно и общий набор символов.

Символьные N-граммы применяются гораздо реже чем N-граммы слов, но иногда они могут улучшить результаты.

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

Взвешенный вектор

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

В информационном поиске наиболее распространенным методом оценки веса признаков является TF-IDF. Для анализа тональности этот метод не дает хороших результатов. Причиной этому является то, что для анализа тональности не настолько важны слова, которые часто повторяются в тексте (т.е. слова с высоким TF), в отличие от задачи поиска. Поэтому обычно используют бинарный вес, т.е., признакам (если используем униграммы, то словам) присваивается единичный вес, если те присутствуют в тексте. В противном случае вес равен нулю. Например, «я люблю черный кофе» будет представлен в виде следующего вектора (мы опускаем слова с весом = 0):

{"я": 1, "люблю": 1, "черный": 1, "кофе": 1}


Однако, существуют методы оценки важности слов, которые вычисляют веса слов, дающие гораздо лучшие результаты при классификации тональности, например, дельта TF-IDF.

Дельта TF-IDF
Идея метода дельта TF-IDF заключается в том, чтобы дать больший вес для слов, которые имеют не-нейтральную тональность, т.к. именно такие слова определяют тональность всего текста. Формула для расчета веса слова w следующая:

Vt,d=Ct,dlog(|N|Pt|P|Nt)

где:
  • Vt,d — вес слова t в документе d
  • Сt,d — кол-во раз слово t встречается в документе d
  • |P| — кол-во документов с положительной тональностью
  • |N| — кол-во документов с отрицательной тональностью
  • Pt — кол-во положительных документов, где встречается слово t
  • Nt — кол-во отрицательных документов, где встречается слово t


Что же в итоге получается? Допустим, мы работаем с коллекцией отзывов фильмов. Рассмотрим три слова: «отличный», «нудный», «сценарий». Самое главное в формуле дельта TF-IDF — это второй множитель log(...). Именно он будет разный у этих трех слов:
  1. Слово «отличный» скорее всего встречается в большинстве положительных (Pt) отзывов и почти не встречается в отрицательных (Nt), в итоге вес будет большим положительным числом, т.к. отношение Pt/Nt будет числом гораздо больше 1.
  2. Слово «нудный» наоборот встречается в основном в отрицательных отзывах, поэтому отношение Pt/Nt будет меньше единицы и в итоге логарифм будет отрицательным. В итоге вес слова будет отрицательным числом, но большим по модулю.
  3. Слово «сценарий» может встречаться с одинаковой вероятностью и в положительных, так и в отрицательных отзывах, поэтому отношение Pt/Nt будет очень близко к единице, и в итоге логарифм будет близок к нулю. Вес слова будет практически равен нулю.


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


Реализация классификатора


Я реализовал простой классификатор тональности отзывов о фильмах на питоне. Данные были собраны с Кинопоиска. Было отобрано 500 положительных и 500 отрицательных отзывов. В качестве алгоритма классификации я использовал наивный байесовский классификатор (NB) и метод опорных векторов (SVM). В качестве признаков я протестировал униграммы, биграммы и их комбинацию, а в качестве функции взвешивания: бинарная функция для байеса и SVM, и дельта TF-IDF для SVM. Для оценки работы классификатора я провел перекрестную проверку: для каждого набора параметров было запущено подряд 5 тестов, в каждом из которых использовалось 800 отзывов для обучения и 200 для тестирования. Ниже представлены результаты (точность в процентах) для всех 9-ти наборов параметров.
Признаки NB SVM SVM+delta
униграммы 85.5 82.5 86.2
биграммы 84.9 86.5 87.8
комбинация 86.5 88.4 90.8



Из результатов видно, что для данной коллекции лучшие результаты показывает метод опорных векторов с функцией взвешивания дельта TF-IDF. Если же использовать обычную бинарную функцию, то оба классификатора (NB и SVM) показывают примерно одинаковые результаты. Комбинация униграммов и биграммов дает лучше результаты во всех тестах.

Посмотрим, почему же дельта TF-IDF дает такой отрыв (2.4 — 4.3%) в результатах. Выберем N-граммы с максимальными по модулю значениями дельта TF-IDF:
потрясающий 5.20 ведут себя -5.02
зависит 5.08 зачем-то -4.80
принимает 4.95 не смогли -4.80
создают 4.80 ни о -4.71
работами 4.80 не впечатлил -4.71
тщательно 4.71 сексом -4.71
самого себя 4.71 хуже чем -4.71
ким 4.62 но этого -4.71
триллеров 4.62 был снят -4.62
для нее 4.51 не смотрите -4.62


На примере негативных N-граммов особо заметно, что их вес отражает негативную тональность.

Практическое применение


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


Пример работы анализатора:

alexpak@dard:~/projects/pyrus$ src/sentiment/test.py "марсупилами"
1.	pos	Скачат фильм Джунгли зовут! В поисках Марсупилами / Sur la piste du Marsupilami (2012) DVDRip http://t.co/to5EuTHL
2.	neg	Вот советую посмотреть эту комедию Джунгли зовут! В поисках Марсупилами (2012)!
3.	pos	мы ходили на фильм "джунгли зовут!в поисках марсупилами" мне понравилось
4.	pos	Джунгли зовут! В поисках Марсупилами. Приятного просмотра:)
5.	pos	Джунгли зовут! В поисках Марсупилами - Sur la piste du Marsupilami (2012) HDRip http://t.co/UB1hwnHh
6.	pos	Марсупилами, както так называется фильм. Норм такой, на один раз)
7.	pos	такой лапочка #марсупилами
8.	pos	Went to the movies) watched the movie "Джунгли зовут! В поисках Марсупилами." http://t.co/EBlIsWMs
9.	neg	идём с брателло на Марсупилами)
10.	neg	Как можно было снять такой отвратный фильм про Марсупилами?! Он такой няша
11.	pos	Джунгли зовут! В поисках Марсупилами / Sur la piste du Marsupilami (2012) http://t.co/OoH3chso
12.	pos	Джунгли зовут! В поисках Марсупилами http://t.co/rb1BWurX
13.	pos	Джунгли зовут! В поисках Марсупилами http://t.co/rHorvtvu
14.	pos	Джунгли зовут! В поисках Марсупилами http://t.co/xNBHadIN
15.	pos	Джунгли зовут! В поисках Марсупилами http://t.co/33t35O35


Как видно, результаты не особо удовлетворительные. Классификатор делает 2 типа ошибок:
  1. Классифицирует нейтральные твиты (описание фильма, новости, спам) как положительные/отрицательные
  2. Неправильно классифицирует тональность отзывов

Первый тип ошибок можно исправить, если добавить дополнительный классификатор, который будет фильтровать нейтральные твиты. Это непростая задача, но вполне осуществимая. Второй тип ошибок возникает в основном из-за того, что твиты сильно отличаются от коллекции обучения: присутствует сленг, орфографические ошибки, отличается манера высказывания. Тут надо либо искать другую коллекцию для обучения классификатора (взять те же твиты, например), либо улучшить набор признаков (например, добавить смайлы). Но в целом, этот пример показывает, что создать систему анализа мнений в Твиттере вполне возможно.

Заключение


Создание системы анализа мнений является сложной задачей, но вполне посильной, если имеются данные для обучения и заранее определен домен (тема). При использовании машинного обучения важно тестировать разные параметры, чтобы подобрать те, которые работают лучше на тестовых данных. В частности нужно тестировать разные алгоритмы классификации (NB, SVM), набор признаков (униграммы, биграммы, символьные N-граммы), функцию взвешивания признаков. Существует еще куча способов для улучшения классификации тональности, такие как использование тональных словарей, дополнительные лингвистические признаки (например, части речи), так и общие способы улучшение машинного обучения (бустинг, баггинг и др.). В этой статье я постарался описать лишь основные методы.

Как всегда буду рад критике, вопросам и пожеланиям.
Исходный код
Онлайн демо

FAQ:

В демо неправильно классифицируются отзывы!
— да, это всего лишь прототип написанный за день

А что если в тексте присутствует и положительный, и отрицательный отзыв?
— текущий алгоритм классифицирует только один из них

А если я специально напишу негативный отзыв положительными словами?
— он будет неправильно классифицирован (а что вы ожидали от компьютера?)
Александр Пак @Irokez
карма
151,8
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (38)

  • +3
    А есть ли какие-нибудь данные о реальном использовании такого подхода для оценки тональности? Я понимаю, что и человек далеко не всегда может правильно определить отношение автора высказывания к самому высказыванию, и потому сложно оценить точность работы алгоритма. Но всё же.

    P.S. FAQ особо порадовал :)
    • +1
      Смотря что вы имеете в виду под «реальным использованием». Я лишь принимал участие в исследовательских проектах. В частности, наша система на РОМИП в этом году занимала 1-е место по классификации тональности на 5 классов. Если вы имеете в виду коммерческое применение, то таких данных у меня к сожалению нет.
      • 0
        Интересно было и то и то, спасибо. Я правильно понял, что на РОМИП в основном производилась экспертная оценка людьми?
        • 0
          Да, тестовая коллекция была оценена двумя экспертами.
    • +2
      Sentiment analysis сейчас активно набирает популярность именно в коммерческой среде. За последний год я общался примерно с десятком людей, которые хотели внедрить себе такую систему, и ещё столько же видел готовых реализаций. Существуют открытые примеры и даже SaaS, такие как AlchemyAPI (правда, Alchemy занимается много большим, чем только анализом тональности, и поэтому подходы у него тоже более общие, чем просто машинное обучение).

      Если вас интересуют цифры, то у нас было так. Мы классифицировали твиты о выборах в США и во Франции, на английском и французском языках, соответсвенно. Для французского получилось достичь точности ~80%, для английского чуть меньше — ~76%. Здесь надо сказать, что в sentiment analysis, особенно для таких источников, как Твиттер, всё, что выше 70% — это уже почти идеал. Просто потому, что оставшиеся 30% записей слишком спорно написаны, чтобы делать о них однозначные суждения.
      • +2
        Ах да, забыл сказать. В обоих случаях предвыборные показатели отзывов в твиттере почти точно отражали реальные результаты выборов. Эх, жаль, что к Российским выборам не успели насобирать данных :)
  • +17
    Поделюсь и я своим опытом.

    Во-первых, классов при классификации оказывается гораздо больше, чем 2. С точки зрения тональности, любой документ имеет определённое значение по 2-м шкалам: объективности-субъективности и позитивности-негативности. Одно только это приводит к 4 классам: субъективно-позитивный, субъективно-негативный, субъективно-нейтральный и объективный (информационный). Последние 2 категории могут быть не совсем понятны, поэтому поясню: субъективно-нейтральный документ выражает эмоции, но общая их сумма равна нулю (например, «с одной стороны, мне его жаль, а с другой — чего он ожидал?»); объективные (информативные) документы просто несут некоторую информацию («сегодня президент России встретился с японскими школьницами»). Кроме того, при работе с реальными источниками а-ля Твиттера добавляются ещё как минимум 2 класса: нерелевантные (случайно попали в результаты поиска, не относятся к исследуемой теме) и спам. Например, во время президентских выборов в России больше 95% твитов по запросам «Путин», «Медведев», «Навальный» и т.д. были именно спамом. Если количество таких «левых» записей не удаётся сократить вручную (мы, например, убирали все записи, начинающиеся с хеш-тега — спам практически исчез), то придётся строить дополнительный «входной» классификатор.

    Во-вторых, для анализа тональности очень важную роль играет использование в качестве атрибутов тегов частей речи (part of speech, POS). В частности, теггер частей речи определяет время глаголов, что сильно влияет на классификацию. Сравните: «Франсуа Холланд планирует посетить Россию в октябре» (настоящее время, информативный текст) и «Франсуа Холланд планировал-планировал, да не выпланировал. Так всё и загнулось» (прошедшее время, субъективно-негативный текст). В последней инкорнации нашей системы мы использовали 2 последовательный классификатора — сначала проверяли на объективность с помощью классификатора по частям речи, затем подсчитывали собственно тональность с помощью униграм.

    В-третьих, опять же, если речь идёт о соц. сетях, то имеет смысл использовать другие, нетекстовые признаки. Например, мы в твитах заменяли все ссылки просто на атрибут [LINK], таким образом он начинал учитываться как отдельный признак (очень помогает в поиске информативных твитов). Очистка user generated content тоже играет существенную роль. Для того же твиттера необходимо убирать имена пользователей (в большинстве случаев они не несут информации, но загрязняют список атрибутов). Исправление опечаток и стандартных «словозаменителей» (fuck -> f*ck, fck, etc.) также играет немаловажную роль.

    В-четвёртых, использовние N-грамм зависит от языка. Для английского лучший результат показали биграммы, для французского и русского — триграммы. Это связано с разными моделями построения предложений: в английском много сочетаний вида глагол-предлог (e.g.: give up), во французском часто используются более длинные связки (Est-ce que… ?).

    В-пятых, независимо от используемой модели N-грамм отрицательные конструкции необходимо слеплевать с соседними словами. Причём какие именно конструкции и как именно слеплевать — зависит от языка. Для русского обычного хватает склеивать «не» со впереди идущим глаголом («не люблю») и «нет» с впереди и позади идущими существительными («идиотизма нет», «нет идиотизма»). Для английского приходится учитывать модальные глаголы («not going», «don't go», «won't go», etc.) и некоторые обстоятельства, выполняюзие роль отрицания («never go»). Для французского, где отрицание строится частицей «ne» перед глаголом и частицей «pas» (или некоторыми наречиями типа «jamais») приходится придумывать ещё более сложные схемы.

    В-шестых, выбор классификатора сильно зависит от источника информации. Так, мы заметили, что для блогов лучше себя ведёт SVM (с практически любым из нелинейных ядер), а для Твиттера — Naive Bayes. Лично я это связываю с близостью используемых моделей к реальным данным. Например, можно сказать, что для Твиттера выполняется основное допущение наивного Байеса — слова в предложениях практически не связаны лексически, а смысл мы понимаем из общего набора слов (пример из сегодняшнего Твиттера: «Hey Redditors: Who's in for an #AMA with an #MSL engineer or 2...or 3...or more? Thur Aug 16 8am PT (1500 UT) @Reddit» — практически нечитаемо с точки зрения граммотной речи).

    В принципе, есть ещё много нюансов, но полный обзор занял бы несколько полноценных статей :)
    • +6
      Пишите :)
    • 0
      Скажите, пожалуйста, а существуют ли работы, в которых подробно бы разбирался вопроc использования методик sentiment analysis к языкам различных семей. Если у Вас есть ссылки — буду очень признателен.
      • 0
        Я думаю, тут следует говорить не конкретно о sentiment analysis, а о методиках NLP для разных языковых групп вообще. По большому счёту, разница между английским, русским, французским и большинством других европейских языков с точки зрения анализа тональности не такая большая — методы одни и те же, просто для разных языков и разных тем внутри одного языка данные методы по-разному настраиваются. Сравните, например, европейские языки и арабский или китайский — для последних нужно перестраивать весь «стек» обрабатывающих элеменов, начиная с токенайзера и теггера частей речи.

        Например, Стэнфорд предоставляет обучаемый парсер частей речи, который даже на небольшом русском корпусе сразу выдал мне результаты с точностью больше 90%. В то же время, для китайского или даже немецкого (из-за «слепливания» имён прилагательных) такой парсер просто не сработал бы. Поэтому Стэнфорд, в частности, занимается развитием NLP для этих языков (китайский, арабский).
    • +1
      Спасибо за развернутый комментарий. В принципе, я согласен по всем пунктам :)

      1. Количество классов, действительно может быть больше. Это зависит либо от задачи либо от применяемой модели. То, что вы описали (две шкалы: субъективность и полярность) широко используется, например в базах SentiWordNet и ANEW. Но существует и куча других моделей, например, модели эмоций, там где вообще до 8 шкал.

      На мой взгляд, для анализа тональности двух классов вполне хватает (позитивный, негативный). Определение же содержит ли текст мнение — это уже другая задача, анализ субъективности (subjectivity analysis).

      2. Морфологическая информация, действительно, может быть хорошим признаком для классификации тональности. Не только время глаголов, но и лицо (личные сообщения пишут от первого лица, информационные — от третьего), сравнительная и превосходная степень прилагательных и наречий, наличие местоимений и междометий.

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

      4. На моем опыте, триграммы никогда не давали хороших результатов (и во французском, и в китайском). Возможно, мой корпус был недостаточно большим.

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

      6. Согласен, но тут сложно сказать, от чего именно зависит производительность того или иного классификатора. Я еще не видел исследований на эту тему. Мы участвовали в соревновании по классификации эмоций, где было 26 команд-участников. Все участники применяли различные алгоритмы классификации, в основном те, с которыми у них был больший опыт. Так вот, примерно одинаковые результаты удалось получить разными командами и с SVM, и с MaxEnt, и прочими классификаторами.
      • 0
        Я бы поспорил с пунктом 5 (со всем остальным я категорически согласен :)). Для того же твиттера других признаков действительно может не быть. Например, когда мы анализировали американские выборы, было очень много твитов типа «Vote for Obama!». Слово «Vote» в целом было хорошим признаком положительного отношения автора к объекту разговора. В то же время, было много твитов типа «Don't vote for Obama!», т.е. отличающихся только отрицанием. При этом само по себе отрицание тоже не могло быть использовано в качестве признака негативного отзыва: «Don't be stupid, vote for Obama!» — если не учитывать порядок слов, то получается линейная неразделимость. Вначале я пробовал использовать нелинейные классификаторы (e.g. SVM с радиальным ядром), но эффект был минимальным. Затем были биграммы, но они порождали очень много атрибутов, встречающихся во всём корпусе всего 1 раз, а многие отрицания так и не захватывали: «I don't know, why somebody should ever vote for Obama». В общем, для коротких текстов типа твитов акценты несколько смещаются.
        • 0
          Это очень легко проверить экспериментально :) если есть желание можно устроить, если у вас есть размеченные твиты. Хотя я согласен, что, возможно, это более критично для коротких текстов вроде твитов, но в отзывах фильмов, думаю результаты не будут отличаться.
    • 0
      А почему не использовать все возможные N-граммы произвольной длины с частотой выше определенной?
      Извлечение всех N-грамм из корпуса сводится к задаче сортировки, затратной конечно, но в принципе решаемой и однократной.
      Получаем большое (очень большое) количество бинарных (или ординальных) атрибутов.
      Далее фильтруем по FCBF с редукцией подстрок.
      Если задавать небольшое количество атрибутов на выходе FCBF, то можно и SVM, если их очень много, то там random forest отлично работает.
      Который в отличие от SVM использует не все атрибуты, а только те что нужны.
      Соответственно и классификатор на RF получается очень быстрый и эффективный.

      Я так делал практически, не в области NLP, но для корпуса в несколько терабайт.
      Результаты были весьма неплохи.
      • +1
        В теории всё так, на практике же у вас есть от силы 10-15 тысяч протеггированных документов, из которых получается ~10 000 униграмм, половина из которых встречается всего по одному разу, но могут оказать решающее значение при классификации. В принципе, если использовать полуавтоматическое тегирование (например, по сидам ":-)" и ":-(") и запастись железом/временем на вычисления, то можно собрать 200-300 ты сяч документов и провести нормальное полноценное исследование по той схеме, которую вы описали. Однако в продакшене, как правило, есть определённая тема и определённое время, за которое нужно обучить классификатор. И тут даже если брать такие супер-активные источники информации как Твиттер, то есть риск даже за несколько месяцев не собрать базу нужного размера и с заданными критериями (тема + эмотикон). Т.е. основная проблема смещается от поиска лучшего метода к поиску реализуемого на практике метода.

        Наверное, описанная проблема решается для сайтов с отзывами а-ля Амазона, где есть текст и сразу оценка пользователя. Тогда можно собрать базу и попробовать применить ваш метод. Но я с корпусами с уже проставленными оценками не работал, так что про эффективность ничего сказать не могу.
        • +1
          Да, действительно, у меня уже было 29М теггированных объектов, так что было где разгуляться, и проблема переходила в класс supervised.
          И создавать сотни тысяч аттрибутов на 10-15К документов выглядит бессмысленно, по крайней мере на первый взгляд.
          Хотя тут есть варианты, я микротестирование делал на песочнице из 100 файлов исходников, классифицируя их на C и Р-файлы. Работало неплохо, там атрибутов 20 оставалось после фильтрации.
          :-)

          Плюс мне дали неплохое время на R&D перед продакшн, что редко бывает.

          В любом случае есть еще такой метод, по моему опыту N-граммы произвольной длины несут огромное количество информации.
          Может кому-то пригодится.
          • 0
            А Вы не могли бы поделиться обучающими выборками? Очень хочется поэкспериментировать.
            • 0
              Это не текстовые данные, как я писал — это не NLP задача.
              Ну и данные мне не принадлежат — их собирали много лет, это бинарники разных вирусов и не только вирусов.
              Интересно что эти самые тупейшие n-граммы ловили ряд полиморфов — что теоретически не должно было иметь места.

              Эмоционалкой не занимался, а по NLP вообще могу посоветовать.

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

              На Kaggle можно много найти.
              Еще вот такая свалка archive.ics.uci.edu/ml/datasets.html

              Вот для NLP есть некоторые
              www.clips.ua.ac.be/conll2003/ner/ — прямо сейчас открыто у меня.
              Вообще гуглим CoNLL dataset

              Ну и www.americannationalcorpus.org/OANC/index.html
              Но тут разметка врет как дышит — я отказался от него, там даже разбивка по предложениям кривая.

              Если надо просто большой сет — то files.grouplens.org/datasets/movielens/ml-10m-README.html
              Был еще старый 100M NetFlix Prize, но доступ вроде как закрыли, у меня где-то должна была остаться копия, если надо — пишите в личку, могу поискать.

              PS
              Имхо n-граммы должны хорошо работать когда требуется классификация всего текста, а не его части, причем текст должен быть достаточно объемный.
              Если тексты короткие как твиты — то смысла применять нет.
              • 0
                Для начала я хочу анализировать заголовки в СМИ и твиттере на эмоцию
                пока что пробую взять из твиттера записи со смайликами
      • 0
        Потому что будет overfitting — признаки становятся слишком специфичны для обучаемой коллекции данных.
        • 0
          Оверфит практически не зависит от признаков, он зависит от классификатора использующего эти признаки.
          В крайнем случае он может зависеть от количества признаков, но количество ограничивается селективностью фильтра FCBF — он отбирает лучшие атрибуты с минимальной взаимной информацией.

          Я собственно сам так делал и никакой перетренировки не наблюдал, тестил на 4-folds — все было в порядке.
          SVM, decision tree и random forest не давали оверфита даже если количество атрибутов было в два раза больше чем количество сэмплов.
  • +2
    Ух, запустить код с гитхаба — хороший квест. Но что-то изменилось в шаблонах кинопоиска и сбор тренировочных отзывов заканчивается с пустыми результатами, и я уже просто сдался. Просьба, дополняйте хотя бы краткой документацией. Что и откуда установить если это не пакетные библиотеки и в каком порядке что запускать. Сэкономит много времени
    • 0
      Да, прошу прощения. Нужно будет добавить README. Я использовал requests, BeautifulSoup, sqlite3.
      • 0
        Не только. Еще cherrypy, BeautifulSoup не из пакетов, а транковый, и билиотеки разбросанные в недрах гитхаба: liblinear, red, ваш же yatk. Может и еще что-то, но у меня уже было.
  • +1
    Для svm вы использовали линейное ядро?

    Немножко личного опыта по классификации англоязычных твитеровских сообщений:
    — svm с линейным ядром, наивный байес, логист. регрессия давали значительно меньшую точность
    — очень важно выбрать правильные фичи, остановились на 1-2-3 граммах
    — TF-IDF не дала сильного прироста
    — предварительная нормализация важна, особенно для такой помойки как твиттер
    — важны знаки препинания
    — как сказал ffriend, в реальном приложении скорее всего будет набор классификаторов. Важно правильно составить композицию

    А как на счет unsupervised подхода? Мне кажется он идеально подойдет для выделения и взвешивания фич. Вы пробовали это?
    • +1
      Забыл добавить. Конечно же, важен корпус. У нас была целая система маркирования и отряд американских студентов. Был, кстати, забавный случай, когда несколько студентов жили в одной комнате и тупо копировали данные маркировки друг у друга (одни и те же данные должны были быть маркированны несколькими людьми). Мы это дело вычислили и настучали им по шапке :).
    • 0
      Да, я использовал LIBLINEAR, библиотеку для линейных SVM. У меня нет особого опыта в конфигурации SVM, поэтому я обычно использую его «из коробки», т.к. меня в основном интересует выбор признаков и обработка текста, нежели конфигурация параметров и ядер у классификаторов.

      Обучения без учителя я в основном применял лишь для уменьшения размерности и последующей визуализации данных только чтобы визуально оценить коллекцию.
  • –5
    Если бы я обучал компьютер, я бы дал сначала не чуства, а базовие инстинкты (есть, дишать, ...)
    • 0
      Вот будет он есть, дишать, просрет все дедлайны, и работать в итоге некому.
      Не надо.
  • +1
    Супер, спасибо огромное!

    А вы не подскажете, есть ли какие-то ресерчи по классификации иронии? ЕМНИП, это остается одной из главных проблем NLP.
    • +1
      Да, конечно. Ирония и сарказм являются одной из проблем при анализе мнений. Вот несколько статей на эту тему:
      • Carvalho, Paula; Sarmento, Luís; Silva, Mário J.; and de Oliveira,Eugénio. 2009. Clues for detecting irony in user-generated contents:oh...!!! it’s «so easy» ;-)
      • Reyes, Antonio and Rosso, Paolo. 2011. Mining subjective knowl-edge from customer reviews: a specific case of irony detection
      • Davidov, Dmitry; Tsur, Oren; and Rappoport, Ari. 2010. Semi-supervised recognition of sarcastic sentences in Twitter and Amazon
      • González-Ibáñez, Roberto; Muresan, Smaranda; and Wacholder,Nina. 2011. Identifying sarcasm in Twitter: a closer look
  • 0
    Надо бы к хабру такое прикрутить, чтобы показывал положительный комментарий или отрицательный. :)
    • 0
      Ну конечно, и сарказм чтоб детектировался тоже!
  • 0
    Работать в этом направлении моя мечта. Я много чего продумывал в своей голове но браться пока не решался, ввиду того, что прежде чем писать алгоритм нужно очень много чего изучить и расписать по схеме. К тому же, хороший проект — это коллективный проект (лично мое мнение). Надеюсь в будущем, я найду тех людей, с которыми возможно реализовать нечто шире, чем в данной статье. А статья понравилась. Благодарю.
  • +1
    Дельта TF-IDF не пробовал, но на личном опыте убедился, что для отбора фич в sentiment analysis еще неплохо подходит мера Mutual Information.
    • 0
      А в сочетании с FCBF фильтром — вообще вещь классная.
      Можно тупо брать случайные паттерны — все равно работает.
      Причем далеко не только в sentiment analysis, практически любая классификация относительно длинных текстов.
  • 0
    Практикуется ли набор правил вручную, путем предъявления «эксперту» текстов для ручной разметки их фрагментов (символьных или словесных N-грамм) по шкалам тональности? Сначала всех подряд, затем лишь неожнозначных…
    Кажись, может быть перспективно. А?
  • 0
    Здравствуйте. Не подскажете, где можно взять размеченную экспертами по тональности базу комментариев, для того, чтобы проверить качество работы подобных программ?

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