Практические советы по реализации систем извлечения информации

понедельник, декабря 11, 2006

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

Продолжение серии "Введение в text mining".

Перед применением какого-либо алгоритма text mining набор текстовых документов надо преобразовать в более удобный вид. Общепринятым представлением является векторная модель (vector space model). Пусть у нас есть n документов, которые все вместе состоят из m уникальных слов. Каждому документу можно поставить в соответствие вектор d ∈ Rm, такой что di = 1, если слово i содержится в документе, и di = 0 в противном случае. Мы получили самую простую двоичную векторную модель. Как я уже говорил, важным свойством такого представления является разреженность, действительно, m может быть очень большим числом (несколько сотен тысяч), в то время как число единиц в каждом векторе может не превышать нескольких десятков. Это позволяет хранить в памяти не всю матрицу n ∗ m (1 000 000 ∗ 100 000 = 100 000 000 000 бит = 12.5 гигабайт), а лишь очень малую ее часть, обычно около 0.01-0.1%.

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

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

Еще одной техникой препроцессинга, помимо удаления стоп-слов, является стемминг (или лемматизация): выделение значимой части слова. С помощью стемминга слова "телефоны" и "телефона" приведутся к одному слову "телефон", что, помимо улучшения качества работы выбранного алгоритма, еще и значительно сократит словарь (а значит вырастет скорость работы). Хорощий обзор свободно доступных морфологических анализаторов можно найти в статье Губина и Морозова.

Описанная частотная модель, тем не менее, тоже не лишена недостатков. Некоторые слова могут встречаться в почти во всех документах и, соответственно, оказывать малое влияние на принадлежность документа к той или иной категории. Для понижения значимости таких слов используют модель TF∗IDF. TF (term frequency) это отношение числа раз, которое слово t встретилось в документе d, к длину документа. Нормализация длиной документа нужна, чтобы уравнять в правах короткие и длинные (в которых абсолютная встречаемость слов может быть гораздо больше) документы. IDF (inverse document frequency) — это логарифм отношения числа всех документов к числу документов содержащих слово t.
Таким образом, для слов, которые встречаются в большом числе документов IDF будет близок к нулу (если слово встречается во всех документах IDF равен нулю), что помогает выделить важные слова. Коэффициент TF∗IDF равен произведению TF и IDF. TF играет роль повышающего множителя, IDF — понижающего. Соответственно, вместо простой частоты встречаемости элементами векторов-документов будут значения TF∗IDF. Во многих задачах (но не во всех) это позволяет заметно улучшить качество.

4 комментария:

ajvol комментирует...

http://ru.wikipedia.org/wiki/TF-IDF

LB комментирует...

Меня мучает одна мысль. В свое время n-граммы (Salton) активно использовали для индексирования текста. Потом выяснилось, что объемы выросли, и повторяемость n-грамм значительно возрасла. (соответственно. снизилось качество поиска)
И поэтому от n-грамм в full-text отказались. Аналогичная ситуация с некоординатными индексами. Теперь мы почти всегда индексируем позиции слов.
Мне кажется, что TF-IDF или хешированных векторов хватает пока только на относительно небольших объемах и редких ключевых словах. Если добавить склейку синонимов, резко (на порядки) увеличить число классифицируемых документов, то хватит ли традиционных методов, которые преобразует весь документ в один вектор. Может быть сейчас одновекторные технологии уже не слишком хороши? У меня есть ощущение, что многие исследователи уже, как минимум, пытаются разбивать документ на куски. И классифицировать эти куски отдельно. А возможно, что из документа вычленяются все достаточно редкие слова, потом документ разбивают на пересекающиеся части. К каждой такой части "присоединяем" редкие слова всего документа и классифицируем. В результате получаем множество категорий. Или пар (категория, степень доверия). Отбираем категории с наибольшей степенью доверия и ву а ля. Интересно, а какие-нибудь "такие", более хитрые, подходы сейчас разрабатываются?

krondix комментирует...

Мне вот пришел в голову один пример, где многовекторность может быть очень полезна. Новости. Ведь у всех новостей примерно одинаковая семантическая структура:
1. Первый абзац или два — короткий, все самое главное в нескольких предложениях, присутствуют почти все ключевые слова.
2. Далее несколько абзацев — растекание мыслью по древу, возможно отвлеченные рассуждения на тему.
3. Последний абзац или два — связь с глобальным сюжетом.

Например, возьмем любую новость про Литвиненко (раз и два). Первые два абзаца новость, затем всякая фигня, и последние абзацы "Напомним...". Если использовать знание о такой структуре, мне кажется, можно очень легко и точно кластеризовать новости сразу в несколько кластеров: маленький (конкретная новость) и большой (глобальный топик).

Вопрос, конечно же, заключается в другом. Если в новостях структура известна и ее на так сложно распознать в тексте, то как найти такую структуру в произвольном тексте? Есть ощущение, что тут надо действовать методами схожими с алгоритмом EM (expectation maximization), то есть искать генерирующее распределение, но не для документов, а для их структуры.

Unknown комментирует...

Добрый день,

Не могли бы Вы подсказать, как можно хранить суффиксные деревья в базе данных (или возможно Вы могли бы подсказать, где эту информацию можно найти)