Давайте обсудим, какие преобразования имеет смысл совершать с текстом, перед тем как извлекать из него признаки и строить какие-то модели. В частности, мы поговорим о двух важных этапах обработки текста: о токенизации и нормализации. Суть токенизации в том, чтобы разбить текст, то есть просто длинную строчку, на отдельные слова, с которыми уже можно работать. А нормализация — это приведение каждого отдельного слова к его начальной форме. Зачем это нужно, мы поговорим чуть позже в этом видео. Начнем с токенизации. Как я уже сказал, смысл токенизации в том, чтобы разбить строку, непрерывную строку, на отдельные слова. Давайте разберем это на простом примере. Есть некоторый текст из Википедии, который объясняет, что такое текст. Видно, что он состоит не только из букв, но при этом из каких-то символов, скобок, кавычек, есть некое тире. Кажется логичным удалить все эти символы, удалить все, что не является буквами или цифрами. Благодаря этому, если мы заменим все эти символы на пробелы, то дальше все слова, которые отделены пробелами, можно уже объявить отдельными токенами. Но при этом, как всегда, возникает много нюансов. Например, есть слово «каком-либо». Если мы заменим дефис на пробел, то окажется, что у нас есть два слова: «каком» и «либо». Но на самом деле это одно слово, и было бы правильней не разделять их. Итак, токенизация состоит из нескольких этапов. В первую очередь, как правило, текст приводится к нижнему регистру, но при этом опять же мы можем потерять из-за этого некоторую информацию, например три буквы «О», если они написаны в верхнем регистре, то это, скорее всего, сокращение — «общество с ограниченной ответственностью». Если это три маленькие буквы «о», то, возможно, это просто некое выражение эмоций. И непонятно, как здесь правильно поступать: приводить все к нижнему регистру или нет. Следующий этап — это замена всех знаков препинания на пробелы. И опять же есть много нюансов. Во-первых, как мы уже обсудили, если есть сложные составные слова, то заменять в них дефис на пробел не очень разумно — из-за этого может потеряться смысл этого слова. Также удалять знаки препинания может быть плохо, потому что мы потеряем все смайлики, но они играют очень большую роль. Например, если мы анализируем твиты или записи в соцсетях, смайлы в них очень информативны — по ним можно, например, определить эмоциональный окрас этого текста. После того как мы каким-то образом разделили слова, мы объявляем каждое слово, которое отделено пробелами, отдельным словом. Но при этом опять же здесь есть тонкости, например, названия городов: «Нижний Новгород». Было бы логично рассматривать эти два слова как одно. Или, например, сокращения: «кандидат технических наук» сокращается как «к.т.н.». И если мы объявим эти три буквы отдельными словами, то знание о том, что в тексте есть буква «к», буква «т» и буква «н», совершенно не поможет нам решить задачу. Но если же мы будем рассматривать их вместе, то это вполне полезный термин. Также стоит отметить, что токенизация не всегда устроена так просто. В некоторых языках, например в китайском, пробелы ставить не принято, предложение — это непрерывный набор иероглифов. И чтобы разделить такое предложение на отдельные слова, нужно применять специальные алгоритмы — так называемые алгоритмы сегментации текста, которые по некоторым правилам находят разделители в этом тексте. Следующий этап, после того как мы разбили текст на отдельные слова — это нормализация слов, то есть приведение каждого слова к его начальной форме. Например, слово «машинное» нужно привести к форме «машинный», слово «шел» к форме «идти», к его начальной форме. Обычно это нужно из-за того, что то, какая именно форма у слова, не несет в себе большой роли: «машинная» или «машинный» — и так, и так смысл понятен. Но при этом нередко встречаются задачи на текстах, в которых данных не очень много, и хотелось бы, чтобы признаков было как можно меньше. Поскольку число признаков, как правило, напрямую зависит от количества различных слов, было бы здорово сократить это самое количество различных слов. И приведение слов к нормальной форме хорошо позволяет это сделать. К нормализации есть два основных подхода: это стемминг и лемматизация. Давайте поговорим о них подробнее. Самый простой подход — это стемминг, и его суть состоит в том, что слова «стригутся». По некоторым правилам от каждого слова отрезается его окончание. К сожалению, этот подход не всегда работает — например, некоторые слова, когда меняется форма, меняются целиком, скажем у слова «есть» его прошедшее и будущее время — это «был» и «будет». Понятно, что сколько бы букв с конца вы не отрезали, вы не получите из этих трех слов одно и то же в результате стемминга. Поэтому иногда пользуются более сложным, более грамотным подходом, который называется лемматизацией. Лемматизация работает следующим образом: в его основе лежит словарь, в котором уже записано большое количество слов и их форм, и в первую очередь слово проверяется по словарю. И если оно там есть, то понятно, в какой начальной форме оно приводится. Если слова нет, то по определенному алгоритму выводится способ изменения данного слова, и на основе этого способа уже делаются выводы, какие начальные формы могут быть у этого слова. Этот подход работает лучше, и он подходит для новых, неизвестных слов, но при этом, поскольку он сложнее, он работает гораздо медленнее, чем стемминг. Итак, мы обсудили, что предобработка текстов состоит из токенизации — разбиения текста на слова, и нормализации — приведения слов к начальной форме. При токенизации может быть много нюансов и всегда имеет смысл учитывать особенности задачи, и на основе постановки уже принимать решение: приводить слова к нижнему регистру или нет, удалять знаки препинания или нет и так далее. К нормализации мы обсудили два различных подхода — стемминг и лемматизацию — и сказали, что лемматизация работает лучше, но при этом гораздо медленнее. А в следующем видео мы поговорим о том, как извлекать признаки из предобработанного текста.