[МУЗЫКА]
[МУЗЫКА] Анализ
текстов на естественном языке (то, что по-английски
Natural Language Processing или сокращенно NLP) — важное направление анализа данных.
Приведем пример типичных задач: классификация,
определение категории текста, кластеризация,
группировка текста по семантически схожим группам.
Многие алгоритмы анализа данных оперируют векторами фиксированной длины.
Соответственно, нам нужно перевести текст в вектор.
При этом возникают типичные проблемы с разреженностью данных.
В этом видео мы опишем самый простой и самый классический
способ преобразования текстовых данных в набор векторов, который называется TF-IDF.
Сначала остановимся на некоторых допущениях.
Будем рассматривать текст как мешок слов.
То есть игнорировать порядок следования слов в тексте.
Будем учитывать, сколько раз данное слово встречается в тексте.
Перед началом работы с текстом его нужно каким-то образом обработать.
Первый этап — это токенизация, то есть выделение слов в тексте.
На первый взгляд данный подход может показаться простым,
но на практике очень часто возникают проблемы, связанные с переносом текста,
с наличием гиперссылок в нем,
наличием e-mail адресов и других текстовых конструкций.
Например, «Миша, который встретил Машу».
В данном тексте мы выделили четыре слова, игнорируя запятые.
Далее нам нужно избавиться от проблем флективности.
В данной модели нам удобнее разные
склонения одного слова считать за одно и то же слово.
Существую два подхода: стемминг, который основан на выделении основ слова,
и лемматизация, которая переводит слово в некоторую нормальную форму.
В случае существительного нормальная форма — это именительный падеж,
единственное число.
Стемминг проще и работает на основе правил словообразования.
Лемматизация сложнее.
Более того, не всегда понятно,
как однозначно определить для какого-нибудь слова его нормальную форму.
Иногда это зависит от контекста.
Например, «машу» — это глагол или существительное?
В данном примере мы проведем лемматизацию.
В целом,
для трансформации текста в рамках нашей модели мы рассмотрим несколько подходов.
TF-IDF, который мы опишем дальше, и его модификации, Hashing trick.
Чаще всего это заканчивается понижением размерности,
которую мы также осветим в рамках видео нашего курса.
Итак, продемонстрируем работу TF-IDF на примере.
Пусть у нас имеется коллекция документов, которая состоит из четырех штук.
И пусть в этой коллекции всего пять различных слов.
Допустим, что мы эти все слова уже обработали.
Далее для каждого слова посчитаем, сколько раз оно встречается в тексте,
и обозначим данную величину f(wi, d).
Результаты приведены в таблице.
В целом,
мы уже научились для каждого слова сопоставлять некоторый численный вектор.
Однако мы рискуем получить крайне плохие результаты в этом случае,
так как каждая величина f(wi, d) имеет
смысл только в контексте текста конкретного документа.
А документы, например, могут иметь разную длину.
На основе посчитанных значений введем еще одну характеристику.
tf(wi, d), которая называется term frequency.
Она может быть посчитана разными способами и
характеризовать значимость слова в конкретном документе.
Интуитивно понятно, что чем чаще слово встречается в тексте, тем оно важнее.
Самый простой вариант — это бинарный признак.
То есть присутствует ли данное слово в документе или нет.
И в этом случае нам не важна частота встречаемости данного слова в документе.
Далее мы можем использовать просто число слов.
Эту же величину можно нормализовать,
чтобы сумма элементов вектора была равна единице.
И последний вариант: нормализация по самому популярному слову в документе.
В этом случае максимальное значение tf(wi,
d) будет у тех слов, которые чаще всего встречаются в документе.
На практике данных слов может быть более одного.
Отметим, что если взять текст документа и добавить его в конец самого себя,
то есть раздвоить, то значение нормализованных величин не изменится.
Для простоты будем использовать второй вариант.
Полученные результаты можно использовать для превращения текста в численные
векторы, но в таком случае самый большой вес будет у «мусорных» слов
или так называемых «стоп-слов» (это общие глаголы, предлоги и тому подобное),
наличие которых не придает смысл текстовому содержимому.
В связи с этим нам нужно ввести дополнительную характеристику,
которая бы учитывала популярность данного слова во всей коллекции.
Это позволило бы нам уменьшить вес «мусорных» слов.
Сперва посчитаем, в скольки документах встречается каждое слово.
Назовем эту характеристику document frequency.
Далее посчитаем обратную величину и сгладим ее с помощью
логарифма с некоторым сдвигом так, чтобы значение слов,
которые встречаются во всех документах, было единица, а значение слов,
которые не встречаются в нашей коллекции, также было бы определено.
Это будет полезно в случае,
если мы будем добавлять новые документы в нашу коллекцию.
Полученную величину назовем idf (или по-английски inverted document frequency).
Таким образом, чем больше idf,
тем отчетливее слово определяет конкретную тематику в нашей коллекции.
Отметим, что это не единственный способ вычисления величины idf.
Для каждого слова и документа вычислим непосредственно значение tf-idf,
перемножив term frequency и inverted document frequency.
Значение tf-idf можно нормализовать, чтобы каждому
документу сопоставлялся вектор евклидовой длины единица.
В итоге мы выполнили нашу задачу.
Данный поход — достаточно простой и в то же время эффективный,
но имеет ряд недостатков.
В первую очередь, это разрастание словаря, связанное с увеличением коллекции.
Далее могут появиться искажения, связанные с размерами документов.
И, наконец, сама концепция back of words имеет существенные недостатки,
так как не рассматривается порядок следования слов в тексте.
Для исправления этого недостатка используют более сложные модели,
например, такие как тематические модели или векторное представление слов.