Как улучшить анализ тональности текста на русском языке?

Требуется произвести анализ тональности текста на множестве пользовательских комментариев определенной тематики. На данный момент принято решение проводить классификацию по трем классам — негативной, нейтральной и позитивной тональности. Для исследования алгоритмов вручную размечено 1500 комментариев. Размеры классов в тестовой выборке отличаются не более, чем в два раза. По примеру зарубежных коллег был применен метод опорных векторов в пространстве бинарных признаков, обозначающих наличие слов в комментариях. Правильность классификации составляет менее 60%. Анализ тональности английских текстов показывал эффективность в 80%.


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


Буду признателен советам любого рода. Есть ли другие удобные и проверенные инструменты для анализа русского языка желательно с реализацией на Python? Правилен ли выбор SVM, как алгоритма классификации, может есть более эффективные классификаторы? Известны ли более эффективные пространства признаков?
  • Вопрос задан
  • 8770 просмотров
Пригласить эксперта
Ответы на вопрос 4
@lightcaster
Занимался этим по работе. Попробуйте:
— svm с линейным ядром
— (1,2,3)-граммы как фичи
— нормализуйте текст, но попробуйте оставить некоторые знаки препинания — !?
— работал с английским, там стеммер не улучшал качество. На русском нужно пробовать, но не удивлюсь, если не сработает.

Кроме этого можете поиграться с различными преобразованиями на векторах. Мне не помогло, хотя теоретически должно было бы. Может, что-то неверно сделал. Попробуйте LSA (pLSA если словарь большой).

Замечания:
— хороший корпус очень важен
— выбор фич важен
— орфография не имеет сильного эффекта
— исключение стоп-слов также не улучшало качества
— действительно, иронию, двусмысленность выловить таким методом очень тяжело; при попытки поймать длинные связи снижается качество

Если захотите экстрима — можно попробовать какой-нибудь классификатор со строковым ядром. Я пробовал, не пошло. Но теоретически может получится.
Ответ написан
Irokez
@Irokez
Про классификатор:
SVM часто используется для анализа тональности текста, так что выбор правильный. Точного ответа, какой алгоритм классификации будет работать лучше — нет, поэкспериментируйте с разными алгоритмами и выберите тот, который даст лучшие результаты. Навскидку, предложу Naive Bayes и MaxEnt.

Про признаки:
Как вам правильно предложили выше — попробуйте биграммы, а также попробуйте 2-3-4 буквенные граммы, это может помочь с проблемой орфографии. По поводу построения вектора, есть более эффективные функции простановки веса для признаков чем бинарная. Я использую обычно delta tf-idf. В качестве дополнительных признаков можете попробовать морфологические теги (part-of-speech tag), бывает, что помогают. Также иногда помогают комбинация слов с тегами (напр: я-местоимения, люблю-глагол, чай-сущ.)

Про данные:
1500 комментариев — это тестовая выборка или данные для обучения модели? Или же все вместе? Для обучения вам понадобится гораздо больше данных. В зависимости от тематики их можно собрать с определенных сайтов (если фильмы, то, например, кинопоиск).

Также можете составить тональный словарь, список слов с их значением тональности (affective lexicons). Либо вручную, либо перевести с других языков (напр. с английского) — вручную либо автоматически, либо одним из методов автоматического составления словаря тональности. В целом, задача классификации на три класса достаточно сложная. Попробуйте сперва сделать для двух классов, а затем уже либо добавить доп. классификатор либо расширить модель для трех классов. Тут много вариантов. Удачи!
Ответ написан
@kmike
Предупреждаю: опыта практического у меня тут нет.

Можно лекции посмотреть вот тут: class.coursera.org/nlp/lecture/preview (Sentiment Analyzis). Критичной штукой во всем этом деле, насколько понимаю, является определение отрицания (нравится vs не нравится), что с подходом «bag of words» сделать нельзя. Для английского языка работают достаточно простые подходы («ко всем словам, стоящим после отрицательного слова ('не', например), приписывать „-“, пока не встретится знак препинания — и уже к обработанным таким образом словам применить классификацию через bag of words»).

Наибольшее влияние на результат должен оказывать выбор фич для классификации (классификатор SVM vs что-то другое — +- несколько процентов максимум будет).

Вот еще бумага по теме, может быть полезной: www.dialog-21.ru/digests/dialog2011/materials/ru/pdf/50.pdf
Ответ написан
@ilya_volodin
Интересная головоломка. Я вот в Скайпе с женой переписывался. И она обиделась. Фразу которую я написал я бы произнес очень позитивно (и когда ее писал так и думал), а вот она прочитала ее очень негативно, я потом и сам перечитал, и действительно можно и так и так понять.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы