Видео проигрыватель загружается.Воспроизвести видеоВоспроизвестиБез звукаТекущее время 0:00/Продолжительность 6:04Загрузка: 0.00%0:00Тип потока ОНЛАЙНSeek to live, currently behind liveОНЛАЙНОставшееся время -6:04 1xСкорость воспроизведения2x1.75x1.5x1.25x1x, выбрано0.75x0.5xГлавыГлавыОписанияОтключить описания, выбраноСубтитрынастройки субтитров, откроется диалог настройки субтитровСубтитры выкл., выбраноЗвуковая дорожкаPicture-in-PictureПолноэкранный режимThis is a modal window.Начало диалоговго окна. Кнопка Escape закроет или отменит окноТекстColorБелыйЧерныйКрасныйЗеленыйСинийЖелтыйПурпурныйГолубойTransparencyПрозрачностьПолупрозрачныйФонColorЧерныйБелыйКрасныйЗеленыйСинийЖелтыйПурпурныйГолубойTransparencyПрозрачностьПолупрозрачныйПрозрачныйОкноColorЧерныйБелыйКрасныйЗеленыйСинийЖелтыйПурпурныйГолубойTransparencyПрозрачныйПолупрозрачныйПрозрачностьРазмер шрифта50%75%100%125%150%175%200%300%400%Стиль края текстаНичегоПоднятыйПониженныйОдинаковыйТеньШрифтПропорциональный без засечекМоноширинный без засечекПропорциональный с засечкамиМоноширинный с засечкамиСлучайныйПисьменныйМалые прописныеСбросить сбросить все найстройки по умолчаниюГотовоЗакрыть модальное окноКонец диалогового окна.
Датасет мы токенизировали, словарь построили, можно перейти и к построению матрицы признаков. Для построения матрицы признаков по методу мешка слов мы будем использовать нашу функцию "vectorize_texts". Давайте посмотрим, как она реализована. Эта функция принимает три основных параметра, а именно — список токенизированных текстов (то есть список списков строк), словарь (то есть, отображение из строк в числа) из токенов в их идентификаторы или в их номера, а также вектор, содержащий действительные числа и описывающий относительные частоты токенов. Функция принимает ещё два параметра — а именно, это алгоритм взвешивания токенов по частоте (по умолчанию выбран TF-IDF), а также флаг, который говорит, нужно ли перемасштабировать данные после взвешивания, или не нужно. Мы чуть позже, разберём, что именно он делает. Сначала мы проверяем, что нам передали режим, с которым мы умеем работать. Далее мы строим прямоугольную матрицу, в которой количество строк соответствует количеству текстов, а количество столбцов соответствует количеству уникальных токенов. Эта матрица будет содержать счётчики: сколько каждый токен встретился в каждом документе. Давайте вспомним гистограмму относительных частот слов. У нас очень мало частых слов — более того, мы их специально выкинули, — матрица счётчиков будет крайне разреженная. Мы можем использовать разреженные матрицы из библиотеки scipy. Разреженные матрицы хранят только ненулевые элементы. Алгоритм подсчёта предельно прост — мы идём по всем текстам, по всем токенам в каждом тексте, и если токен есть в словаре, то мы увеличиваем на единичку соответствующую ячейку матрицы. Если мы получили какой-то неизвестный токен, то, возможно, нам дали либо новые тексты, которых не было в обучающей выборке, либо этот токен был в обучающей выборке, но мы его отфильтровали по частоте. Далее мы реализуем процедуру взвешивания. По умолчанию, в этой функции реализовано 4 алгоритма взвешивания. Первый алгоритм — это бинарные вектора. Этот алгоритм приводит к тому, что матрица весов будет содержать единичку, если токен хотя бы один раз встретился в документе, и нолик, если токена в документе не было. Следующий алгоритм — это относительные частоты слов в документе — TF (term frequency). В этом алгоритме мы сначала преобразовываем матрицу в другой формат разреженных матриц[2]. Формат CSR обеспечивает эффективные операции над строками матриц, но крайне неэффективен для операций над столбцами. Часто выгоднее несколько раз конвертировать матрицу (сначала в один формат, сделать операцию, конвертировать в другой, сделал другую операцию...), чем делать операцию в неподходящем для неё формате. Итак, мы конвертируем в разреженную матрицу для строк и делим каждый счётчик в каждой строке на сумму элементов в этой строке — по сути, мы делим количество употреблений токена в документе на длину этого документа, то есть мы получаем относительную частоту токена в документе. Следующий режим — это IDF (inverse document frequency). Этот алгоритм взвешивания приводит к тому, что, в результирующей матрице признаков, убирается вся информация о частоте токена в документе. Но в этой матрице есть информация о частоте токена в корпусе. Здесь мы сначала получаем матрицу индикаторов (есть ли токен документе, или нет), а затем домножаем индикаторы на вектор весов слов, который мы вычислили на этапе построения словаря. Функция "multiply" реализует операцию матричного произведения.[1] Следующий алгоритм объединяет предыдущие два — здесь мы сначала находим TF для каждого токена, а затем домножаем TF на IDF. Всё просто. Ну, и напоследок — мы масштабируем датасет так, чтобы все элементы матрицы укладывались в диапазон от нуля до единицы. Стандартизация входных весов необходима для стабильной работы многих алгоритмов машинного обучения. Способ стандартизации весов зависит от природы данных. Часто используется приведение к нормальному распределению с мат.ожиданием в нуле и единичной дисперсией. Но такой подход нам здесь не подходит... Потому что у нас матрица разреженная, и если мы сдвинем эту матрицу на её мат.ожидание, то мы получим не разреженную матрицу, и, скорее всего, она у нас для нормального датасета даже в память не влезет. Поэтому мы используем другой способ стандартизации, а именно мин-макс-стандартизацию, то есть мы говорим, что минимально допустимое значение признака в датасете — это 0, а максимально допустимое — это 1. Ну, и напоследок, мы переводим нашу разреженную матрицу в формат, ориентированный на эффективную работу со строками, потому, что алгоритмы машинного обучения, которые мы далее будем использовать, читают документы один за другим и настраивают свои веса, то есть нам нужно уметь эффективно брать отдельный документ. Давайте, например, будем использовать алгоритм TF-IDF. Обращаю ваше внимание, что для векторизации и обучающей, и тестовой выборки, используется один и тот же набор параметров, то есть один и тот же словарь, один и тот же вектор частот и один и тот же режим векторизации.
[1] здесь нужно небольшое исправление: функция multiply реализует поэлементное произведение.
[2] CSR, Compressed Sparse Row matrix (https://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.csr_matrix.html)

К сожалению, у нас пока нет статистики ответов на данный вопрос, но мы работаем над этим.