0: Здравствуйте, меня зовут Ксения Андреевна Студеникина, я работаю на кафедре теоретической и прикладной лингвистики и занимаюсь автоматической обработкой текстов, и это 1 лекция курса, методы автоматической обработки текста от наивного байского классифика.
1: До больших языковых моделей данный курс проходит на факультете биоинженерии и биоинформатики, и он посвящён, как можно догадаться из названия, методам обработки текстов с помощью, в основном с помощью алгоритмов машинного обучения.
2: И нейронных сетей. Этот курс в принципе может быть полезен для представителей не только факультета биоинженерии, биоинформатики, но и в том числе для представителей других факультетов, в основном, наверное, естественно научных для тех слушателей, кто знаком.
3: Уже с алгоритмами классического машинного обучения и также знаком с различными архитектурами нейронных сетей и хочет поподробнее узнать именно про то, как их использовать для того, чтобы обрабатывать текстовые данные, как можно догадаться.
4: Из названия. Опять же, в этом курсе мы начнём с таких самых классических методов машинного обучения и во 2 половине курса перейдём к большим языковым моделям, которые в принципе уже, наверное, используются исследователями широкого круга для решения различ.
5: Задач в рамках своих каких-то исследований. И я предполагаю, что этот курс будет вам полезен, если вы хотите не просто использовать большие языковые модели, но и понимать, как они вообще появились, на основе чего они работают, как устроены.
6: Внутри, и это поможет вам использовать их более эффективно. Итак, давайте начнём. Сегодняшняя лекция является вводной, и она посвящена основам обработки текстов вообще. В рамках нашего курса. Часть лекций будут
7: Таким образом, что вы можете не просто смотреть их, а также выполнять какие-то задания параллельно, то есть в коде будут пропуски, которые вам нужно будет, если вы хотите заполнить самостоятельно, а затем посмотреть, как это.
8: Делает лектор на видео эта лекция тоже является такой. То есть вы можете работать параллельно с тем, чтобы смотреть видеозапись. И как вы видите, здесь, собственно, есть такая дополнение визга. То есть что здесь есть пропуски, если вы будете видеть
9: С таким названием это значит, что в ней нужно будет вам что-то дополнять. И также к собственно материалам курса будет приложена лекция без пропусков, но с аналогичным названием, но другим окончанием и
10: Вы, собственно, сможете посмотреть в этой лекции, как правильно заполнять пропуски. Ну и также я это, конечно же, покажу на видео. Давайте начнём, давайте начнём с конкретной какой-то задачи и представим, что вам необходимо автоматически классифицировать
11: Новости по различным тематикам, это могут быть самые разные темы. Ну вот мы возьмём 4, допустим, новости про политику, новости, про спорт, про экономику и про науку и глобально к решению такой задачи можно подойти 2 способами.
12: 1 способ основан на правилах и словарях. Это так называемый рул Бейс, подход или также его можно назвать инженерным подходом. В чем он состоит? Вы можете вручную написать какие-то правила, основанные
13: На словарях, то есть на большом наборе лексики, и указать, что если, допустим, слово, ну вот если мы там говорим про новости спортивные, если там слово команда или тренер встречается больше там заданного количества раз, то
14: Скорее всего, этот текст относится к категории спорта. Если же, допустим, мы говорим про науку, и там слово технологии встречается там тоже больше заданного количества раз, то текст относится к категории науки и
15: В принципе, этот подход, он может работать, если у вас там, допустим, хорошо разграничиваются действительно по тематикам тексты. Однако проблема в том, что чем больше примеров вы будете добавлять, тем больше у вас будет множиться этот набор правил больше.
16: Будет расширяться словарь и со временем будет сложнее контролировать, поскольку эти правила на самом деле могут и противоречить между собой. То есть необходимо выстраивать какую-то иерархию, какую-то последовательность, в которой они применяются, то есть в принципе с
17: Расширением данных, которые вы хотите анализировать, будет увеличиваться и сложность собственно, применения этого алгоритма. 2 подход, который мы в основном будем использовать на самом деле, в данном курсе, основан на машинном обучении. В чем состоит основная идея, то есть
18: Вы можете не писать вот эти самые правила самостоятельно, а обучить некоторую модель, которая будет самостоятельно извлекать эти шаблоны из данных. Ну, вместо вас как бы, и как можно обучить, собственно, эту модель. Пока что модель для нас
19: Чёрный ящик. Ну вот такой алгоритм. Мы пока не говорим о том, как он работает. Но общий подход заключается в том, что вы берете некоторое количество уже размеченных данных. Ну, они вам нужны на самом деле, в любом случае, чтобы правила писать на основе чего-то тоже это могут быть в принципе.
20: Данные с любых новостных ресурсов, где, скорее всего, уже есть какая-то классификация по тематикам, вы можете взять и эти данные, и у вас каждой новости будет приписан некоторый тематический класс и затем эти данные, то есть некоторый текст
21: Некоторые для них уже известные классы подать собственно в модель машинного обучения и после этого получить на выходе результат, то есть обученную модель, в которую вы потом можете подавать тексты без собственно их класса, без метки и предска.
22: Показывать наиболее вероятный класс с точки зрения этой обученной модели. Ну, на иллюстрации, собственно, представлено различие между этими 2 подходами, что в случае подхода на основе правил вы пишите эти правила самостоятельно, ну,
23: То есть в каком-то смысле это получается такое набор правил, если то, ну и в случае машинного обучения у вас есть данные и есть модель, которую вы обучаете на этих данных.
24: В принципе, как я уже сказала, модели могут быть строены разным образом, и в рамках этого курса мы в том числе будем говорить о том, какие они бывают и как выбрать более подходящую для вашей задачи.
25: Предположим, что вот мы с вами решили остановиться на технологиях машинного обучения и решаем задачу разработки некоторого классификатора новостей по тематикам. Как будет выглядеть план подобного исследования для начала?
26: Вам нужно, ну, найти или там создать, возможно датасет, с которым будете работать. После этого вам нужно провести некоторые разведочный анализ данных. Мы поговорим позже о том, что это, то есть вам надо
27: Как-то проанализировать эти данные. Дальше вам нужно очистить текст, то есть убрать из него все лишнее, то есть некоторый шум, оставить только наиболее важные слова. Опять же об этом мы, конечно же, поговорим в этой лекции. Ну и после этого вам нужно, собственно,
28: Превратить каждый текст в вектор, то есть сопоставить тексту некоторое численное представление, ну и затем уже можно применять тот или иной алгоритм машинного обучения, а если говорить о том, с помощью каких инструментов все это можно реализовать.
29: То здесь их можно разделить на несколько групп. То есть первые, собственно, 3 инструмента, которые здесь указаны. Кморф и дипайп, это такие лингвистические инструменты, которые предназначены для работы с текстами, для их подготовки.
30: К дальнейшей уже обработке библиотеке библиотека нампай предназначена для того, чтобы работать с матрицами, с векторами и, собственно, ну, нам нужно будет представить текст.
31: В виде вектора и библиотека нампай содержит функции для того, чтобы выполнять различные операции с этими векторами. Библиотека сайкит лерн, она содержит, с 1 стороны, инструменты для обработки непосредственно предобработки данных, то
32: Их векторизации мы, опять же, конечно же, разберём подробнее, что это и также содержит, собственно, сами алгоритмы машинного обучения, которые мы будем применять библиотека pandas, опять же скорее настроена на работу с данными, поскольку она позволяет.
33: Представить данные в виде таблицы и работать с ними удобно. В питоне. Библиотека пайторч довольно важная библиотека, на самом деле, которая позволяет уже строить алгоритм, ну, строить различные архитектуры нейронных сетей, ну, они
34: Поговорим уже чуть позднее. Ну, собственно, библиотеки плот, лип и сиборн это инструмент для построения графиков, для визуализации, что нам часто бывает полезно, во первых, при анализе данных, при того, что, ну, когда мы смотрим там на какие-то статистики в данных и
35: Во вторых, когда мы визуализируем результаты тоже, то есть визуализация нам полезна как в самом начале, так и в самом конце. Ну и давайте начнём со сбора данных. Может, в принципе, показаться, что если вы
36: Хотите решать там любую задачу, то данные нужно самостоятельно как-то собирать, но это совершенно не так. Существует большое количество ресурсов, где можно взять уже размеченные данные. Ну вот здесь приведены некоторые из них.
37: Часто также бывает, что в какой-то, в каком-то исследовании приведена ссылка там например на репозитории с данными, где можно их взять. Однако здесь может быть некоторая ловушка в том, что если там, допустим, это малоизвестный какой-то этосет,
38: То, возможно в нём есть какие-то проблемы, ограничения, и перед тем, как просто вот слепо приступать к его использованию, надо все-таки его предварительно проанализировать.
39: И как же это сделать, как мы уже сказали, с помощью разведочного анализа данных. В принципе, это такая процедура, которая позволяет понять основные свойства данных. Ну, предположим, если у нас несколько классов, мы можем визуализировать
40: Распределение по этим классам, то есть просто посмотреть сколько объектов в каждом классе. Также, например, если у нас разное количество текстов, то мы можем посмотреть, какой длины в среднем эти тексты, какая самая большая длина, какая самая маленькая. Также можно
41: Посмотреть, какие наиболее часто встречаются слова в текстах каждого класса, что тоже может быть полезно.
42: Ну и теперь мы приходим к Такому этапу, в принципе, ну, предыдущие этапы, на самом деле, и сбор данных, там, и различный анализ, они не специфичны для вот, собственно текстовых данных, а вот тот этап, который является критичным, ну и
43: Особенно вот именно для работы с текстовыми данными это предобработка или по-английски препроцессинг. Собственно, зачем она вообще нужна? Дело в том, что текстовые данные содержат различный шум, что мы подразумеваем под шумом. Это, например, знаки препина.
44: Также у нас одно и то же слово может быть записано и со строчной, с прописной буквы, и мы не хотим интерпретировать, допустим, его как разные элементы словаря, хотим, чтобы модель понимала, что это слово значит одно и то же также могут быть помимо каких-то
45: Частей речи, там существительное прилагательное, глагол, могут быть также служебные части речи, там это предлоги, союзы, частицы, которые, в принципе, если вот мы хотим классифицировать там по тематикам, не так нам важны. Ну потому что они не несут там информацию.
46: Про то, к какой сфере там жизненной относится эта новость, и для того, чтобы оставить только наиболее важные слова, которые затем будут модели помогать принять решение о принадлежности к тематическому классу, нам нужно избавиться от всего.
47: Лишнего и результатом у нас станет текст, в котором все слова написаны, все слова в нижнем регистре, то есть написаны со строчных букв. Также нет знаков препинания и нет служебных слов и также
48: Ещё все слова в начальной форме. Что, собственно, нам для этого надо сделать? Мы берём исходный документ и изначала, мы проводим его токенизацию. В принципе, токенизация это разделение на
49: Какие-то единицы. И на самом деле мы можем, например, взять длинный длинный текст, то, например, абзац и разделить его на предложения. Это будет токенизация по предложениям, но сейчас мы подразумеваем, что у нас уже в данных есть какие-то кусочки
50: Текстов, которые мы хотим рассматривать как бы как цельный элемент и внутри них просто выделять важные там слова. И вот тогда мы будем резировать по словам. То есть, ну, в принципе, будем выделять внутри каждой новости наиболее важные слова.
51: Следующий этап это стандартизация, очистка текста. То есть нам необходимо перевести к 1 регистру, также удалить, собственно, там какие-то специальные символы, знаки препинания, числа также часто удаляют следующий этап. Это удаление стоп слов.
52: Ну, в принципе, мы снова что-то удаляем, но как бы смысл в том, что если на 2 этапе мы можем просто, ну, там, с помощью каких-то регулярных выражений, допустим, удалить или просто оставить только то, что является словом, то теперь, ну, стоп слова, это более как бы уже такой.
53: Этап, потому что нам надо понять, какие именно стоп слова мы хотим удалять. Ну и часто для этого есть уже, в принципе, готовые словари, которые можно расширить какими-то своими единицами, которые кажутся вам необходимыми. Ну и последний этап, он такой самый лингвистический, то есть
54: Самые как бы специфичные для текстов это нормализация текста, то есть приведение всех слов к начальной форме. Здесь, собственно, есть такие страшные слова на 1 взгляд, как стемминг, акклиматизация, но мы поговорим о том, что они значат чуть позже. Ну и на вы.
55: Как мы сказали, у нас должен быть список из слов, которые вот, собственно, приведены к нужной нам форме. Как мы сказали, 1 этап это токенизация, и, собственно, мы будем токенизировать наши слова.
56: Вот, предположим, у нас было бы такое предложение, и в ходе токенизации мы бы разделили его просто на отдельные слова по пробелам. Но проблема в том, что в текстах же часто ещё на этом этапе есть знаки препинания, а знаки препинания, там, например, может быть пробел, с 1 стороны, с другой стороны,
57: Нет. И поэтому мы применяем готовые инструменты для токенизации, чтобы не писать правила под каждый вот этот отдельный случай. И, в частности, для того, чтобы эффективно использовать токенизацию, есть библиотека лтк, ну и на
58: На самом деле все вот инструменты, которые сейчас мы будем рассматривать, они относятся, ну, они это инструменты из библиотеки нлтк. И вот, в частности, нам сейчас понадобится метод ворд токенас, ну то есть, как бы буквально токенизация, по словам у нас
59: Для примера будет предложение the страйп кэтс верани крикли эндзе кол. The mice изли, собственно полосатые кошки бежали быстро, и они легко поймали мышек, и, как мы видим, у нас была строка.
60: И на выходе мы получили список из слов, ну то есть на самом деле список из строк, и каждая внутри. Теперь эта строка это отдельное слово. Ну и также мы выделили как отдельный элемент списка, знаки препинания. Ну вот у нас есть запятая и
61: Восклицательный знак. В данном случае теперь мы будем проводить следующий этап. Собственно, удалять все лишнее. То есть удалим знаки препинания, которые мы предварительно выделили как отдельный элемент списка. Если бы у нас были числа или какие-то специальные
62: Там типа процента, например, то мы бы тоже их убрали, ну и приводим к нижнему регистру, как показано, собственно, на изображении. Теоретически мы могли бы приводить и к верхнему регистру. То есть нам не важно на самом деле, к какому важно, просто, чтобы к 1, но
63: Это может быть потом текст, полностью написанный в верхнем регистре, будет немножечко странным. Ну и также затем у нас список стоп слов также будет в нижнем регистре. Ну поэтому, в принципе, принято приводить к нижнему регистру. Это мы.
64: Можем сделать в следующей ячейке. То есть мы проходимся по словам в списке предыдущем-таки на текст. И если слово является, ну, словом, буквально, то есть состоит из букв, то мы применяем
65: К нему метло, то есть приводим к нижнему регистру. Ну, вы можете посмотреть, собственно, что изменилось. Мы убрали знаки препинания и также привели к нижнему регистру. Собственно, 1.
66: Слово определённый артикль. Следующий этап касается как раз-таки стоп слов в библиотеке нлтк есть список встроенный список стоп слов. Ну вот для английского языка, например, как поскольку мы сейчас работаем с
67: Английским текстом мы нам его надо скачать и можем её в принципе вывести посмотреть что он содержит сразу видим, что здесь упорядочивание по алфавиту a bout эба афтер эгейн эгейнст эйн оо эм эн эн.
68: Ani, ну и так далее. То есть, если посмотреть, то можно заметить, что здесь есть, например, артикли, предлоги, также есть союзы, вспомогательные глаголы, что тоже интересно, ну, какие-то другие.
69: Там ещё союзы. Ну и в принципе, в основном это вот все, что он содержит.
70: И теперь мы записываем в отдельную переменную этот словарь и проходимся по списку.
71: Который записали выше, то есть слова без знаков препинания, приведённые к нижнему регистру. И если добавляем в новый список текст без стоп слов, слово из этого, ну, списка, если оно не является
72: Стоп слово. То есть если оно отсутствует вот в этом списке стоп слов, ну и можем посмотреть, что теперь мы получили список из собственно прилагательных существительных, глаголов и наречий, то есть
73: Убрали, да, в частности, здесь артикль, вспомогательный глагол, союз, местоимение также убрали. Ну и, собственно, снова ещё артикль.
74: И теперь мы переходим к этим пока что неизвестным словам стемминг и лимитизации их можно обобщить понятием нормализация, то есть приведение как бы слова к начальной форме, как мы уже сказали, на самом деле здесь ест.
75: Некоторая тонкость а в чем, собственно, отличие между 2 понятиями стеминг и лематизация стемминг устроен чуть более как бы просто, поскольку мы задаём как бы список наиболее частых окончаний и удаляя
76: Буквально эти окончания, то есть отсекаем их просто от слова и, ну, как бы, что осталось, то и мы подаём там дальше уже на следующий этап. И здесь могут быть некоторые сложность, потому что есть слова, у которых нерегулярное словообразование.
77: Регулярно, точнее, форма образования. Вот как у глагола стадис если мы уберём просто и с, то останется последняя буква будет i. А если в форме стадинг, уберём тоже просто окончание и
78: То последняя буква будет y, и эти слова уже будут 2 разными единицами словаря, что плохо, мы же хотим как бы на самом деле, для чего все это делать сократить размер словаря, оставить только в нём наиболее важные слова, которые будут нести больше всего смысла ну и.
79: В принципе, стемминг, он как бы более просто реализован, но при этом работать может похуже, а алимата Ия устроена более сложно, потому что нам нужно знать не просто список наиболее распространённых окончаний, но и, вообще говоря, иметь
80: Где у нас будет правило, по которому для каждого слова получаем его форму. Ну, в частности, для глагола стадии. Мы должны знать, что там форма 3 лица, единственного числа получается, с по, ну, при её образовании происходит
81: Чередование гласных. И если у нас будет эта грамматическая информация, то мы в принципе сможем корректно приводить к именно не просто отсекать что-то, а именно приводить к словарной форме, к инфинитиву в данном случае.
82: И, по идее, если мы все правильно реализуем, как бы в лимитизации, то тогда у нас будет обе формы, придётся к исходной форме стадии, но мы не будем с вами реализовывать стемминг лимитизации самостоятельно. Это в принципе,
83: Заняло отдельную лекцию. Мы воспользуемся снова готовыми реализациями из библиотеки нлтк. Ну вот, собственно, 1 из реализаций это портате для стемминга. И, собственно, мы создаём объект класса порто темер, который так
84: Стеме и затем применяем его для каждого. Ну, проходимся по списку слов в тексте без стоп слов и для каждого слова применяем у этого стеммера метод стем. Ну и можем посмотреть, что получилось. То есть
85: Вот например stripped вообще по сути ну здесь это скорее как бы прилагательное, но при этом у него было бурное окончание, что наверное как бы не совсем логично в данной ситуации, ну для cat все хорошо, для running в принципе тоже, но для квикли мы сделали замену.
86: Которая, ну, не совсем. Вообще то, как будто бы нужна и логична для код нерегулярной формы ничего не произошло. То есть вот это как бы тоже для стемминга получается нерешаемая задача скетч и код у нас будут 2 разным.
87: Ровно как и mice и mousse. То есть здесь мы тоже ничего не сделали. Ну и для изили, провели такую же замену, как для квикли, которая, в принципе, ну, вопрос её осмысленности. И давайте теперь посмотрим на то, как работает климатизатор. И вот
88: Здесь я предлагаю вам для начала самостоятельно попробовать заполнить пропуски, а потом можете посмотреть, как я это сделаю на видео, или обратиться к файлу, где уже пропуски заполнены. Ну, здесь нет ничего сложного. Вам нужно по аналогии с темером со ст.
89: Создать собственно объект класса liimatainen и применить его. Ну вот здесь у нас у теймера был метод стем, а у лимата метод лимота.
90: Давайте вместе посмотрим, как это можно сделать. Собственно, мы просто создаём объект класса не лимота и затем проходимся по списку слов в ну, по словам.
91: В тексте без стоп слов.
92: Нам уже коллаб подсказывает, собственно, и, как мы сказали, нам надо применить лемматизатор.
93: И его метод лимота.
94: Запустим. Ну вообще лемматизатор работает подольше конечно чем стеме, как вы могли заметить, и здесь мы, ну, для слова страйп оставим все как было для cats. Ну, тоже в принципе, как и там.
95: Единственное, что смотрите, раннинг мы почему-то оставили в форме не начальник квикли тоже ничего не меняется. Интересно, что код тоже осталось без изменений и для
96: Слово майс мы привели в начальную форму маус, а для изили тоже оставили без изменений. То есть почему же так получается? Мы, в принципе можем обратить внимание, что применились? Ну,
97: В начальную форму были приведены только слова 1 и той же части речи, ну и не сложно догадаться, что это были существительные. А теперь давайте посмотрим, собственно.
98: На самом деле дело в том, что когда мы применяем лемматизатор, то по умолчанию мы подаём не только как бы само слово, но его часть речи и дефолтное значение этой части.
99: Речи это н, что соответствует просто существительному, поэтому, по умолчанию лемматизатор обрабатывает только существительные. Если же мы попробуем передать в качестве, ну не просто слово, а также часть речи,
100: Отличную от существительного, то есть, допустим, v для глагола и a для прилагательного, то увидим, что, в принципе, теперь мы выводим также, ну, можем приводить к начальной форме и
101: Глаголы и, собственно, прилагательные, даже если у них там нерегулярная форма или же вообще сулити ная, то есть меняется основа.
102: И получается, для того, чтобы эффективно использовать лемматизатор, необходимо подавать не просто само слово, но его определять часть речи, ну и нам повезло, что в принципе в nltk также есть встроенный.
103: Пост теггер ну то есть размётчик частей речи, который мы можем использовать, применим метод постёг для нашего текста без стоп слов и посмотрим, какие части речи определились. Собственно, мы видим, что здесь есть
104: Не только просто непосредственно часть речи, но и какая-то дополнительная информация о том, какая это форма, например, там, какое число у существительных или какое время у глагола. Но нас сейчас в основном интересует как бы часть речи, а часть речи выражает
105: 1 буква в тех метках, которые мы получили. И, как вы видите, здесь есть некоторая проблема. То есть лемматизатор принимает на вход метки вот такого вида. То есть это строчная 1 буква.
106: Тогда как пос тегер выдаёт нам метки в другом формате. Ну, в принципе, это не очень большая проблема, потому что мы просто можем написать функцию постмен, которая будет преобразовывать метки постее в те метки, которые должен принимать на вход.
107: Акклиматизатор как мы это, собственно, сделаем. То есть мы принимаем на вход текст и создаём некоторый массив воррей, куда будем потом записывать результат.
108: И затем мы применяем к нашему тексту пост тегер, получаем некоторые теги, ну то есть получаем на самом деле, при применении там пост тегера к какому-то
109: Списку слов мы применяем, мы получаем список из кортежей внутри каждого кортежа у нас есть, собственно, само слово и его частеречная логическая метка, и в качестве Тега мы
110: Записываем, как вы видите. Ну то есть мы проходим, получаем кортеж для каждого слова. И внутри этого кортежа есть 0 элемент и есть 1 элемент. Мы берём 1 элемент, то есть то, что является непосредственно меткой и для этого 1
111: Мы берём 0 символ, ну то есть фактически то, что нам и нужно, то, что отвечает за часть речи. И затем с помощью такого словаря преобразуем тот символ, который мы взяли в тот, который нужен, то есть делаем
112: Образование для прилагательных, для существительных, для глаголов и для наречий. И затем мы добавляем в список вор тэг рей собственно, метку, которую мы преобразовали.
113: По словарю. И кроме этого, что такое вортек 0, а это само слово, которое также отображается в результатах разметки по частям речи. Ну, мы можем применить эту функцию и посмотреть, что
114: Действительно, мы получаем метки в том виде, в котором нам бы этого хотелось. То есть в том виде, в котором их может принять на вход климатизатор. Ну и теперь мы можем осуществить лемматизация всех частей речи уже не только
115: Как мы это будем делать? Мы также применяем метод лимота у лемматизатор. Однако обратите внимание, что мы применяем его не просто к слову, а к слову и тегу. Ну, то есть подаём на вход слово и часть речи, причём
116: Часть речи мы берём как выход из вот этой функции. Пост мэппинг ну то есть на самом деле мы берём не только часть речи, но и само слово тоже отсюда. А в эту функцию мы уже подаём непосредственно текст без стоп слов можно посмотреть на результат, и мы видим, что результат
117: Получается фактически идеальным, то есть трайп прилагательное остаётся без изменений кэт переводится существительное к единственному числу, форма ерунди раннинг превращается в начальную форму ран для квикли наречия ничего не происходит для глагола.
118: Код тоже мы получаем начальную форму кэтч для существительного майс единственное число mouse и для наречия easily тоже мы оставляем его без изменений.
119: Ну и в завершении нам необходимо объединить список токенов обратно в строку через пробел, и мы получаем строку, которая на самом деле, ну, является, конечно, не совсем естественным предложением английского языка, точнее, совсем неестественным, но при этом
120: Мы сохраняем именно смысловые значимые единицы, которые нам могут больше всего информации дать о том, к какой тематике относится этот текст. Здесь может возникнуть вопрос, если бы мы не
121: Проводили анализ по тематикам, решали какую-то другую задачу, например, анализ тональности, то стоило бы также удалять все собственно слова, но на самом деле вы можете подумать об этом и в принципе
122: 1 из 1 из изменений, которое можно было бы произвести, что, ну вот мы никак не учитывали там, что отрицание, оно, вообще говоря, может менять смысл, а отрицание у нас также содержалось. Ну то есть частица, но
123: Или сочетание с какими-то вспомогательными глаголами также содержалось в списке стоп слов. То есть все это мы удалили, но, вообще говоря, если бы мы решали задачу анализа тональности, то там i like и i dont like это разные значения, поэтому
124: Не хотелось бы, наверное, удалять отрицание. То есть, ну, нам, возможно, стоило убрать из списка слов списка стоп слов отрицания и оставить его в предложении. Ну и это только, ну, как бы, 1 из изменений. Ну, в принципе, как
125: То, что мы бы хотели, наверное, убирать там и союзы, и там местоимения осталось бы. Если бы мы, например, решали задачу анализа спама, то, ну, теоретически, может быть, мы бы
126: Хотели, ну, то есть не анализа, а детекции спама бы хотели там разграничивать нормальные письма от спамовых писем. Возможно, нам бы стоило ставить там, не знаю, какие-то служебные эти служебные символы, ну, там, то есть,
127: Если, допустим, встречается много каких-то, может служебных символов там, то возможно это как бы признак того, что это письмо на самом деле спам, что в нормальном письме человек не будет там столько их писать, каких-то знаков решётки, или там слыши, или же возможно, какое-то большое количеств.
128: Ссылок тоже может указывать на то, что текст является спамом. Ну то есть, в принципе, немножечко может меняться общий принцип предобработки в зависимости от задачи. И нужно как бы понимать, посмотреть на текст и подумать, как может.
129: Его поменять, но в целом основная идея остаётся прежней. Нам надо убрать лишнюю информацию, то есть как бы шумные какие-то слова, чтобы размер словаря был меньше, и чтобы модель обращала внимание только на наиболее важные слова, то есть давать ей
130: Только наиболее важную информацию. Теперь мы переходим к следующему этапу. Это векторизация текста. Ну, как мы уже говорили, нам необходимо привести текст, некоторое численное представление, то есть
131: Алгоритм не может алгоритм машинного обучения не может принять на вход буквы ему нужно подать текст в виде чисел как это сделать для этого нужен такой этап, как векторизация, и в принципе.
132: Векторизация, как можно понять по названию, это, ну, преобразование чего-то в вектор. Ну, в данном случае мы работаем с текстом, значит это преобразование текста в вектор мы будем использовать реализацию 2
133: Способов векторизации из библиотеки сайкит, лерн и для наглядности возьмём такой небольшой игрушечный корпус из 3 предложений she love pizza pizza is delicious ши из not friendly person френдли пипл, а зе бест ну, собственно, здесь, что важно, что.
134: Вот у нас, допустим, есть предложение, где слово пицца встречается 2 раза, при этом пицца не встречается больше ни в 1 предложении слово she, например, и слово friendly встречается в 2 предложениях, при этом в каждом по 1 разу.
135: И это позволяет, ну, понять, что, допустим, какие из этих слов окажутся более важными, какие менее важными и как мы сможем это показать. Ну, опять же, здесь надо оговориться, что, в принципе, векторизация применяется после предобработки
136: В данном случае просто для наглядности мы возьмём естественные предложения без удаления там всего лишнего, чтобы, ну, просто нам было так понятнее. Итак, 1 метод, о котором мы поговорим, это мешок слов. Эта иллюстрация хорошо показывает.
137: Это в чем состоит его идея? У нас есть некоторый текст, в котором, в принципе, слова стоят в определённом порядке, не просто так, потому что, ну, там, допустим, в английском, как, в принципе, в любом языке есть правила, по которым мы должны там в определённом порядке.
138: Слова располагать, они там зависят друг от друга. Вот, и это все не случайно. И мы с вами думаем, что, ну, делаем допущение, что если мы сейчас возьмём и проигнорируем все эти связи, линейные между
139: Словами, то в принципе ничего страшного не случится. И фактически вот из этой вот цепочки выстроенной структуры предложений берём и ломаем их зависимость и просто складываем все слова, как будто бы в мешок, перемешиваем их и забываем о том,
140: В каком изначальном порядке они шли и после того, как все эти слова оказались в 1 как бы таком мешке, нам нужно понять, каких слов там больше, каких меньше, чтобы таким образом показать, что там для данного конкретного текста.
141: Определённое слово встречается чаще, значит, оно важнее для этого текста. Опять же надо оговориться, да, что сейчас мы как будто бы работаем с 1 текстом и
142: Преобразовываем этот 1 текст в вектор, как мы это делаем. Собственно, нам нужно упорядочить все слова, которые встретились в этом тексте. Ну и при этом мы можем, в принципе, это сделать по алфавиту, можем сделать как-то ещ.
143: Ну вот здесь они упорядочены по частотности, и нам надо посчитать, сколько раз каждое слово встретилось в этом тексте. Ну, есть буквально мы видим, что слово и встретилось 6 раз. Мы, значит, 1 координаты.
144: Вектора будет значение 6, a2 слово, a5 раз значит следующий элемент вектора это число 5, дальше 4, 3, 3, 2, 1 и так далее.
145: И это значит, что вот, ну, данному тексту будет соответствовать вектор, который представлен здесь на изображении. Соответственно, если мы возьмём уже другой текст, в нём могут слова встретиться.
146: С другой частотой, то есть, допустим, может быть, что слово i встретилось 6 раз, а слово и встретилось 5 раз. Ну или там 7 8 неважно. Ну, в общем, порядок будет явно отличаться в другом тексте и при этом, однако, нам надо зафикси.
147: Фиксировать, что слова, вот мы установили такой порядок слов, соответствие, как бы, слова в, ну, соответствие слова и элементы вектора, значит, для следующего текста, если там слово its встретилось 5 раз, мы будем
148: Писать в 1 элемент вектора 5 если слово i встретилось 7 раз, то мы будем писать в следующем элементе вектора, слово, число 7 и, ну, в принципе, для простоты, поэтому можем упорядочить по алфавиту и каждому тексту мы будем сопоставлять вектор, у которого будут числа.
149: 3 разные, но при этом длина у него обязательно будет одинаковая. То есть на самом деле длина этого вектора должна быть равна размеру словаря, то есть количеству уникальных слов, которые есть во всем нашем корпусе. Ну то есть, если мы все тексты
150: Корпуса возьмём, посчитаем, сколько там уникальных слов, ну, получим там несколько тысяч, и вот это и будет длина такого вектора, как можно догадаться. Ну вот в данном конкретном тексте встретились далеко не все слова, которые там есть в нашем, допустим, словаре. Поэтому после вот единичек
151: Через какое-то время у нас начнутся вообще нолики, и они будут соответствовать тем словам, которые не встретились в этом тексте. Ну и, соответственно, векторы, которые мы получаем с помощью такого метода, они довольно разреженные, то есть
152: У них много нулей, мало ненулевых значений. И также они сами по себе длинные. Ну, в принципе, может показаться, что как будто бы способ такой довольно простой, и у него есть определённые минусы также ещё одними
153: Собственно, можно отнести то, что мы, как в начале сказали, забываем про какие-либо линейные связи между словами, но в целом, как бы, несмотря на свою простоту, метод работы широко используется, ну вот, в частности, с такими классическими алгоритмами машинного обучения, о которых, м,
154: Поговорим в этой лекции, как его реализовать. А, ну, в целом, для тренировки вы можете, конечно, попробовать самостоятельно реализовать такой метод, мешок слов. Это делается не очень сложно, но в библиотеке сайки лерн, как мы уже сказали, есть готовая реалии.
155: Она называется count векторайзеры. У, то есть это векторизатор, который просто основан на подсчёте количества вхождений, и для того, чтобы им воспользоваться, мы создаём объект класса каунт векторайзеры и после этого
156: Должны каким-то образом векторизацию применить к нашему корпусу и здесь в принципе есть 2 варианта у этого векторизатора есть ну 3 метода основных, которые нам сейчас будут нужны метод фит метод трансформ и method fit transform.
157: Который объединяет это все метод фит нужен для того, чтобы собрать словарь. То есть фактически, ну, посчитать, сколько у нас уникальных слов, собрать их все и упорядочить, то есть зафиксировать, что каждому конкретному слову соответствует каждое конкрет.
158: Координаты вектора, тогда как метод transform он нужен для того, чтобы на основе этого словаря и на основе этого зафиксированного соответствия слов и координат вектора преобразовать каждый текст вектор, то есть, собственно, посчитать, сколько каждое слово встретилось в этом.
159: Тексте и записать это в нужную координату вектор, но в целом можно применить оба эти метода одновременно фит трансформ. Ну что в принципе работает даже быстрее и выполняет все это.
160: Что немножко проще? Да, кажется, мы забыли запустить корпус.
161: Ну вот мы видим, что мы получаем разреженную матрицу, в которой всего 15 элементов, и это матрица размера 3 на 12.
162: Собственно, под разреженной матрицей понимается матрица преимущественно нулевыми элементами, и при этом в ней хранятся не просто все элементы, а именно.
163: Позиции не нулевых значений и как бы сами эти значения. И поэтому в такой матрице, ну как бы не 3 на 12 элементов, а меньше. И если в матрице большая часть элементов не нулевая, она называется плотной.
164: И, в принципе, разреженные матрицы. Почему удобнее принято как бы использовать, если большее число значений нулевые, потому что они занимают меньше места в памяти. Можете подробнее посмотреть про разреженные матрицы по ссыл.
165: Ну а мы с вами попробуем преобразовать вот эту матрицу, получившуюся из разреженной в плотную, и попробовать её визуализировать. Ну то есть на самом деле просто отобразить в виде такого пандас датафрейма.
166: Что мы получаем? Мы видим, что у нас все слова упорядочены по алфавиту, и каждому слову соответствует конкретный столбец этой матрицы. Ну то есть на самом деле, как мы говорили, каждая координата вектора и также у нас в
167: Строках этой матрицы. Предложение 1, 2, 3, 0 1, 2. Как кому удобнее считать и что же, собственно, внутри этой матрицы? Ну вот, допустим, для 1 предложения ла пицца, пицца лишес. Мы видим, что
168: Слово делише соответствует значение 1 слову и соответствует значение 1 love's тоже 1 she 1, а пицца 2, тогда как все остальное 0 ну потому что эти слова просто не встретились в данном предложении также мы видим, что у нас есть.
169: Предложение is not friendly person, здесь все слова встретились по 1, ну или 0 раз. То есть никакое слово не повторяется, так же, как и для предложения френдли пипл, а зе бест, собственно, тоже здесь либо слово не встретилось, либо какое-то слово встретилось только 1 раз.
170: И в целом мы сейчас рассматриваем, ну, по умолчанию, когда мы просто создаём с дефолтными параметрами, векторизатор единицей является именно просто непосредственно слово, а в принципе, в машин
171: Обучении есть ещё такое понятие, как признак, ну или feature по-английски. И в данном случае при векторизации мы как бы выделяем вот эти признаки. То есть мы оставили только самые важные слова, ну или самые важные признаки, и теперь мы их, ну, каждому признаку присваиваем. Какой
172: Это значение, соответственно, 0 1 или 2. Вот в данном конкретном примере, помимо того, чтобы использовать отдельные слова в качестве признаков, мы также можем использовать эти энграммы. То есть, когда мы создаём аккаунт векторайзеры, то, н по умолча
173: Равно грамм ренж параметр по умолчанию равен кортежу от единицы до единицы, то есть минимальное значение n 1 и максимальное значение n тоже 1. Поэтому мы берём просто по 1 слову, но в целом мы можем, допустим, если мы возьмём
174: Значение n 2, то мы будем рассматривать би граммы если значение n 3, то будем рассматривать 3 граммы, ну и, собственно, предлагаю вам самостоятельно попробовать создать векторизатор, который будет использовать би граммы и 3 граммы одновременно.
175: Отдельные слова, в принципе, вообще не будет использовать. Ну, примените этот векторизатор к текстам корпуса и посмотрите, что получится.
176: Давайте теперь сделаем это вместе. Ну, собственно, мы уже выше видели, что у нас есть объект класс аккаунт векторайзеры. Вот, и мы должны сюда записать параметр энграмм ренч.
177: И нас в основном интересует как бы диапазон, ну, от 2 до 3. Поэтому мы и пишем значение 2 минимальное, н и 3 максимальное. Н, а теперь мы должны этот созданный векторизатор применить.
178: С помощью метода fit transform к корпусу и видим, что теперь мы получаем уже матрицу размера 3 на 23, приведём её к плотному ввиду.
179: Ну и действительно, в качестве признаков используются биграммы и 3 граммы, поскольку их больше, чем просто уникальных слов, то и размер словаря увеличился, то есть количество столбцов, количество признаков тоже увеличилось.
180: На самом деле в векторизатор есть довольно разные параметры. Мы вот сейчас их с вами в принципе посмотрим, но можем также посмотреть и на примере.
181: Документации, то есть вот мы говорили про энграмм рейнж, вот он также есть параметр анлайт, который указывает, что по умолчанию мы используем именно слова, но в принципе мы
182: Можем использовать и не просто слова, а, допустим, какие-то кусочки слов. Ну то есть символы. Давайте посмотрим поподробнее.
183: То есть, помимо параметра ворд, есть также параметр char и char word boundary, ну, собственно, чем они отличаются здесь написано, но мы сейчас с вами посмотрим также на примере.
184: Итак, предположим, что мы хотим поставить параметр аналайзер чаво баундери. Ну и, как вы можете догадаться, нам надо скорректировать энграмм ренж, потому что если мы будем использовать дефолтное значение 1, 1, ну,
185: Не сложно догадаться, что получится просто по 1 символу, но по 1 символу как-то совсем бессмысленно. Зачем нам разбивать текст на символы? Это не несёт никакой информации, а вот как будто бы диапазон от 4 до 5 он уже позволяет в принципе больше информации собрать.
186: Ну и при этом, допустим, если мы будем работать, ну для чего вообще может возникнуть вопрос? Брать не целые слова, а кусочки слов? Ну, например, если у нас будет слово хороший и хорошо, то по умолчанию мы будем рассматривать их как отдельные единицы словаря, потому что это разные части речи, если мы
187: Мы возьмём, допустим, энграмму от 4 до 5, то у нас будет основа хорош. И в этом случае мы из каждого, как бы этого слова извлечём вот эту основу и будем понимать, как бы, что при обработке слов хорошо и хороший.
188: Что у них есть общее значение? Ну что они, собственно, однокорённые. Итак, давайте посмотрим. Мы применим вот векторизацию с аналайзером по символам, с учётом границ слов. И что же это значит?
189: Видим, что у нас получается очень, очень много признаков, прям сильно больше, чем было. И вот, в принципе, так выглядят наши признаки теперь, но не очень понятно, может быть, по anthem, потому что, как будто бы здесь повторение, ну, может, на 1 взгля.
190: Казаться, но на самом деле это не совсем так. То есть дело в том, что мы просто также пробел записываем, помимо самого символа, здесь, допустим, пробел перед, здесь пробел после, но при этом обратите внимание, что у нас как бы пробел
191: Хоть и входят, но при этом не являются, ну как бы мы. Нет такого, что признак это кусочек слова. Слева пробел, кусочек слова справа, если мы используем чарт ворд бандерс, вот такое значение лазер.
192: Если же мы просто используем значение char, то это может происходить теперь у нас ещё больше, как вы видите. Ну в принципе, что логично конечно признаков и так выглядят они, если мы их выведем с помощью атрибута,
193: South, то увидим, что действительно здесь будут пересечения. Ну то есть когда у нас действительно кусок слева кусок слова, слева пробел, кусок слова справа вопрос о том, какой способ лучше применять чар или charts under
194: Здесь нет какого-то конкретного ответа, потому что зависит от задачи опять же, ну вот для чего может быть полезным, например, использовать вот такой способ, когда мы как бы игнорируем границы слов. Но опять g1, что может прийти в голову, это
195: Когда у нас есть отрицание какое-то, ну опять же, not, может быть не попадёт полностью с каким-то словом, а, and, ну то есть, когда там, допустим, донт и там, and может попасть вместе с кусочком следующего слова, и тогда у нас уже будет это
196: Слово интерпретироваться как бы, ну, мы будем не просто само там слово интерпретировать, а то, что перед ним ещё было какое-то отрицание, в принципе, для этого же, опять же, может быть полезно и использовать несколько слов. Ну, здесь, в принципе, могут быть другие тоже причины.
197: В принципе, 2 слова, они всегда несут больше информации, чем 1, поэтому тоже биграммы могут быть более информативны, чем униграмм. То есть просто слова. Ну так что здесь, в принципе, параметров можно, ну, параметров.
198: Можно варьировать и опять же можно смотреть на то, при каких параметрах вы получите лучший результат. О том, как это делать, как организовывать такой подбор гиперпараметров. Мы поговорим в конце данной лекции.
199: И проблема некоторая вот этого способа аккаунт векторайзеры. То есть мешок слов в том, что вот мы говорили о том, что у нас есть какой-то текст, допустим, в котором слово 1 встречается 2 раза, при этом не встречается больше ни в 1.
200: Тексте нашего корпуса, то есть как будто бы значит, что это слово, оно прям вот такое очень важное для этого текста, и его как-то сильно характеризует и на фоне там других текстов в корпусе. И поэтому нужно ему дать больший вес.
201: То есть этот признак как бы точнее не вес ему дать наибольшее значение, что у этого признака, чтобы был, который соответствует этому слову, тогда как, например, если слово там sci встречается в 2 текстах нашего.
202: Корпуса, ну то есть больше, чем в 1 тексте нашего корпуса. И при этом в каждом по 1 разу, то это, скорее всего, значит, что в принципе это не очень важное слово, раз оно встречается в разных текстах, может быть там даже в текстах разных тематик. И не то чтобы является принадлежностью какой-то конкретной тематик.
203: Ну и в каком-то смысле является там условным таким стоп словом, в рамках нашего корпуса. Ну то есть не несёт как бы именно какой-то важной смысловой информации для классификации дальнейшей. И мы этому признаку, который соответствует этому слову, наоборот, хотим дать присвоить меньшее значение с помощью
204: Мешка слов мы так делать не можем, к сожалению, однако можем это делать с помощью другого метода под названием tf idf, как это расшифровывается tf это frequency id, это where докмент frequency, ну и как?
205: Написано на экране у вас, что это тоже ещё 1 способ векторизации, и он позволяет отражать важность слова в документе не только частоту его появления, то есть важность как внутри документа, так и во всем корпусе, на самом деле, ну, под документ.
206: Да, здесь важно оговориться мы имеем ввиду просто какой-то конкретный текст, там допустим конкретную новость или конкретное сообщение в зависимости от того, что мы анализируем давайте посмотрим как рассчитывается частота слов tf и inverse, то есть обратно.
207: Частота документов, частота слов. Ну, это фактически мера частоты употребления некоторого слова. Назовём её дабл ю. В документе ди, и она определяется просто как
208: Отношение появления слова в документе к общему количеству слов в документе, то есть это дробь, в числителе которой сколько раз встретилось слово в данном тексте, а в знаменателе это общее количество слов в данном тексте обратная частота документов.
209: Может быть, чуть менее интуитивно, но мы подразумеваем, что это мера важности слова, то есть она должна быть большой для слов, которые встречаются в маленьком количестве документов и, наоборот, маленькой для слов, которые встречаются в большом количестве документов.
210: Как это сделать? Собственно, это тоже дробь, где в числителе у нас общее количество документов в корпусе. Ну, то есть, на самом деле это все тексты, которые есть в нашем корпусе, ну, количество текстов, которые есть в нашем корпусе, а в знаменателе это количество текстов, которые
211: Содержит данное конкретное слово дабл ю. Ну и от всего этого мы берём натуральный логарифм, и получается, что для слов, которые встретились в большом количестве текстов, мы получаем маленькое значение тифа и чем, ну и
212: Это значение, соответственно, тифа растёт для тех слов, которые встретились, наоборот, в малом количестве текстов, то есть они специфичны для каких-то определённых текстов, и в этих текстах, соответственно, встретились часто, то есть tf отвечает за то.
213: Сколько раз как бы встретилось это слово в конкретном тексте, а idf отвечает за то, сколько раз оно встретилось в других текстах ну, в принципе, во всех текстах нашего корпуса.
214: Давайте попробуем самостоятельно создать векторизатор класса тиф. Кто-то есть это просто класс, который позволяет вернее создать векторизатор тиф айди и затем
215: Примените его к корпусу, посмотрите на результат. Ну, собственно, общая как бы идея применения точно такая же. То есть вы создаёте объект класса фтора и затем применяете метод фит трансформ, можете попробовать сделать самостоятельно, затем посмотреть, как это будет сделано на видео.
216: Итак, мы создаём объект тедди ектора и затем уже известным нам методом пользуемся, который позволяет обрабатывать корпус фит трансформ.
217: Посмотрим на результат. Ну, собственно, понятно, что снова матрица 3 на 12, то есть 3 предложения и 12 уникальных слов.
218: И, как мы можем заметить, теперь уже у нас матрица состоит не из целых чисел, а из Дробных нулей. Все также больше всего, естественно. Ну что здесь интересного можно заметить? Ну вот допустим, в предложении
219: Ла пицца пицца делишес посмотрим на значение для слов loves из delicious, собственно.
220: Для слова лавс, точнее нет, для слов loves и delicious вот мы видим, что для слова лавс значение такое для слова делишес значение такое для слова she соответственно, у нас значение меньше.
221: Как и для слова иис. Ну а для слова пицца значение, наоборот, больше всего. Ну и здесь легко догадаться, почему это происходит. Собственно, слово пицца встретилось 2 раза, и только в рамках данного предложения у него самое большое значение.
222: Признака слова лавс и делише встретились в этом предложении по 1 разу, но больше нигде не встретились, а слово ши и иис. Они встретились тоже в этом предложении по 1 разу, но встретились ещё и в другом предложении, и поэтому у них самое
223: Маленькое значение тефф для следующего предложения is not friendly person собственно, мы видим, что friendly получает такое значение, как и собственно.
224: Иис. И sci. Потому что эти слова встретились в этом тексте по 1 разу, но ещё встретились в других текстах, ну а допустим, слово, not и слово person встретились только в данном тексте, поэтому они получают.
225: Значение больше, ну и что касается последнего предложения, мы уже говорили, что, собственно френдли встретилось и раньше, поэтому у него самое маленькое значение а. А best people и the эти, собственно, признаки.
226: Получают самое большое значение тиф адф. Ну, в принципе, как вы можете видеть, что там конкретные значения, они отличаются для текста. То есть не то, чтобы если там слово встретилось 2 раза, у него такое-то значение 1 раз такое-то
227: И это как раз-таки связано с тем, что мы считаем общее количество слов в предложении, поэтому от этого тоже зависит получаемое значение.
228: Ну, ещё 1 параметр, который также можно рассмотреть. Собственно, это параметры мин дф Макс дф, которые показывают, будем ли мы брать при будем
229: Убрать при векторизации все слова из словаря или только часть слов? Ну, как можно догадаться, Миндеев ограничивает размер словаря, и мы будем включать только слова, которые встречаются не Реже, чем в н.
230: Документах. То есть, допустим, если мы поставим мин дф 2, то мы будем брать только слова, которые встречаются минимум в 2 текстах, а Макс дф ограничивает наоборот, сверху. Ну то есть так, ещё 1 способ отсечь как бы стоп.
231: Слова незначимые слова в рамках нашего корпуса. То есть если мы, допустим, поставим Макс дф 100, то мы будем брать только слова, которые встретились не больше, чем в 100 текстах нашего корпуса. Мы можем как отмечать это с помощью
232: Целых значений, то есть конкретное количество документов, текстов указывает так и с помощью числа с плавающей точкой в диапазоне от нуля до единицы. То есть, допустим, если мы укажем там 0 1, то для mind, то это будет значить, что мы берём только
233: Слова, которые встретились не менее чем в 10 процентах всех текстов. А если мы берём там для Макса д, допустим, 90, то это значит, мы берём только слова, которые встретились не более чем в 90 процентах всех текстов. Ну, предпо,
234: Положим, что мы установили mine 2, то есть берём только слова, которые встретились в 2 текстах и видим, что получаем, собственно, довольно маленькую уже теперь матрицу. Ну и действительно, потому что у нас таких слов всего 3. И, наверное, здесь такая рекомендация может быть
235: Что mind возможно, проще указывать как целым числом. Ну, то есть там 2 или 5, 10, в зависимости от размера всей коллекции. А Макс дф довольно сложно как бы, угадать, может быть целым, ну, числом, поэтому можно указывать как раз процентами, допустим, 0 9 или 0 7, или
236: 5 то есть удалять слова, которые встретил больше, чем в этом количестве этой доли, как бы всех текстов.
237: Ну и теперь мы можем переходить к обучению модели и рассмотрим, какие, собственно, бывают алгоритмы для того, чтобы применять разные модели в целом. Их, конечно, намного больше, чем-то, что мы сейчас
238: Рассмотрим, но мы посмотрим на самые такие простые, классические, которые не всегда как бы будут работать лучше. Ну, скорее даже будут работать хуже, чем более сложные, но при этом их реализация довольно простая быстрая, поэтому
239: В качестве как бы базового решения бейзлайна они часто применяются и также в чем их плюс, что они довольно хорошо интерпретируемы, о чем мы также поговорим подробно.
240: 1 алгоритм это наивный базовый классификатор, который, собственно, фигурирует в названии нашего курса. И фактически здесь мы на самом деле не то чтобы даже что-то как то сильно обучаем, то есть не подбираем какие-то
241: Веса, допустим, а фактически считаем просто вероятности, рассчитываем их на обучающем корпусе и затем-то, что рассчитали, применяем к тестовым данным.
242: Мы предсказываем некоторую вероятность для каждого класса и затем выбираем класс, который получил наибольшую оценку. И почему же, собственно, классификатор называется наивным? Потому что мы предполагаем, что
243: Наличие слов не зависит друг от друга. То есть, что там, допустим, наличие слова, тренер и слова чемпионат не зависят друг от друга, что, в принципе, не совсем правда. Но вот мы делаем такое допущение.
244: Если говорить чуть более формально, то для каждого класса ц требуется найти вероятность класса ц. Для документа д. Она рассчитывается по формуле Байса, то есть в числителе у нас вероятность документа для класса и вероятность класса а в знамёна.
245: Вероятность документа. Ну, как мы уже сказали, что у нас есть, соответственно, несколько классов для каждого класса. Допустим, мы это рассчитываем и выбираем в качестве предсказания класс, который набрал наибольшее значение вероятности в
246: Знаменателе у нас вероятность документов, вероятность текстов и, в принципе, она одинакова для всех классов, поэтому мы просто его сразу опускаем, ну, остановимся вот на этой формуле и подробно её разберём. Итак, опять же, что здесь самое по
247: Наверное, это вероятность класса, то есть фактически это доля документов данного класса среди всех документов, если у нас, предположим, четверть всех текстов относится к каждому.
248: 4 классов, то значит, что будет, собственно, 1 4 для каждого класса. Но может быть, конечно же, и дисбаланс, например, может быть, если у нас там 3 класса, то к 1 классу относится половина всех документов. Ну а к 2, соответственно, и
249: 3 классу относится уже меньше в любом случае, всех документов и пос. Ну, 2, собственно, что содержится в этой формуле? Это вероятность документа для класса. Мы считаем, что вероятность
250: Документы для класса, то есть о том, что этот документ относится к этому классу, считается на основе собственно слов, ну, которые входят в этот документ, то есть на основе, вообще говоря, признаков, которые мы, вы
251: Их мы обозначаем как x, 1, x, 2 и так до xxx н. И нам надо посчитать вероятность для всех, вероятность всех этих слов для неё ну при учёте некоторого класса ц. Как мы это делаем, мы считаем вероя.
252: Каждого слова при условии этого заданного класса ц. Для этого нам надо понять, в сколько раз тост икс 1 встретилось в текстах класса ц и таким образом, если там это слово
253: Часто встречалось в текстах данного класса, то затем окажется, что, собственно, потом, когда мы будем применять уже там тестовой выборке, то наше предсказание будет основываться на этом, если там слово часто встречалось в данном классе.
254: То будет больше вероятность, что текст, содержащий это слово, также отнесётся. Ну, также мы отнесём к классу ц.
255: Следующий алгоритм это логистическая регрессия. Ну, в принципе, если мы говорим про регрессии, то нам необходимо найти связь между несколькими независимыми переменными и зависимыми переменными в данном случа.
256: Независимая переменная это как раз-таки наши признаки икс 1, x, 2, x and y. Зависимая переменная это их взвешенная сумма, что значит взвешенная, то есть каждому признаку мы подбираем некоторый вес в 1 the 2 the н и.
257: И чтобы правильно подобрать эти веса, мы как раз-таки и обучаем нашу модель. То есть изначально мы инициализируем эти значения весов каким-то рандомным образом, и затем мы подбираем такие веса, которые более подходят
258: Каждому признаку. Ну то есть если у нас, предположим, опять же слово, там тренер для класса sport должно иметь большое положительное значение веса, а для класса политика скорее наоборот, отрицательное
259: Ну, размер уже его тоже может быть разным. Положительное значение веса говорит о том, что появление этого признака положительно влияет на то, чтобы отнести текст к данному классу, то есть повышает вероятность.
260: Класс а отрицательное значение веса, наоборот, понижает вероятность текста при наличии там этого энного признака и значение z, которое является взвешенной сумм.
261: То есть произведением каждого веса на признак и их собственно, суммой. Оно может в принципе принимать значение в любом диапазоне. Однако нам, как мы уже сказали, нужно получить вероятность отнесения объекта к классу, но вероятность у нас
262: Это число в диапазоне от нуля до единицы для того, чтобы его принести в такой диапазон используется функция активации для бинарной классификации используется сигмоида, формула которой представлена на экране.
263: И для многоклассовой классификации используется функция активации софтмакс. То есть в этом случае, ну, если в случае сигмоида мы получаем 1 значение, если значение больше нуля целых 5/10, то мы относим объект к положительному классу, если
264: Меньше нуля целых 5/10, то к отрицательному классу, тогда как в случае софтмаксом мы для каждого класса получаем какое-то значение и для этого мы считаем, проводим экспоненцировать для полученного значен
265: То есть возводим её в степень зет итая, а в знаменателе, собственно, считаем сумму экспонент для всех z, для z, для всех классов, где-ка это, собственно.
266: Количество классов, то есть и от 1 до-ка. При этом, почему именно такая операция проводится. Дело в том, что нам надо получить, во первых, не отрицательное значение, а экспонента.
267: Получает, позволяет получить именно неотрицательное значение. Ну а в знаменателе мы делим на сумму всех для того, чтобы как бы нормализовать, и для того, чтобы сумма всех этих вероятностей в итоге давала единицу. Ну что, в принципе, тоже соответствует понимании
268: Вероятности. И если мы проводим бинарную классификацию, то вот у нас как бы признак умножается на свой вес. И мы применяем сигмоиду. Как мы уже сказали, получаем 1 значение предсказаний. Тогда как если
269: Реализуем многоклассовую классификацию, то в этом случае вот этот вот вектор признаков, он будет свой для каждого класса. Ну и количество собственно этих векторов признаков зависит от количества классов.
270: Давайте с вами попробуем записать формулу для функции софтмакс. Собственно, на основе того, что здесь представлено. То есть реализуем это в коде. При этом для экспоненци, для экспоненцировать можно использовать нампай эксп, а для подсчёта суммы нампай сам.
271: Ну, можем вместе это записать собственно, сначала мы считаем экспоненту для значения z, а затем считаем сумму.
272: Сумму, собственно, от экспоненты.
273: И подаём некоторые значения z. Как мы сказали, они могут быть в любом диапазоне, но видим, что самое маленькое значение это 0 1, 2, самое большое, 1, ну а нулевое значение по середине, собственно, и мы
274: Можем вывести получившееся значение после Макса для каждого из них и также вывести их сумму, чтобы убедиться, что она равна единице.
275: А, ну суммой все верно и также мы видим, что если самым маленьким было значение z 2, то оно так и осталось самым маленьким если самым большим было значение z 1, оно также осталось самым большим, то есть вот именно соотношение между значениями, оно
276: Сохраняется при применении софтмакс. И затем здесь мы бы выбрали класс 1, поскольку для него мы получили самое большое значение после применения софт Макс
277: Следующий алгоритм, который мы будем также рассматривать, это дерево решений. В принципе, мы уже с вами даже фактически в некотором смысле рассматривали дерево решений. Вот здесь вот, собственно, подход на основе правил, в каком-то смысле явля,
278: Является таким деревом решений. То есть мы создаём правило вида, если то если там слово встречается больше какого-то количества раз, то идём там в следующую ветку, если меньшее количество раз, то идём в другую ветку. Ну и на самом деле здесь идея такая же.
279: Ну, в принципе, деревья решений применяются для различных там самых задач, и они могут писаться, как мы уже сказали, человеком вручную. И идея такого алгоритма дерева решений в рамках машинного обучении.
280: И состоит в том, что мы не вручную их создаём, а генерируем эти правила автоматически в процессе обучения. Ну и при этом в дереве есть, собственно, элементы 2 типов, есть узлы, которые содержат правила.
281: Правило касается некоторого признака и некоторого условия на значение этого признака, ну, допустим, там больше или меньше, или там бинарно там, да, нет. И также есть собственно листья, а в листьях содержится уже конкретное
282: Предсказания, ну, допустим, предсказание класса, если вот мы говорим про там выдачу кредита выдать или отказать.
283: И если там, соответственно, объект попадает в лист, то он соответствует, выполняет все правила, которые вели к этому листу. Однако проблема в том, что деревья решений склонны к переобучению. То есть вот конкретные значения.
284: Границы, которые мы там, допустим, выбираем для вещественных признаков. Они могут сильно подстраиваться под обучающие данные и, допустим, на тестовых уже как бы работать не так хорошо, поэтому применяется чуть более усложнённая модификация.
285: Метода, а именно метод случайного леса, он позволяет избежать переобучения за счёт того, что фактически представляет собой ансамбль деревьев, решений. То есть мы обучаем много, много разных деревьев. Каждое из них действительно может быть пере,
286: Обучены внутри себя, но за счёт того, что они вычленяют как бы каждый какой-то кусочек общей закономерности в данных, при их объединении их предсказаний мы получаем, в принципе, довольно хорошую картину. И как мы добиваемся того, что каждый как бы
287: Получает немножко разное представление о данных за счёт того, что мы подаём им на самом деле не все объекты каждому и не все признаки. То есть каждое дерево видит свой кусок, свою часть объектов и свою часть признаков. И за счёт этого получается, что как бы каждое
288: Имеет условно немножко разный взгляд на наши данные, ну и за счёт агрегирования предсказаний. То есть, ну просто голосованием за большинство мы получаем предсказание истинного класса после того, как вы построили модель. Необхо.
289: Необходимо понять, собственно, насколько вообще хорошей она является. И для этого есть различные методы оценки качества. Они позволяют понять, насколько хороший результат на текущем этапе. И если там что-то с ним, допустим, делать, то
290: Улучшится он или ухудшится. И для того, чтобы проверять качество. У нас есть тестовая выборка. То есть на обучающей выборке мы некоторым образом обучали наши алгоритмы, а на тестовой выборке мы измеряем качество. Давайте
291: Для начала посмотрим на бинарную классификацию, на метрики, которые используются для бинарной классификации. Ну, в целом мы можем представить это как задачу отделения новостей про спорт от всех остальных новостей, допустим и очень важным.
292: Таким элементом в оценке качества является матрица ошибок. Пускай у нас есть алгоритм, который предсказывает принадлежность объекта к 1 из классов. И для тогда у нас есть с помощью игрек мы
293: Обозначаем истинный класс объекта. То есть, ну, допустим, тематический класс, которому действительно принадлежит новость. И также игрек с крышкой, это предсказанный алгоритмом класс объекта. То есть это тот класс, которому алгоритм предсказал, что наша новость относится по тематике.
294: Ну, предположим, у нас есть положительный и отрицательный класс. 1 и 0. То есть 1 это, допустим, спорт. А 0 это там не спорт.
295: И здесь может быть 4 разных типа исходов. То есть если объект относится к классу спорт, к положительному классу, и алгоритм предсказал, что он относится к классу спорт, то мы получаем истинно положительный
296: Исход или по-английски to positive собственно, что представлено в этой ячейке, если же?
297: Объект сам по себе не относится к классу спорт, тогда как алгоритм предсказал, что он относится к классу спорт, то это ложный положительный исход по-английски, фолс позитив.
298: Это, собственно, положительные исходы. То есть, когда алгоритм относит объект к положительному классу, в нашем случае к классу спорт, все они представлены вот в этой строчке матрице и во 2 строчке представлены отрицательные исходы, когда алгоритм предсказывает
299: Что объект там текст относится к отрицательному классу, то есть не про спорт, допустим, и тогда, может быть, как истинно отрицательный исход ру негатив, когда текст действительно не про спорт там, а не знаю про политику и модель так и предсказала, что текст не
300: Про спорт и могут быть также ложно отрицательные исходы, когда текст сам говорит о спорте, то есть относится к положительному классу, но модель предсказала, что нет, это не так, и сделала как бы ложно отрицательное предсказание, то есть как это можно легко
301: Помнить, если модель предсказала положительный класс, то это в любом случае исход положительный, и он может быть либо истинно положительным. То есть модель правильно предсказала положительный класс, либо ложно положительный, то есть модель ложно.
302: Сказала, положительный класс. Ну и относительно с отрицательными исходами, в принципе, тоже.
303: Это же можно, в принципе, проиллюстрировать на примере картинок, что может быть даже чуть более наглядным. Собственно, если там у нас есть изображение, которое, ну, у нас есть, допустим, набор изображений, и мы предсказываем, что
304: Положительный класс, это является фотографией кошки, а отрицательный класс это является фотографией собаки, то есть не является кошкой. И если модель правильно определила, что, ну, если объект является фотографией кота, и
305: Модель это правильно, собственно, определила, то это истинно положительный исход. Если же модель сказала, что на фотографии не кот, то есть собака, на самом деле, это кот, то это ложно отрицательный исход, ну,
306: В принципе, здесь наглядно видно, что, собственно, на фотографии изображён кот, но предсказание отличается от истинного значения. И тоже самое, если на фотографии изображена собака, то есть
307: Если на фотографии собака изображена, а модель предсказала, что это на самом деле кошка, то это ложно положительное предсказание если же на фотографии собака, то есть не кошка, и модель действительно предсказала, что на фотографии кошки нет, то it.
308: Истинно отрицательное предсказание, которое является правильным и просто правильно предсказывает отрицательный класс. Ну и для чего, собственно, нужна эта вся матрица ошибок, а непосредственно для того, чтобы считать метрики, качества классификации?
309: 1 метрика это экорус, она фактически считает долю правильных ответов алгоритма среди всех ответов в числителе, как можно заметить, на сумма истинных исходов истинно положи.
310: Истинно отрицательных, а в знаменателе просто общее количество объектов. Ну то есть фактически мы считаем, сколько меток совпало с правильными, однако она не очень показательна в задачах с неравными классами. Что мы
311: Сейчас посмотрим на примере. Пусть у нас есть задача оценить работу некоторого спам фильтра для электронных сообщений. И у нас есть всего 110 писем, при этом 100 из них не
312: Являются спамом, то есть относятся к отрицательному классу. Здесь важно сказать, что мы считаем положительным классом именно письмо спам, то есть 100 писем относятся к отрицательному классу, они нормальные, не спам. И из этих писем 90 классифика
313: Верно, присвоил им отрицательный класс и 10 неверно присвоил положительный класс. То есть сказал, что это на самом деле спам, а это не спам. Есть ещё 10 писем, которые являются спамом, то есть положительный класс, из них 6 класси.
314: Верно, присвоил положительный класс, a4 неверно присвоил отрицательный класс и предлагаю вам выписать самостоятельно, собственно истинно положительный, истинно отрицательный, ложно положительный ложно отрица.
315: Исходы, ну то есть их просто количество. Затем написать формулу для эпирус и вывести результат.
316: Ну, надеюсь, что вы справились с этим. Теперь можем сделать, собственно, вместе. Итак, давайте ещё раз посмотрим. У нас есть 100 писем, которые не являются спамом. То есть отрицательный класс. 90 из них классификатор определил верно? Это значит, что 90 исхо.
317: Являются истинно отрицательными. Это у нас струне. Сюда мы сразу можем записать 90, при этом 10 из них они сами по себе являются отрицательными, но им ложно был присвоен положительный
318: Класс, то есть это ложно положительные исходы.
319: И также есть 10 спам писем, положительный класс, из них 6 классификатор, верно? То есть это истинно положительные исходы.
320: И остальные 4. Им был ложно присвоен отрицательный класс. То есть это ложно отрицательные исходы. Ну, это, в принципе, записать не сложно.
321: Мы в числителе считаем истинные исходы истинно положительные, истина отрицательные, а в знаменателе, собственно, просто общее количество.
322: Видим, что мы получили довольно высокое значение эриси, и наша модель, в принципе, ну, довольно неплохо что-то предсказывала, однако, как мы заметили, выборка сильно не сбалансирована и теоретически можем представить. А что если мы просто будем предсказывать, что все письма
323: Не являются спамом. То есть вообще фактически не будем ничего фильтровать. А какое вот тогда качество будет у нашего, ну, такого псевдо алгоритма? Вы можете самостоятельно также выписать количество исходов каждого типа и затем посчитать экерс. Ну давайте
324: Делаем это теперь вместе. Собственно, если мы определяем все письма как не спам, то есть все письма у нас относятся к отрицательному классу. Это значит, что положительных исходов у нас в принципе не будет ни ложно положительных, ни истинно положительны.
325: Мы сразу можем здесь записать нули.
326: Ну, если мы 110 письмам предсказали, что они не спам, из них 100 действительно не спам, то это значит, что истинно отрицательных исходов у нас будет 100.
327: Ну а остальные 10, которые являются спамом, то есть относятся к положительному классу, а мы им ложно предста, ложно присвоили отрицательный класс. Это и есть ложно отрицательные исходы. Ну, формулу для экси можно просто скопировать.
328: И видим, что мы получаем значение. Экорис даже больше, чем когда вообще что-то пытались предсказывать. Ну и хотя наша модель никакой предсказательной силой не обладает, а вот значение экорис такое высокое, это говорит о том, что на самом деле, ну, эта метрика
329: Очень непоказательно в задачах, ну, при работе с данными, которые сильно не сбалансированы по классам. Поэтому есть другие метрики, собственно, которые позволяют более подробно оценить качество. 1 метрика это точность.
330: Ну, можем её описать как долю объектов, которые названы классификатором положительными и действительно являются положительными. Посмотрим на формулу в числителе у нас истинно положительные исходы, а в знаменателе сумма истинно положительных и ложно положительных. Если
331: Мы вернёмся к матрице ошибок, то мы видим, что мы действительно обращаемся только к тем объектам, которые классификатор назвал положительными. И считаем, сколько объектов, которые классификатор назвал положительными. Действительно таковыми являются
332: Ну, то есть насколько точно буквально сработал наш классификатор, полнота считает долю объектов положительного класса, который нашёл алгоритм среди всех объектов положительного класса. То есть в числителе у нас истинно положительные исходы, а в знаменателе истинно положительный плюс ложно отрица.
333: Давайте посмотрим опять же на матрицу ошибок. То есть при подсчёте полноты мы учитываем только объекты, которые действительно являются объектами положительного класса. И мы считаем, сколько из объектов, которые действительно являются
334: Положительным классом нашёл классификатор, то есть долю пользователя среди всех объектов, которые истинно являются положительными.
335: Ну, то есть, насколько полно их нашёл классификатор. В принципе, различие между точностью и полнотой. Ещё наглядно можно посмотреть на примере таких вот изображений. То есть, если у нас низкая точность и низкая полнота,
336: То мы, во первых, выделили не все нужные объекты, а во вторых, выделили лишние. Ну, то есть, предположим, что у нас положительный класс, это зелёные треугольнички, отрицательные, это голубые кружочки, если у нас высокая полнота и ни
337: Точность то мы лишнего ничего не выбрали, но при этом взяли не все, что было нужно. При низкой полноте и высокой точности мы все нужное взяли, но ещё взяли кучу всего как бы лишнего, то есть взяли.
338: Те объекты, которые не должны были выделять, ну и как бы компромисс, это высокая полнота и высокая точность, когда мы взяли только то, что нужно, и ничего лишнего не взяли. Ну, понятно, что не всегда достижимо, как бы, и высокая точность, и высокая полнота, и есть значение.
339: Меры, которые представляет собой средней гармонической точности и полноты и позволяет находить некоторый баланс в принципе, если чуть более как бы расширенно посмотреть формулу, то это formula может так считаться f1 мерой.
340: Поскольку на самом деле здесь как бы есть коэффициент бета, который равен единице и как бы при сложении единицы, мы получаем здесь коэффициент 2, но в целом мы можем бета менять. То есть если у нас бета будет меньше единицы, то больше
341: Приоритет отдаётся точность, а если больше единицы, то полноте. Это что касается бинарной классификации. В принципе, мы с вами будем работать с многоклассовой классификацией. И основная идея точно такая же. Но отличие в том, что нам
342: Необходимо проводить какое-то усреднение. То есть мы всегда ставим задачу классификации как отделение итого класса от остальных. Ну допустим вот мы сейчас так же на самом деле это сделали для примера. То есть мы как будто бы считали спорт и не спорт это
343: Соответственно, отделение класса спорта от остальных. Также мы должны посчитать отделение класса политики от остальных политика не политика класса бизнес, от остальных бизнес не бизнес и класса науки от остальных. То есть наука не наука. И таким образом мы получим в принципе четы.
344: Разных матрицы ошибок, ну то есть к матрица ошибок по количеству классов. И дальше можно с ними делать как бы различные вещи. Во первых, мы можем усреднить все эти матрицы ошибок сначала, то есть посчитать сред
345: Значение истинно положительных, среднее значение истинно отрицательных, среднее ложно положительных, среднее значение ложно отрицательных. И затем на основе этих усреднённых значений мы будем считать микро точность микро панду и микромер, что, собственно, представлено на экране 2.
346: Вариант это считать макро усреднение. То есть мы усреднять будем не на уровне матрицы ошибок, а будем сначала для каждого, собственно, к итого класса, то есть к раз считать точность, полноту, эф меру и за
347: Тем полученное значение уже усредним, ну просто сложив и поделив на количество классов. Ну, в принципе, самым эффективным, скорее является подход под названием взвешивание, он похож на макро, усреднение. То есть мы тож
348: Как бы останавливаемся на матрице ошибок для каждого класса. На основе этой каждой матрицы ошибок считаем караз, точность, полноту их меру. И затем мы не просто усредняем, а мы присваиваем каждому классу некоторый вес. Ну, то
349: То есть вес это фактически количество объектов класса среди общего количества объектов. Чем больше объектов данного класса, тем больше у него вес. Ну и это может быть чуть более показательно, потому что мы учитываем, как бы
350: Классы пропорционально их количеству объектов в них и этот подход называется, собственно, взвешиванием. Таким образом, в этой части 1 лекции мы с вами рассмотрели, какие, собственно, есть в принципе,
351: Алгоритмы решения задач обработки текстов, что можно решать с помощью правил с помощью машинного обучения, и остановились подробно на машинном обучении, узнали, какие есть возможности предобработать текст, убрать из него лишние шумные признаки, как, собственно преобра.
352: Текст вектор. И какие алгоритмы машинного обучения можно применять самые такие базовые? Ну и как оценивать их качество? А на следующей лекции в рамках данной темы мы посмотрим на пример реализации этого всего, как работать с конкретными данными и как
353: Обучать на них модели и тестировать их, то есть оценивать их качество, а также как оптимально подбирать гиперпараметры. На этом все. Спасибо за внимание и до встречи на следующей лекции.