Как Интернет узнает, какие термины наиболее точно отражают содержание документа? Подсказка: дело не только в громкости
вступление
Уходя корнями в 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