Как Интернет узнает, какие термины наиболее точно отражают содержание документа? Подсказка: дело не только в громкости

вступление

Уходя корнями в 1950-е годы, TF-IDF является краеугольным камнем для современных приложений, которые пытаются определить релевантность каждого слова в документе. На первый взгляд, можно было бы использовать простой подход, рассматривая количество слов или количество терминов (т. е. «сколько раз появлялся каждый термин?»). TF-IDF делает большой шаг вперед; учитывается не толькообъем, но и показатель релевантности. Подробнее об этом чуть позже.

Вывод по разделам: самые важные термины в документе не всегда появляются чаще всего.

цель

Проще говоря, TF-IDF существует для обеспечения лучшей приоритизации терминов. Если я напишу 1000 слов, как поисковик воспримет мою статью? Если я употребил слово «и» 100 раз, так ли охарактеризована моя статья? Каждый раз, когда кто-то вводит «и» в строку поиска, появляется моя статья?

Если у вас есть некоторый базовый опыт НЛП, вы можете сказать, что удалили бы стоп-слова; справедливо, *стоп-слова удалены*, а что, если «данные» — следующий по частоте термин? Хотя это может отделить документ от некоторых, он по-прежнему носит очень общий характер… Суть самой темы может быть затемнена, и в результате статья может быть не найдена, когда она будет считаться.

Я имел в виду TF-IDF как показатель релевантности, но, возможно, лучший способ описать IDF в TF-IDF — это то, что он позволяет нам идентифицировать новизна.

Метод

Если вы не знакомы с некоторыми основами НЛП, такими как набор слов, стоп-слова и т. д., я бы сделал паузу и ознакомился с вами, прежде чем двигаться дальше.

Теперь, когда мы говорим о стоп-словах; мы говорим о «моих», «этих», «и», «это», «для» и многих других. То, что эти слова часто составляют по объему, им не хватает… как вы уже догадались, релевантности.

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

Теперь… у нас достаточно концептуальной идеи, чтобы ее обдумать… давайте разберем формулу.

Вывод по разделам: очень легко стереть релевантные термины, когда нас интересует только объем

Давайте сломаем это

Мы разделим концепцию на две очевидные части: TF — Частота терминов и IDF — Обратная частота документов.

Срок Частота

Это именно то, на что это похоже... из всех слов в нашем документе... какой процент от них составляет данный термин (данный термин является нашим *интересующим термином*)?

Формула

tf = # of times the term occurs in our document of interest / # of total words in our document of interest

Обратная частота документа

Здесь все становится немного сложнее, так что дайте мне минутку.

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

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

Формула

idf = log(# of documents / (# of documents that contain the term of interest)

Время кодировать

Домашнее хозяйство

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

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd

Сбор данных

Затем я взял первый абзац о Марсе, Нептуне и Сатурне из Википедии и создал наш корпус из этих документов, разбив их на отдельные элементы списка по предложениям.

docs = "Saturn is the sixth planet from the Sun and the second-largest in the Solar System after Jupiter", "It is a gas giant with an average radius of about nine", "Mars is the fourth planet from the Sun and the second-smallest planet in the Solar System being larger than only Mercury", "In English Mars carries the name of the Roman god of war", "Neptune is the eighth and farthest-known Solar planet from the Sun", "In the Solar System it is the fourth-largest planet by diameter the third-most-massive planet and the densest giant planet", "It is 17 times the mass of Earth and slightly more massive than its near-twin Uranus"
# sources (https://en.wikipedia.org/wiki/Neptune)
(https://en.wikipedia.org/wiki/Saturn)
(https://en.wikipedia.org/wiki/Mars)

Моделирование

Подобно любым заурядным алгоритмам sklearn, вам нужно создать экземпляр модели:

tfIdfVectorizer=TfidfVectorizer(use_idf=True)

После этого мы просто подгоним модель под наш список документов:

tfIdf = tfIdfVectorizer.fit_transform(docs)

Выход

Отсюда давайте подготовим наш вывод.

Теперь мы преобразуем нашу матрицу scipy в фрейм данных.

output = pd.DataFrame(tfidf[0].T.todense(), index=vectorizer.get_feature_names(), columns=["tfidf"])

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

output = output.sort_values('tfidf', ascending=False)

Здесь интересно отметить, что такие термины, как «Нептун» и «планета», занимают далеко не последнее место в списке. Причина здесь может заключаться в том, что распространенность или частота термина дает компоненту IDF расчета очень низкую меру.

Заключение

Я надеюсь, что это был полезный ускоренный курс по TF-IDF.

За короткое время мы рассмотрели следующее о TF-IDF:

  • краткий обзор его истории
  • его цель и вариант использования
  • разбивка частоты терминов и обратной частоты документов
  • реализация кода tf-idf в некоторых документах википедии

Надеюсь, вам понравился этот пост и он поможет вам в вашей работе! Поделитесь, что получилось, а что нет!

Не стесняйтесь проверить некоторые из моих других сообщений на datasciencelessons.com