[БЕЗ_ЗВУКА] В этом видео мы поговорим про анализ тональности текста, или сентимент-анализ. Сначала мы рассмотрим примеры, обсудим трудности, которые возникают у этой задачи, и возможные варианты применения сентимент-анализа. После этого мы сформулируем некоторую простую постановку задачи и придумаем простой способ решения. После чего обсудим некоторые практические хитрости и особенности этой задачи. После чего поговорим о возможных других постановках задачи и о том, где взять данные. Итак, примеры. Ну, прежде всего, задача достаточно сложная. Очень часто можно столкнуться с довольно субъективными суждениями, можно столкнуться со смесью субъективных суждений и фактов. Можно столкнуться с тем, что отзыв в целом позитивный, но в какой-то момент происходит какой-то очень резкий поворот, ну например: «Я вчера купил телефон, все было хорошо, отличная батарея, отличный звук, но он сегодня перестал работать». Понятно, что отзыв, скорее, негативный, но в то же время по словам это не чувствуется до последнего предложения, и нужно уметь работать с такими ситуациями. Сентимент-анализ можно применять для анализа различных отзывов на товары, ну с точки зрения пользователя. Можно применять для анализа отзывов с точки зрения компаний, которые эти товары создают. Можно применять в политических целях для анализа мнений избирателей. И можно применять для совсем экзотичных вещей, ну например, для торгов на бирже. На эту тему тоже были некоторые публикации. Но при этом возникает ряд трудностей. С одной стороны, тексты от пользователей отличаются от текстов, которые можно увидеть в литературной речи. С другой стороны, люди используют разный набор слов в зависимости от того, в какой местности они живут, в зависимости от возраста и от многих других факторов. Поэтому если в вашей выборке есть смесь отзывов от разных людей, определенно выборка может быть несколько смещена в зависимости от того, где она собиралась и кто эти люди. Кроме того, слова могут иметь разную эмоциональную окраску в зависимости от контекста и в зависимости от предмета, который они описывают. Ну и конечно же, не стоит забывать о том, что людям свойственен сарказм. Итак, как же простым образом поставить задачу? Ну давайте просто считать, что у нас задача бинарной классификации. Бывают позитивные отзывы, бывают негативные отзывы, и нам нужно это уметь определить по тексту. Ну а в качестве признаков воспользуемся обычным мешком слов, вот и все. Тут уже сразу понятно, как решать эту задачу. Возьмем признаки из мешка слов, ну, может быть, какие-то слова отберем — те, которые наиболее редко встречаются, или стоп-слова. И после этого воспользуемся некоторым классификатором. Ну, скорее всего, нам подойдет какой-нибудь линейный классификатор, ведь мы работаем с текстами, матрица признаков будет разреженной. Ну например, логрегрессия по умолчанию с L2-регуляризатором. Но если мы захотим сделать поменьше используемых слов, например, если у нас есть чувство, что есть много слов, которые не представляют ценности для решения задачи, но почему-то учитываются моделью, то можно взять L1-регуляризатор и сделать константу регуляризации чуть побольше, чтобы отобрать лишнее. Теперь хочется рассказать немножко о практических особенностях задачи. Ну прежде всего, как и в других задачах анализа текстов, вы можете возлагать большие надежды на лемматизацию и стеммирование. Действительно, в этом случае разные по факту токены, разные признаки вашей модели будут схлопываться, если они означают примерно одно и то же. Ну то есть вы не будете страдать от того, что у слов бывают разные окончания. С другой стороны, практика показывает, что помогает это не очень сильно, и очень часто качество может даже чуточку упасть. Это может быть связано с тем, что словоформы как-то все же коррелируют с тем, какой эмоциональный окрас у текста, но на этот счет можно долго рассуждать, а факт остается фактом — на практике это не всегда полезно. Другой важный момент — это то, что слова могут встречаться с отрицаниями. И если обрабатывать эту ситуацию в модели мешка слов, вы не сможете понять, к какому слову относилось отрицание. Поэтому применяется следующий трюк: если у вас встречается частичка «не» рядом с каком-то словом, будем считать, что в большинстве случаев «не» относится именно к этому слову, хотя, конечно, так может быть не всегда. И давайте частичку «не» объединим со словом. Это будет единый токен. Ну другой интересный момент заключается в том, что люди используют разговорный язык, используют сленг и еще и допускают много ошибок. С этой ситуацией можно частично бороться, оперируя не словами, а последовательностями из букв, то есть переходя к буквенным n-граммам для достаточно большого n, ну то есть порядка четырех, пяти, шести, семи. В таком случае вы будете выхватывать какие-то смысловые части слов, но за счет того, что вы идете по буквам, окошкам ширины n, у вас будут куски слова, которые не содержат какую-то ошибку. И, может быть, таким образом получится лучше работать с отзывами, написанными людьми. Кроме того, в этой задаче очень важна пунктуация. Ну в самом деле, если человек ставит много восклицательных знаков, наверное, здесь есть какой-то сильный эмоциональный окрас. Или если человек ставит много смайликов. Да, смайлики тоже важны. И, наконец, хочется поговорить о том, какие еще могут быть постановки задачи, кроме самой простой. Ну, во-первых, можно сформулировать задачу мультиклассовой классификации и сказать, что у нас есть не только позитивный класс, негативный класс, но еще и нейтральный класс. Действительно, значительная часть отзывов не имеют яркой эмоциональной окраски, куда же их относить? Кажется, что нейтральный класс — это отличное решение, но здесь есть некоторый подвох. Дело в том, что спутать негативный пример с позитивным определенно хуже, чем спутать негативный с нейтральным. Но если мы просто решаем задачу мультиклассовой классификации, мы можем этого не учитывать. Поэтому в идеале здесь нужно еще и назначать разные веса разным ошибкам классификации. Другая идея — оценивать не принадлежность к какому-то классу, а собственно оценку, которую пользователь поставил бы товару или какому-то другому объекту, на который пишется отзыв. В этом случае, конечно, разумнее решать задачу регрессии. Ну точно не стоит классифицировать отзыв на пять классов, где каждый класс — это какая-то оценка. Понятно, что «пятерка» отличается от «четверки» не очень сильно, а от «тройки» — уже сильнее, от «двойки» — совсем сильно. И если мы будем решать задачу регрессии, это будет учитываться. Это плюс такого подхода. Минус заключается в том, что большинство методов, которые решают задачу регрессии, используют некоторые стандартные функции ошибок, то есть, скорее всего, будет минимизироваться RMSE, или абсолютное отклонение, а это уже, может быть, не совсем то, что вам нужно. Ну, прежде всего, если вы вместо «единицы» спрогнозируете «двойку», это будет такой же ошибкой, как если вы вместо «тройки» спрогнозируете «четверку». Хотя на самом деле, случай уже более-менее пограничный, если о пятибалльной системе оценки. Кроме того, даже если вы каким-то образом решили эту проблему и у вас, допустим, только три оценки, каждая из которых как раз имеет смысл — позитивный, негативный, нейтральный, но в то же время вы решаете задачу регрессии, поэтому они каким-то разумным образом упорядочены, в этом случае вы все равно сталкиваетесь с тем, что RMSE может быть не очень интерпретируем в вашей задаче. Есть и еще один вариант: давайте решать задачу бинарной классификации, но будем оставлять некоторую «серую зону», то есть область, для которой мы не уверены, позитивный класс или негативный. Таким образом, у нас, естественно, возникает нейтральный класс. При этом у нас сохраняется некоторая упорядоченность между классами, ну и в принципе, мы можем варьировать ширину этой «серой зоны», обеспечивая как можно более высокое качество на оставшихся отзывах. То есть мы придерживаемся некоторой разумной стратегии. Давайте мы будем предсказывать точно там, где уверены. А там, где не уверены, предсказывать не будем. Понятно, что таким образом мы можем прийти и к тому, чтобы вообще отказываться что-то предсказывать. Это будет не самый хороший вариант. Но мы можем рассматривать в качестве оценок качества значения метрик для той области, которая не относится к «серой зоне» и размер «серой зоны». И таким образом пытаться улучшать наше решение, уменьшая «серую зону» и повышая качество на оставшемся. Конечно, сами по себе эти вещи немного противоречат друг другу. Вы можете сделать «серую зону» поменьше, а качество в этом случае просядет. Но если вы дорабатываете ваше решение, конечно, хочется, чтобы и с тем, и с тем было хорошо. Кроме того, сентимент-анализ можно решать на разном уровне. С одной стороны, вы можете пытаться дать ответ для документа, ну то есть для отзыва — позитивный он или негативный. Но в этом случае может быть не очень понятно, насколько ваш ответ применим. Ну в самом деле, если в отзыве три раза поругали что-то, два раза похвалили, но похвалили, может быть, более активно, чем поругали, непонятно, какой же отзыв в итоге. Поэтому можно идти глубже, можно оценивать тональность не всего отзыва, а отдельных его частей, например, предложений. Это удобно и с точки зрения визуализации. Если вы просто говорите пользователю, что в отзыве содержится 66 % негативного класса, это, как правило, ни о чем не говорит. А если вы раскрашиваете отзыв в соответствии с тем, какие предложения, скорее, негативные, какие, скорее, — позитивные, это уже выглядит более похожим на правду. Ну и отдельная тема — это аспектный сентимент-анализ. В самом деле, нам может хотеться понять, отозвался ли пользователь хорошо о каких-то отдельных аспектах объекта. Например, в примере с телефоном мы знаем, что пользователь мог похвалить аккумулятор, мог похвалить звук, мог поругать дисплей, и вот эти вот отдельные части отзыва можно выделять и пытаться понять, позитивные они или негативные. Конечно, аспектный сентимент-анализ — существенно более сложная задача, чем сентимент-анализ документа в целом или каких-то его частей вроде предложений, потому что в этом случае нужно еще и выделять сами аспекты. Ну и наконец, последний вопрос, который нам осталось обсудить, — это где взять данные? На чем-то же нам нужно обучаться. Ну, прежде всего, можно просто взять готовые датасеты. Но здесь есть некоторая проблема. Дело в том, что задача сентимент-анализа очень чувствительна к тому, насколько ваши тексты похожи на то, что было в обучении. Поэтому, если вы обучитесь на каком-то готовом датасете, скорее всего, на практике это будет слабоприменимо. Отсюда возникает идея, а давайте собирать датасеты под конкретную задачу. Если нужно вам прогнозировать тональность отзыва о фильме, то соберите отзывы о фильмах. Если нужно понимать отзывы о товарах — то о товарах. Благо, существует достаточно много сайтов с такими отзывами и с оценками. Оценки будут разметкой. Однако здесь стоит понимать, что, конечно, не все сайты будут очень рады тому, что вы их будете активно парсить, поэтому это может быть сопряжено с некоторыми сложностями. Вам, может быть, нужно будет аккуратно это делать, соответственно, это займет больше времени. Но, в принципе, задача решаемая, и таким образом выборки собирают. Итак, подведем итог. Мы с вами поговорили про задачу сентимент-анализа, про примеры, трудности, возможные применения, про возможные постановки задачи и про некоторые практические особенности. Ну и наконец, обсудили, где же взять данные для решения этой задачи.