Изменения

Перейти к: навигация, поиск

Классификация текстов и анализ тональности

1501 байт добавлено, 00:11, 24 января 2020
м
Нет описания правки
'''Классификация текстов (документов)''' (''Document classification''(англ.)) {{---}} задача компьютерной лингвистики<ref>[https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%8F_%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0 Компьютерная лингвистика]</ref>, заключающаяся в отнесении документа к одной из нескольких категорий на основании содержания документа.
'''Анализ тональности текста''' (''Sentiment analysis''(англ.)) {{---}} задача компьютерной лингвистики, заключающаяся в определении эмоциональной окраски (тональности) текста и, в частности, в выявлении эмоциональной оценки авторов по отношению к объектам, описываемым в тексте.
== Задачи классификации текстов ==
Классификация текстов применяется, в том числе, для:
* разделения веб страниц и сайтов по тематическим каталогам.;* борьбы со спамом.;* определение языка текста.;
* показа более релевантной рекламы.
Основной задачей анализа тональности текста является определение его эмоциональной окраски. Это необходимо, в том числе, для:
* Анализа отзывов о товарах и услугах;
* Определение языка вражды<ref>[https://ru.wikipedia.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA_%D0%B2%D1%80%D0%B0%D0%B6%D0%B4%D1%8B Язык Вражды]</ref>;.
В общем случае, задача анализа тональности текста эквивалентна задаче классификации текста, где категориями текстов могут быть тональные оценки.
Примеры тональных оценок:
* позитивная;
* негативная;
* нейтральная;.
Под «нейтральной» подразумевается, что текст не содержит эмоциональной окраски.
В качестве примера или упражнения можно предсказывать тональность рецензий к фильмам. Например, предсказывать методом линейной регрессии оценку(тональность), что поставил автор, по набору слов документу представленном в формате oneвиде вектора, где на <math>i</math>-hotой позиции количество вхождений <math>i</math>-ого слова из словаря в документу.
Анализ тональности обычно определяют как одну из задач компьютерной лингвистики, т.е. подразумевается, что мы можем найти и классифицировать тональность, используя инструменты обработки естественного языка. Сделав большое обобщение, можно разделить существующие подходы на следующие категории:
* Подходыподходы, основанные на правилах;* Подходыподходы, основанные на словарях;* Машинное машинное обучение с учителем;* Машинное машинное обучение без учителя.
В первом варианте системы состоят из набора '''Первый типправил''' систем состоит из набора правил, применяя которые система делает заключение о тональности текста. Например, для предложения «Я люблю кофе», можно применить следующее правило: ''если сказуемое ("люблю") входит в положительный набор глаголов ("люблю", "обожаю", "одобряю" ...) и в предложении не имеется отрицаний, то классифицировать тональность как "положительная"''.
Многие коммерческие системы используют данный подход, несмотря на то что он требует больших затрат, так как для хорошей работы системы необходимо составить большое количество правил. Зачастую правила привязаны к определенному домену (например, «ресторанная тематика») и при смене домена («обзор фотоаппаратов») требуется заново составлять правила. Тем не менее, этот подход является наиболее точным при наличии хорошей базы правил.
'''Подходы, основанные на '''словарях''', используют так называемые тональные словари (affective lexicons) для анализа текста. В простом виде тональный словарь представляет из себя список слов со значением тональности для каждого слова. Вот пример из базы ANEW<ref>[https://www.mdpi.com/2076-3417/8/2/274/html Анализ ANEW dataset]</ref>, переведенный на русский, где число означет валентность(1-9):*счастливый-8.21;*хороший-7.47;*скучный-2.95;*сердитый-2.85;*грустный-1.61.
Чтобы проанализировать текст, можно воспользоваться следующим алгоритмом: сначала каким-нибудь способом каждому слову в тексте присвоить его значением тональности из словаря (если оно присутствует в словаре), а затем вычислить общую тональность всего текста. Вычислять общую тональность можно разными способами. Самый простой из них — среднее арифметическое всех значений. Более сложный — обучить нейронную сеть.
'''Машинное обучение без учителя''' представляет собой, наверное, наиболее интересный и в то же время наименее точный метод анализа тональности. Одним из примеров данного метода может быть автоматическая кластеризация документов. Например, можно считать документы похожими, если у них большое пересечение по набору слов, и далее этот набор будет классифицировать весь кластер. В частности если в пересечении встречаются слова "ужасный", "невыносимый" и "отвратный", то скорее всего этот документы в этом кластере имеют негативный окрас.
=== Машинное обучение с учителем ===
Процесс создания системы анализа тональности очень похож на процесс создания других систем с применением машинного обучения:
# необходимо Необходимо собрать коллекцию документов для обучения классификатора.# каждый Каждый документ из обучающей коллекции нужно представить в виде вектора признаков.# для Для каждого документа нужно указать «правильный ответ», т.е. тип тональности (например, положительная или отрицательная), по этим ответам и будет обучаться классификатор.# выбор Выбор алгоритма классификации и обучение классификатора.# использование Использование полученной модели.
Если стоит задача классификации на более чем два класса, то тут возможны следующие варианты для обучения классификатора:
* Плоская плоская классификация — обучаем лишь один классификатор для всех классов.;* Иерархическая иерархическая классификация — делим классы на группы и обучаем несколько классификаторов для определения групп. Например, если у нас 5 классов («сильно положительный», «средне положительный», «нейтральный», «средне отрицательный», «сильно отрицательный»), то можно сначала обучить бинарный классификатор, который отделяет нейтральные тексты от субъективных; затем обучить классификатор, который отделяет положительные мнения от отрицательных; и в итоге классификатор, который отделяет сильно выраженные мнения от средних.;* Регрессия регрессия — обучаем классификатор для получения численного значения тональности, например от 1 до 10, где большее значение означает более положительную тональность.
Обычно иерархическая классификация дает лучшие результаты чем плоская, так как для каждого классификатора можно найти набор признаков, который позволяет улучшить результаты. Однако, он требует больших времени и усилий для обучения и тестирования. Регрессия может показать лучшие результаты, если классов действительно много (от 5 и более).
=== Этапы подготовки ===
==== Предобработка текста [[Обработка естественного языка]] ====
Предобработка текста переводит текст на естественном языке в формат удобный для дальнейшей работы. Применяются следующие операции:
* Перевод перевод всех букв в тексте в нижний или верхний регистры;* Удаление удаление чисел или замена на текстовый эквивалент;* Удаление удаление пунктуации;* Удаление удаление редких и слишком частых слов;* [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%B5%D1%81%D1%82%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0#.D0.A1.D1.82.D0.B5.D0.BC.D0.BC.D0.B8.D0.BD.D0.B3 Стеммингстемминг] или [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%B5%D1%81%D1%82%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D1%8F%D0%B7%D1%8B%D0%BA%D0%B0#.D0.9B.D0.B5.D0.BC.D0.BC.D0.B0.D1.82.D0.B8.D0.B7.D0.B0.D1.86.D0.B8.D1.8F Лемматизация];==== Извлечение признаков из текстов [[Векторное представление слов]] ====Большинство математических моделей работают в векторных пространствах больших размерностей, поэтому необходимо отобразить текст в векторном пространстве. Основным походом является мешок слов (bag-of-words): для документа формируется вектор размерности словаря, для каждого слова выделяется своя размерность, для документа записывается признак насколько часто слово встречается в нем, получаем вектор. Наиболее распространенным методом для вычисления признака является TF-IDF<ref>[https://en.wikipedia.org/wiki/Tf%E2%80%93idf TF-idf]</ref> и его вариации (TF — частота слова, term frequency, IDF — обратная частота документа, inverse document frequency). Плюсами мешка слов является простая реализация, однако данный метод теряет часть информации, например, порядок слов. Для уменьшения потери информации можно использовать мешок N-грамм (добавлять не только слова, но и словосочетания), или использовать более сложные в плане вычислений методы векторных представлений слов(Word2vecили его улучшение, fastText) это, например, позволяет снизить ошибку на словах с одинаковыми написаниями, но разными значениями и наоборот.
=== Алгоритмы классификации ===
==== Наивная байесовская модель [[Байесовская классификация]] ====
Пусть <math>P(c_i|d)</math> {{---}} вероятность того, что документ, представленный вектором <math>d = (t_1, ..., t_n)</math>, соответствует категории <math>c_i</math> для <math>i = 1, ..., |C|</math>. Задача классификатора заключается в том, чтобы подобрать такие значения <math>c_i</math> и <math>d</math>, при которых значение вероятности <math>P(c_i|d)</math> будет максимальным:
===== Многомерная модель =====
В многомерной(multivariate) модели документ – это вектор бинарных атрибутов, показывающих, встретилось ли в документе то или иное слово. Когда мы подсчитываем правдоподобие е документа, мы перемножаем вероятности того, что встретилось каждое слово из документа и вероятности того, что не встретилось каждое (словарное) слово, которое не встретилось. Получается модель многомерных испытаний Бернулли. Наивное предположение в том, что события «встретилось ли слово» предполагаются независимыми.
Математически: пусть <math>V = \{w_t\}_{t=1}^{|V|}</math> – словарь. Тогда документ <math>d_i</math> – это вектор длины <math>|V|</math>, состоящий из битов <math>B_{it}</math>. <math>B_{it} = 1</math> тогда и только тогда, когда слово <math>w_{t}</math> встречается в документе <math>d_{i}</math>.
Для обучения такого классификатора нужно обучить <math>P(w_t|c_j)</math>.
Пусть дан набор документов <math>D = \{d_{i}\}</math>, которые уже распределены по классам <math>c_{j}</math> (возможно, даже вероятностно распределены, то есть про каждый документ мы знаем, с какой вероятностью он принадлежит к каждому классу, но здесь и далее будем рассматривать детерминированную модель), дан словарь <math>V = \{w_t\}</math>, и мы знаем биты <math>B_{it}</math> (знаем документы).
Тогда можно подсчитать оптимальные оценки вероятностей того, что то или иное слово встречается в том или ином классе (при помощи лапласовой оценки):
<math>P(w_i|c_j) = \frac{1 + \sum_{i=1}^{|D|} B_{it} \times P(c_j|d_i)}{2 + \sum_{i=1}^{|D|} P(c_j|d_i)}</math>
Априорные вероятности классов можно подсчитать как <math>P(c_j) = \frac{1}{|D|}\sum_{i=1}^{|D|}P(c_j|d_i)</math>. Классификация происходит как обычно - максимизацией правдоподобия: <math>c = argmax_{j}P(c_j)P(d_i|c_j) = argmax_{j}(\log{\sum_{i=1}^{|D|}P(c_j|d_i)} + \sum_{t=1}^{|V|}\log{(B_{it} \times P(w_t|c_j) + (1 - B_{it}) \times (1 - P(w_t|c_j)))})</math>.
===== Мультиномиальная модель =====
В мультиномиальной(multinomial) модели документ – это последовательность событий. Каждое событие – это случайный выбор одного слова из того самого «bag of words»мешка слов. Когда мы подсчитываем правдоподобие документа, мы перемножаем вероятности того, что мы достали из мешка те самые слова, которые встретились в документе. Наивное предположение в том, что мы достаём из мешка разные слова независимо друг от друга. Получается мультиномиальная генеративная модель, которая учитывает количество повторений каждого слова, но не учитывает, каких слов нет в документе.
Математически: пусть <math>V = \{w_t\}_{t=1}^{|V|}</math> – словарь. Тогда документ <math>d_i</math> – это вектор длины <math>|V|</math>, состоящий из слов, каждое из которых «вынуто» из словаря с вероятностью <math>P(w_t|c_j)</math>.
Правдоподобие принадлежности <math>d_{i}</math> классу <math>c_{j}</math>:
<math>P(d_i|c_j) = P(|d_i|) \times |d_i|! \times \prod_{t=1}^{|V|}\frac{P(w_t|c_j)^{N_{it}}}{N_{it}!}</math>, где 𝑁𝑖𝑡 <math>N_{it}</math> – количество вхождений <math>w_t</math> в <math>d_i)</math>.
Для обучения такого классификатора тоже нужно обучить вероятности <math>P(w_t|c_j)</math>.
Пусть дан набор документов <math>D = \{d_{i}\}</math>, которые уже распределены по классам <math>c_{j}</math> (возможно, даже вероятностно распределены), дан словарь <math>V = \{w_t\}</math>, и мы знаем вхождения <math>N_{it}</math>.
Тогда можно подсчитать апостериорные оценки вероятностей того, что то или иное слово встречается в том или ином классе (не забываем сглаживание – правило Лапласа):
==== [[Метод опорных векторов (SVM)]] ====
Будем представлять каждый документ, как вектор, задаваемый своим содержимым в общем векторном пространстве. После этого будем строить [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%BE%D0%BF%D0%BE%D1%80%D0%BD%D1%8B%D1%85_%D0%B2%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BE%D0%B2_(SVM)#.D0.A0.D0.B0.D0.B7.D0.B4.D0.B5.D0.BB.D1.8F.D1.8E.D1.89.D0.B0.D1.8F_.D0.B3.D0.B8.D0.BF.D0.B5.D1.80.D0.BF.D0.BB.D0.BE.D1.81.D0.BA.D0.BE.D1.81.D1.82.D1.8C разделяющую гиперплоскость] для каждого известного класса.
Преимущества метода:
* сводимость к задаче выпуклой оптимизации, имеющей единственное решение.
Недостатки метода: сложная интерпретируемость параметров алгоритма и неустойчивость по отношению к выбросам в исходных данных, например в документе, рассказывающем о том как какой-нибудь футболист любит разводить собак и как он это делает, из-за частого употребления имени футболиста документ будет отнесен к классу "про футбол", или наоборот все документы с этим футболистом станут принадлежать к классу "разведение собак".
==== pLSA (Hoffmann, 1999) ====pLSA (Probabilistic latent semantic analysis (англ.)) или вероятностный латентно-семантический анализ был разработан в 1999г.  Каждое слово <math>d</math> порождается некой темой <math>t \in T</math>. Lокумент Документ порождается некоторым распределением на темах <math>p(t|d)</math>. Cлово Слово порождается именно темой, а не документом - : <math>p(w|d, t) = p(w|d)</math>. Итого получается следующая функция правдоподобия: <math>p(w|d) = \sum_{t \in T}p(w|t)p(t|d)</math>.
Можно оценить <math>p(w|d) = \frac{n_{wd}}{n_{d}}</math>, а требуется найти <math>\phi_{wt} = p(w|t), \theta_{td} = p(t|d)</math>. Правдоподобие выглядит следующим образом <math>p(D) = \prod_{d \in D}\prod_{w \in d}p(d, w)^{n_dw} = \prod_{d \in D}\prod_{w \in d}(\sum_{t \in T}p(w|t)p(t|d))^{n_dw}</math>.
Максимизировать такое правдоподобие следует ЕМиспользуя [[EM-алгоритмомалгоритм]]. На Е-шаге ищеммищем, сколько слов <math>w</math> в документе <math>d</math> из темы <math>t</math>:
<math>n_{dwt} = n_{dw}p(t|d, w)=n_{dw}\frac{\phi_{wt}\theta_{td}}{\sum_{s \in T}\phi_{ws}\theta_{sd}}</math>
<math>n_{td} = \sum_{w \in d}n_{dwt} + \theta\frac{\partial R}{\partial \theta_{td}}</math>.
Вместо pLSA почти всегда используют его улучшение - LDA<ref>[https://en.wikipedia.org/wiki/Latent_Dirichlet_allocation LDA]</ref>(Latent Dirichlet allocation(англ.)), оно более ресурсоемкое, однако выдает лучшие результаты чем pLSA. Фактически это улучшение является байесовским вариантом pLSA, использующее вариационные приближения или сэмплирование(это основные подходы к выводу в сложных вероятностных моделях).
=== [[Оценка качества в задачах классификации ]] ===Для оценки качества классификации, как и для оценки качества работы многих других алгоритмов машинного обучения вычисляется [https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA#%D0%A2%D0%BE%D1%87%D0%BD%D0%BE%D1%81%D1%82%D1%8C_(precision) точность] , полнота, F-мера и [https://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA#%D0%9F%D0%BE%D0%BB%D0%BD%D0%BE%D1%82%D0%B0_(recall) полнота]accuracy.
== Применение семантических тезаурусов для анализа тональности текстов ==
* [http://nmis.isti.cnr.it/sebastiani/Publications/LREC10.pdf SentiWordNet];
* [http://sentic.net/ SenticNet]
 
== См. также ==
 
*[[Векторное представление слов]]
*[[Кластеризация]]
== Примечания ==
<references/>
 
[[Категория: Машинное обучение]]
[[Категория: Обработка естественного языка]]
4
правки

Навигация