Сравните реализацию с TfidfVectorizer из Scikit-Learn
Это третий пост из серии руководств по НЛП. Это руководство позволит вам шаг за шагом понять, как реализовать TF-IDF с нуля, и сравнить полученные результаты с уже реализованным TfidfVectorizer в Scikit-learn.
Модели, которые работают с огромными объемами текста для классификации, распознавания речи или перевода, нуждаются в дополнительном шаге для обработки этих типов данных. Текстовые данные нужно преобразовать во что-то другое, в числа, понятные компьютеру. Существует множество способов создания новых функций с использованием таких данных.
Один из них - Term Frequency-Inverse Document Frequency, также называемый TF-IDF. Такое длинное название может показаться пугающим, но идея такого подхода проста. Это метод, используемый для количественной оценки важности слов в документе и в наборе документов одновременно.
В самом деле, есть много общих слов, таких как «the», «is», «I», которые часто встречаются в предложениях, но не вносят существенного вклада в передачу информации. Если бы мы смотрели только на частоту употребления терминов, эти слова казались бы более важными, чем другие слова. По этой причине TF-IDF вводится, чтобы иметь более надежные функции в наборе данных.
Содержание:
- Стандартный TF-IDF
- Sklearn TF-IDF
- Быстрый пример
- Реализация на Python
- Сравнение с Scikit-Learn
Стандартный 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 находится здесь. Спасибо за прочтение. Хорошего дня!