Сравните реализацию с TfidfVectorizer из Scikit-Learn

Это третий пост из серии руководств по НЛП. Это руководство позволит вам шаг за шагом понять, как реализовать TF-IDF с нуля, и сравнить полученные результаты с уже реализованным TfidfVectorizer в Scikit-learn.

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

Один из них - Term Frequency-Inverse Document Frequency, также называемый TF-IDF. Такое длинное название может показаться пугающим, но идея такого подхода проста. Это метод, используемый для количественной оценки важности слов в документе и в наборе документов одновременно.

В самом деле, есть много общих слов, таких как «the», «is», «I», которые часто встречаются в предложениях, но не вносят существенного вклада в передачу информации. Если бы мы смотрели только на частоту употребления терминов, эти слова казались бы более важными, чем другие слова. По этой причине TF-IDF вводится, чтобы иметь более надежные функции в наборе данных.

Содержание:

Стандартный TF-IDF

Его можно получить, объединив два термина:

где Term Frequency (TF) - это частота слова t в документе d. Другими словами, это соотношение между количеством слов в документе и общим количеством слов:

Как мы уже говорили ранее, одной частоты недостаточно для обеспечения эффективных мер. Нам также нужно объединить его с другим термином, который называется Частота обратного документа. Это логарифмическое преобразование дроби, рассчитываемой как общее количество документов в корпусе, деленное на количество документов, содержащих это слово.

Лучше точно сказать, что логарифм находится в базе 10, в то время как в Sci-Kit learn учитывается натуральный логарифм при реализации

Sklearn TF-IDF

В предыдущем абзаце было введено стандартное определение TF-IDF. Теперь я покажу, чем TfidfTransformer и TfidfVectorizer, которые tf-idfs вычисляются в sklearn, отличаются от стандартного метода:

Вы можете легко заметить, что в sklearn версии IDF добавляется 1 как к числителю, так и к знаменателю, чтобы избежать деления на ноль. Кроме того, к члену логарифма добавляется константа, равная 1.

Например, если у нас есть n=3 документы и df(t)=3, что подразумевает, что слово встречается во всех документах, IDF (t) равен ln((1+3)/(1+3))+1 = 1 в соответствии с определением Scikit-learn, а IDF(t) = log10(3/3) = 0 в стандартном случае.

После расчета показателей TF и ​​IDF мы наконец можем получить векторы TF-IDF по формуле:

После нормализации полученных векторов TF-IDF с помощью евклидовой нормы:

Например, учитывая вектор необработанных tf-idfs v = [0.06, 0.06,0.022,0.022], мы применяем норму L2, получая TF-IDF для первого документа:

Быстрый пример

Давайте рассмотрим простой пример, чтобы понять ранее объясненные концепции. Нам будет интересно проанализировать обзоры на Game of Thrones:

Обзор 1: Игра престолов - потрясающий сериал!

Обзор 2: Игра престолов - лучший сериал!

Обзор 3: "Игра престолов" просто великолепна.

В таблице я показываю все расчеты для получения TF-IDF, следуя подходу Sklearn.

Понятно, что самые распространенные слова, такие как «игра», «из», «троны», «есть», имеют наименьший IDF, 1, что означает, что они будут иметь низкий вес около 0,3.

С другой стороны, такие термины, как «потрясающий» и «отличный», имеют более высокие значения TF-IDF, поскольку каждое из этих слов присутствует только в одном обзоре.

Более того, общие слова, такие как «так» и «этот», также вносят больший вклад, поскольку они присутствуют не во всех предложениях, и мы не удалили стоп-слова, чтобы сделать подход как можно более простым.

Реализация с Python

Самая важная часть урока начинается сейчас. Давайте импортируем библиотеки:

Мы можем увидеть обзоры, рассмотренные в примере выше:

В TF-IDF знаки препинания не учитываются, поэтому их необходимо удалить. Кроме того, мы преобразуем строку в список, чтобы легко применить процедуру.

Мы также хотим получить список уникальных слов, учитывая эти три списка:

Первый шаг - получить оценку частоты использования для каждого слова в документе:

Результаты оценки TF следующие:

Теперь мы хотим вычислить IDF, следуя подходу Sklearn:

Наконец, мы можем получить значения IDF, показанные ранее в таблице:

Последнее и самое важное, что осталось - это набрать показатель TF-IDF для каждого слова и каждого документа. Эти надежные меры получаются путем умножения значений TF и ​​IDF.

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

Сравнение с Scikit-Learn

На этом этапе мы можем применить непосредственно TfidfVectorizer, реализованный Scikit-Learn:

Те же результаты были достигнуты с меньшим количеством строк кода! Разве это не потрясающе?

Последние мысли

Надеюсь, вы нашли этот урок полезным, чтобы понять, как работает TF-IDF. Сначала у меня были проблемы с пониманием того, почему стандартный метод и результаты Sklearn отличаются.

После того, как я лучше ознакомился с документацией TfidfVectorizer, кодом GitHub, я понял, что в подходе есть некоторые изменения. И вуаля. Конечно, есть и другие модификации, которые нужно добавить.

Например, убрать стоп-слова, рекомендую это сделать. Функция TfidfVectorizer также имеет множество аргументов для изменения способа получения значений TF-IDF. Пожалуйста, проверьте документацию. Код GitHub находится здесь. Спасибо за прочтение. Хорошего дня!