Видео проигрыватель загружается.Воспроизвести видеоВоспроизвестиБез звукаТекущее время 0:00/Продолжительность 6:23Загрузка: 0.00%0:00Тип потока ОНЛАЙНSeek to live, currently behind liveОНЛАЙНОставшееся время -6:23 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%Стиль края текстаНичегоПоднятыйПониженныйОдинаковыйТеньШрифтПропорциональный без засечекМоноширинный без засечекПропорциональный с засечкамиМоноширинный с засечкамиСлучайныйПисьменныйМалые прописныеСбросить сбросить все найстройки по умолчаниюГотовоЗакрыть модальное окноКонец диалогового окна.
Отлично, токенизировали тексты. Следующий шаг — это построить словарь. Что такое словарь? Словарь — это отображение из строкового представления токена в его номер. Нейросети, да и компьютеры вообще, не умеют работать с текстами, как это делают люди. Для того, чтобы они смогли работать с текстами, нам нужно тексты представить в виде чисел. Поэтому мы нумеруем все токены и затем в датасете строки заменяем на соответствующие им числа. Обращаю ваше внимание, что для построения словаря мы используем только обучающую подвыборку. Словарь мы строим с помощью функции "build_vocabulary", которая описана в нашей маленькой библиотечке. Давайте посмотрим, как же она работает. Эта функция принимает на вход список списков. Внешний список представляет собой датасет, а внутренние списки представляют отдельные документы и элементы внутренних списков — это токены в строковом виде. Кроме того, эта функция принимает дополнительные параметры, смысл которых мы сейчас разберём. Первый шаг при построении словаря — это подсчитать частоты токенов. Частоты мы будем хранить в словаре со значением по умолчанию. Удобная реализация такого словаря есть в стандартной библиотеке python. Здесь мы идём по всем текстам, считаем количество текстов, а также идём по всем токенам в каждом тексте и увеличиваем счётчик в нашем словаре на единицу для каждого словоупотребления. Если у нас большой корпус (и особенно, если мы работаем с N-граммами), то словарь очень быстро разрастается и его размер достигает миллионов, десятков миллионов... Такой словарь, в некотором смысле, бесполезен. Мы хотим всё-таки небольшой словарь. Поэтому, когда мы подсчитали частоты токенов, мы удаляем из словаря те токены, которые мы считаем неинформативными. Стандартный способ удалить неинформативные токены — это отсечение по частоте. Во-первых, мы удаляем совсем редкие токены — это могут быть либо специальные слова, либо опечатки, либо какие-то идентификаторы, случайно встречающиеся в тексте, или не вычищенные из текстов в результате предобработки. Второй критерий для фильтрации — это ограничение частоты сверху. Давайте вспомним распределение Ципфа (оно выглядит примерно так). И то, что мы хотим — это оставить только середину этого распределения, а всё остальное убрать. В хвосте распределения — опечатки и слишком специальные слова, а в голове распределения содержатся союзы, предлоги, местоимения, вопросительные слова. Если рассматривать их ценность в контексте тематической классификации, то они практически бесполезны — они встречаются во всех текстах вне зависимости от тематики. Далее мы сортируем токены по убыванию частоты их встречаемости. Мы делаем это для того, чтобы наиболее часто встречающиеся токены получили наименьшие идентификаторы. Иногда это просто удобно. Кроме того, на этом этапе мы добавляем в список наших токенов фиктивный токен, причём добавляем его мы в начало. Мы делаем это для того, чтобы он получил идентификатор "0". Зачем это нужно — мы подробнее рассмотрим в следующих семинарах, когда начнём использовать свёрточные или рекуррентные нейросети. После фильтрации по количеству словоупотреблений и по относительной частоте у нас всё равно может остаться слишком много слов, поэтому мы добавляем дополнительное ограничение и оставляем только заданное количество наиболее частотных слов. Ну и, напоследок, мы назначаем идентификаторы токенам и строим словарь в виде python dict. Идентификаторы словам назначаются инкрементально, в том порядке, в котором они встречались в списке "sorted word counts". Переменная "word_to_id" — это и есть тот словарь, который мы хотели построить. Но кроме него наша функция возвращает ещё вектор весов — "word_to_frequency". Этот вектор содержит относительные частоты всех токенов в нашем датасете. Этот вектор нам понадобится на этапе формирования матрицы признаков. В этом семинаре, при построении словаря, мы используем следующее ограничение на частоты слов — мы говорим, что токены, встретившиеся менее чем 5 раз в обучающей выборке, нас не интересуют. А ещё мы говорим, что токены, которые встречаются более, чем в 80% документов обучающей выборки нас тоже не интересуют, потому что они слишком частотные. Ну что ж, давайте посмотрим, что у нас получилось. С учётом фильтрации по частоте у нас получилось примерно 20 тысяч уникальных токенов — это достаточно много, на самом деле, для такого датасета. А также, на экране вы видите 10 самых частотных токенов в датасете вместе с их числовыми идентификаторами. Давайте посмотрим на гистограмму относительных частот слов. Правда ли, что закон Ципфа выполняется? Как вы видите, токенов, которые встретились хотя бы в половине документов обучающей выборки — очень мало (кажется, их даже меньше десяти суммарно). Токенов, которые встретились хотя бы в 10% обучающей выборки — побольше, это уже число порядка нескольких сотен. Ну, и мода нашего распределения находится около нуля, то есть большая часть слов (а именно, порядка 10000 уникальных токенов) встречаются менее, чем в 5% процентах документов. Ну что ж, кажется закон Ципфа действительно выполняется.
К сожалению, у нас пока нет статистики ответов на данный вопрос,
но мы работаем над этим.