Изменения

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

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

16 917 байт добавлено, 19:12, 16 февраля 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>;.
В общем случае, задача анализа тональности текста эквивалентна задаче классификации текста, где категориями текстов могут быть тональные оценки.
Примеры тональных оценок:
* позитивняпозитивная;* негативнянегативная;* нейтральная;.
Под «нейтральной» подразумевается, что текст не содержит эмоциональной окраски.
 
В качестве примера или упражнения можно предсказывать тональность рецензий к фильмам. Например, предсказывать методом линейной регрессии оценку(тональность), что поставил автор, по документу представленном в виде вектора, где на <math>i</math>-ой позиции количество вхождений <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>[4https://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> будет максимальным:
<math>c_m = \underset{c \in C}{\operatorname{argmax}} \, P(c|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>d_{i}</math> классу <math>c_{j}</math>: <math>P(d_i|c_j) = \prod_{t=1}^{|V|}(B_{it} \times P(w_t|c_j) + (1 - B_{it}) \times (1 - P(w_t|c_j)))</math> Для вычисления значений обучения такого классификатора нужно обучить <math>P(c_iw_t|dc_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>.
<math>P(c_i|d) = \frac{P(d|c_i)P(c_i)}{P==== Мультиномиальная модель =====В мультиномиальной (dангл. ''multinomial'')}</math>модели документ – это последовательность событий. Каждое событие – это случайный выбор одного слова из того самого мешка слов. Когда мы подсчитываем правдоподобие документа, мы перемножаем вероятности того, что мы достали из мешка те самые слова, которые встретились в документе. Наивное предположение в том, что мы достаём из мешка разные слова независимо друг от друга. Получается мультиномиальная генеративная модель, которая учитывает количество повторений каждого слова, но не учитывает, каких слов нет в документе.
где Математически: пусть <math>P(c_i)V = \{w_t\}_{t=1}^{|V|}</math> – априорная вероятность того, что словарь. Тогда документ отнесен к категории <math>c_id_i</math>; – это вектор длины <math>P(d | c_i)V|</math> – вероятность найти документ, представленный вектором <math>d = (t_1состоящий из слов, ..., t_n)</math>, в категории <math>c_i</math>; каждое из которых «вынуто» из словаря с вероятностью <math>P(d)</math> – вероятность того, что произвольно взятый документ можно представить в виде вектора признаков <math>d = (t_1, ..., t_nw_t|c_j)</math>.
По сути Правдоподобие принадлежности <math>P(c_i)d_{i}</math> является отношением количества документов из обучающей выборки классу <math>Lc_{j}</math>, отнесенных в категорию c_i , к количеству всех документов из <math>L</math>.:
<math>P(dd_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>c_iN_{it}</math>, а значения – количество вхождений <math>t_1, ..., t_nw_t</math> заданы заранее, поэтому знаменатель {{---}} это константа, не влияющая на выбор наибольшего из значений в <math>P(c_i|dd_i)</math>.
Вычисление Для обучения такого классификатора тоже нужно обучить вероятности <math>P(d w_t| c_ic_j)</math> затруднительно из-за большого количества признаков <math>t_1, ..., t_n</math> , поэтому делают «наивное» предположение о том, что любые две координаты, рассматриваемые как случайные величины, статистически не зависят друг от друга. Тогда можно воспользоваться формулой
Пусть дан набор документов <math>P(d|c_i) D = \prod_{kd_{i}\}</math>, которые уже распределены по классам <math>c_{j}</math>, дан словарь <math>V =1\{w_t\}^</math>, и мы знаем вхождения <math>N_{nit} P(t_k|c)</math>.
Далее все вероятности подсчитываются по методу максимального правдоподобия.Тогда можно подсчитать апостериорные оценки вероятностей того, что то или иное слово встречается в том или ином классе (не забываем сглаживание – правило Лапласа):
Преимущества метода:* высокая скорость работы;* простая реализация алгоритма;* легкая интерпретируемость результатов работы алгоритма<math>P(w_t|c_j) = \frac{1 + \sum_{i=1}^{|D|} N_{it} \times P(c_j|d_i)}{|V| + \sum_{s=1}^{|V|}\sum_{i=1}^{|D|} N_{is}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|}N_{it}\log{P(w_t|c_j)})</math>.
==== Метод опорных векторов ====Для использования [[Метод опорных векторов (SVM)|метода опорных векторов]] ====Будем (англ. ''SVM, support vector machine'') требуется представлять каждый документ, как вектор, задаваемый своим содержимым в общем векторном пространстве. После этого будем строить [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 ====pLSA (англ. ''Probabilistic latent semantic analysis'') или вероятностный латентно-семантический анализ был разработан в 1999г.  Каждое слово <math>d</math> порождается некой темой <math>t \in T</math>. Документ порождается некоторым распределением на темах <math>p(t|d)</math>. Слово порождается именно темой, а не документом: <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_{wt} = \sum_d n_{dwt}</math>, <math>n_{td} = \sum_{w \in d} n_{dwt}</math>, <math>n_{t} = \sum_w n_{wt}</math>, <math>\theta_{td} = \frac{n_{td}}{n_d}</math>, <math>\phi_{wt} = \frac{n_{wt}}{n_t}</math>. Параметров очень много, что явно введет к оверфиттингу, только если корпус не будет на порядки больше числа тем. Однако это решается регуляризацией(Есть целая наука о разных регуляризаторах для pLSA (К.В. Воронцов)).
В общем виде так: добавим регуляризаторы <math>R_{i}</math> в логарифм правдоподобия:<math>\sum_{d \in D}\sum_{w \in d}n_{dw}\log{(\sum_{t \in T}\phi_{wt}\theta_{td})} + \sum_i \tau R_i(\Phi, \Theta)</math> Тогда ЕМ-алгоритме на М-шаге появятся частные производные <math>R</math>: <math>n_{wt} = \sum_{d \in D}n_{dwt} + \phi\frac{\partial R}{\partial \phi_{wt}}</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/>
 
[[Категория: Машинное обучение]]
[[Категория: Обработка естественного языка]]
3
правки

Навигация