Перейти к основному содержимому

Представление текстовых данных

Рассмотрим задачу обработки текстовых документов из некоторого корпуса текстов. Эта задача часто возникает на практике, например, в следующих задачах:

  • классификация новостей;

  • фильтрация спама в почте;

  • анализ тональности в пользовательских отзывах на товар или компанию;

  • определение ожидаемой зарплаты по тексту резюме

и т.д.

Сложность задачи заключается в том, что документы же представляют собой последовательности дискретных объектов (слов), и могут иметь переменную длину.

Рассмотрим основные этапы обработки текста для кодирования документов векторами вещественных чисел фиксированной длины, пригодном для их последующей обработки алгоритмами классического машинного обучения.

Нормализация и очистка текста

Приведение к нижнему регистру

Приведение всех символов к нижнему регистру позволяет объединить разные варианты одного и того же слова («Дом» и «дом», «Страны» и «страны» и т.д.).

Это полезно, поскольку сужает круг уникальных слов, упрощая признаковое пространство и облегчая настройку моделей. Такое преобразование имеет смысл в большинстве случаев, когда регистр не несёт смысловой нагрузки (новости, письма, диалоги). Однако в ряде приложений регистр важен, и это преобразование может привести к потере информации, например, при классификации эмоций, распознавании именованных сущностей и анализе программного кода.

Удаление стоп-слов

Стоп-слова — служебные слова языка, такие как

  • союзы («и», «но», «или», «что», «потому что»),

  • предлоги («в», «на», «под», «над», «из», «к»),

  • частицы («бы», «же», «ли», «ведь», «то»),

  • местоимения («я», «ты», «он», «она», «они», «кто», «что»),

которые не несут содержательной информации.

Их полезно отбрасывать из текста, поскольку такие слова встречаются очень часто и своим влиянием задавливают влияние более редких, но более содержательных терминов.

Фильтровать стоп слова можно по известным словарям стоп-слов для каждого языка, а также на основе статистических критериев, удаляя, например, слова, которые встречаются равномерно часто во всех документах.

В ряде задач, однако, некоторые стоп-слова несут информацию и их удалять не нужно:

  • в анализе тональности нельзя удалять предлог «не», поскольку он несёт информацию об отношении («мне фильм понравился» / «мне фильм не понравился»);

  • в распознавании именованных сущностей нельзя удалять местоимения, которые могут относиться к извлекаемым объектам;

  • при использования синтаксического разбора предложений оказываются важными все стоп-слова.

Удаление слов частоте

Стандартной практикой при обработке документов является фильтрация всех слов, которые слишком часто и слишком редко встретились в коллекции документов.

Слишком частые слова, скорее всего являются неучтёнными стоп-словами, которые не несут дополнительной информации.

А учёту слишком редких слов модель машинного обучения всё равно не сможет адекватно обучиться из-за малого числа примеров их употребления. Имеет смысл удалять слова, которые встретились реже 3-5 раз во всех документах, что существенно сокращает словарь используемых слов и длину признакового описания документов.

Обработка пунктуации

Знаки препинания могут удаляться или учитываться как отдельные токены в зависимости от задачи. При анализе общего смысла и тематики текстов текстов пунктуация обычно не важна. Но она становится важна при анализе тональности, эмоций и авторского стиля текста.

Стемминг и лемматизация

Слова в языке употребляются в различных словоформах в зависимости от падежа,

числа, рода, времени и других характеристик. Например, одному и тому же глаголу "читать" отвечает много словоформ: читаю, читаешь, читает, читаем, читаете, читают и т.д.

Нормализация слов приводит одинаковые форму одного и того же слова к единому токену. Это позволяет существенно уменьшить размер словаря уникальных токенов и упростить модель.

Существует два подхода нормализации - стемминг и лемматизация.

Стемминг — это алгоритмическое усечение слова до его основы (стема). Например, слова "читаю", "читаешь", "читает", "читаем", "читаете", "читают" будут усечены до единой основы "чит". Однако алгоритмы стемминга агрессивно усекают различающиеся окончания слов, что может привести к тому, что и другие слова преобразуются в тот же стем, например, слово "читатель", что приведёт к потере информации.

Лемматизация заключается приведение слова к нормальной форме по словарю. Она, в отличие от стемминга, сохраняет смысл слов, например, «читаю» переведётся в «читать», а «читатели» переведётся в «читатель». Для более точной лемматизации в английском языке может потребоваться предварительное сопоставление каждому слову его части речи.

Примеры:

контекстсловолемма
I saw a bird.sawsee
This saw cuts poorly.sawsaw
The tree has green leaves.leavesleaf
He leaves home at 6 PM.leavesleave

Представление документа в виде вектора признаков

В классическом машинном обучении используется предположение мешка слов (bag-of words assumption), согласно которому каждый документ рассматривается как множество слов без учёта их порядка. Это является очевидным упрощением, поскольку, например, следующие два разных по смыслу предложения будут состоять из одного множества слов:

  • Мне фильм не понравился, пропущу продолжение.

  • Мне фильм понравился, продолжение не пропущу.

Однако оно позволяет эффективно закодировать документы разной длины вещественными векторами фиксированного размера и поэтому часто используется на практике.

Пусть:

  • VV - словарь всех токенов размера DD,
  • dd - документ,
  • ndin_{di} - число вхождений ii-го слова wiw_i в документ dd,
  • ndn_d - длина документа dd,
  • NiN_i - число документов, содержащих ii-ое слово словаря хотя бы раз,
  • NN - общее число документов в коллекции.

Документ представляется вектором

x=[x1,x2,...xD],\mathbf{x} = [x_1, x_2,...x_D],

где xix_i определяет степень представленности ii-го слова словаря в документе, которое может быть различным.

Бинарное кодирование

В бинарном кодировании (binary representation) xi=I{id}x_i=\mathbb{I}\{i\in d\}, то есть фиксируется только наличие слова wiw_i в документе независимо от его количества встречаемости.

TF-кодирование

В TF-кодировании (term frequency, TF-encoding) учитывается счётчик или частота слова в документе. Простейшая форма — это счётчик встречаемости слова в документе:

xi=ndix_i = n_{di}

Чтобы уменьшить влияние очень частых слов, иногда применяют логарифмическое масштабирование частоты:

xi=log(1+ndi)x_i = \log(1 + n_{di})

Для сопоставимости документов разной длины используют не счётчик, а частоту слова в документе:

xi=ndindx_i = \frac{n_{di}}{n_d}

TF-IDF-кодирование

TF‑IDF кодирование (TF-IDF encoding) является перемасштабированным TF-представлением документа на величины IDFi\mathrm{IDF}_i (inverted document frequency) для каждого слова wiw_i словаря.

В TF‑IDF каждая компонента вектора получается как произведение TF на IDF:

xi=TF-IDFd,i=TFd,iIDFi,x_i = \mathrm{TF\textnormal{-}IDF}_{d,i} = \mathrm{TF}_{d,i} \cdot \mathrm{IDF}_i,

где

  • TFd,i\mathrm{TF}_{d,i} отражает степень представленности слова wiw_i в рассматриваемом документе dd,.
  • IDFi\mathrm{IDF}_i отражает редкость слова wiw_i в коллекции документов, снижая вес часто встречающихся слов и усиливая значение редких, а следовательно и более информативных слов.

Простейший базовый вариант IDFi\mathrm{IDF}_i считается по формуле

IDFi=NNi,\mathrm{IDF}_i = \frac{N}{N_i},

откуда видно, что чем реже слово встречается в документах, тем выше его IDF. Недостаток этого подхода заключается в том, что значения IDF будут оказываться слишком большими для редких слов, поэтому чаще применяется его логарифмированный вариант:

IDFi=logNNi.\mathrm{IDF}_i = \log \frac{N}{N_i}.

Это стандартный вариант IDF, используемый в большинстве практических систем.

Также существует сглаженный вариант IDF, использованный в поисковой системе BM25 [1]:

IDFi=logNNi+0.5Ni+0.5.\mathrm{IDF}_i = \log \frac{N - N_i + 0.5}{N_i + 0.5}.

Добавление 0.5 в знаменателе предотвращает деление на ноль, а в числителе выравнивает значения IDF по всем словам.

Представление данных

Бинарное, TF и TF-IDF представление оказываются очень разреженными (sparse), поскольку даже длинные документы содержат лишь малую часть всех уникальных слов языка. Поэтому для эффективного хранения таких признаковых описаний используются разреженные матрицы (sparse matrices), которые хранят лишь ненулевые элементы. Для обработки используются алгоритмы, поддерживающие работу с разреженными данными, такие как линейные модели в scikit-learn [2].

Дополнительно о способах кодирования документов в виде TF и TF-IDF представлений вы можете прочитать в [3].

N-граммы слов

N-граммой слов называют последовательность из NN подряд идущих слов в предложении. Если N=2N=2, то такую последовательность называют биграммой, а если N=3N=3, то триграммой.

Например, в предложении «машина быстро набирает скорость» можно выделить биграммы «машина быстро», «быстро набирает», «набирает скорость» и триграммы «машина быстро набирает», «быстро набирает скорость».

N-граммы фиксируют локальную структуру языка, позволяя модели учитывать контекст, который не отражён в отдельных словах.

Например, выражение «машинное обучение» как единый признак более информативно, чем информация о встрече отдельных слов «машинное» и «обучение».

Поэтому стандартное TF или TF-IDF представление документа на уровне слов имеет смысл дополнить TF или TF-IDF представлением составляющих его N-грамм.

Вычислительные соображения

Уникальных слов языка, что мы ранее обозначали как DD, уже достаточно много - несколько десятков или даже сотен тысяч. Добавление N-грамм существенно увеличивает словарь, поэтому если они и используются, то чаще только на уровне биграмм. Причём рассматриваются не все возможные биграммы (которых D2D^2), а лишь те, которые реально встречались в обучающем корпусе текстов. Их существенно меньше, поскольку не все пары слов сочетаются в языке. Но этих биграмм оказывается достаточно много.

Разумным компромиссом является учёт не всех встреченных биграмм, а только коллокаций (collocation), то есть устойчивых словосочетаний, которые встречаются чаще, чем можно было бы ожидать при случайном совместном появлении отдельных слов.

Примеры коллокаций: искусственный интеллект, машинное обучение, держать слово, бить баклуши, Российская Федерация.

Популярным подходом для извлечения коллокаций является мера взаимной информации PMI (pointwise mutual information) [4], вычисляемая для пары слов (wi,wj)(w_i,w_j) по правилу

PMI(wi,wj)=P(wiwj)P(wi)P(wj),\mathrm{PMI}(w_i,w_j)=\frac{P(w_iw_j)}{P(w_i)P(w_j)},

где

  • P(wiwj)P(w_iw_j) - частота встречи слова wjw_j сразу после wiw_i в корпусе текстов;

  • P(wi),  P(wj)P(w_i),\;P(w_j) - частоты встреч слов wiw_i и wjw_j по отдельности.

По сути в PMI оценивается отношение фактической вероятности появления слова wjw_j сразу после wiw_i к P(wi)P(wj)P(w_i)P(w_j), отражающей вероятность встречи слова wjw_j сразу после wiw_i при гипотезе их независимого появления. Чем выше это отношение, тем более неслучайно появление jj-го слова сразу за ii-м и тем больше оснований считать эту пару коллокацией.

Особенность использования на практике

Отношение вероятностей в мере PMI ведёт себя нестабильно для редких слов. Например, два редких слова могли встретиться единожды в тексте, причём сразу друг за другом. Чтобы исключить включение в коллокации такие случайные совпадения необходимо дополнительно потребовать, чтобы сама пара слов была достаточно распространена.

N-граммы символов

Иногда TF/TF-IDF представление документов на уровне слов имеет смысл дополнить/заменить TF/TF-IDF представлением на уровне N-грамм символом.

Пример разбиения фразы "мама мыла раму" на триграммы тремя способами:

режимтриграммы
вся строка (включая пробелы)мам, ама, ма␣, а␣м, ␣мы, мыл, ыла, ла␣, а␣р, ␣ра, рам, аму
только внутри слов без перехода через пробелмам, ама, мыл, ыла, рам, аму
только внутри слов с учётом границ слова<ма, мам, ама, ма>, <мы, мыл, ыла, ла>, <ра, рам, аму, му>

Учитывать N-граммы символов имеет смысл при обработке текстов с опечатками, а также со сложными составными терминами, например, в биомедицинской, химической или технической терминологии (триметиламин, дезоксирибонуклеиновая кислота, сердечно-сосудистая система). Также именно на уровне N-грамм символов умеет смысл обработка нерегулярных текстов, включая URL, электронную почту, лог-файлы, имена файлов, коды программ, где обработка на уровне слов бессмысленна.

Токены

Как мы выяснили, текст можно обрабатывать не только на уровне слов, но также и на уровне составляющих его N-грамм слов и символов. Объекты, на уровне которых текст идёт обработка текста называются токенами, а разбиение текста на эти объекты - токенизацией.

Мы рассмотрели базовые методы представления текстов в виде вещественных векторов фиксированного размера для классических методов машинного обучения, которые обладают интерпретируемостью, простотой настройки и высокой скоростью работы. Если же позволяют вычислительные ресурсы, то можно использовать более продвинутые нейросетевые методы обработки текстов, которым посвящена вторая часть учебника. В нейросетях текст также разбивается на токены, каждый из которых описывается настраиваемым вещественным вектором фиксированного размера, называемым эмбеддингом.

Литература

  1. Wikipedia: Okapi BM25.
  2. Документация sklearn: Linear Models.
  3. Wikipedia: tf–idf.
  4. Wikipedia: Pointwise mutual information.