TF-IDF - это просто способ измерить важность токенов в тексте; это просто очень распространенный способ превратить документ в список чисел (термин вектор, который обеспечивает один край угла, от которого вы получаете косинус).
Чтобы вычислить косинусное сходство, вам нужны два вектора документа; векторы представляют каждый уникальный термин с индексом, и значение в этом индексе является некоторым показателем того, насколько этот термин важен для документа и для общей концепции сходства документов в целом.
Вы можете просто посчитать, сколько раз каждый термин встречается в документе ( T erm F Реквенсия), и использовать этот целочисленный результат для оценки термина в векторе, но результаты не будут очень хорошими. Чрезвычайно общие термины (такие как «есть», «и» и «the») могут привести к тому, что многие документы будут похожи друг на друга. (Эти конкретные примеры могут быть обработаны с использованием списка стоп-слов , но другие общие термины, которые не являются достаточно общими, чтобы считаться стоп-словом, вызывают проблему такого же рода. В Stackoverflow слово «вопрос» может падать в эту категорию. Если бы вы анализировали кулинарные рецепты, вы, вероятно, столкнулись бы с проблемами со словом «яйцо».)
TF-IDF регулирует частоту необработанных терминов, принимая во внимание частоту встречаемости каждого слагаемого в целом (реквизит D F ). I nverse D ocument F обычно это журнал количества документов, разделенный на количество документов, в которых встречается термин (изображение из Википедии):
![IDF, credit to wikipedia](https://i.stack.imgur.com/jbaud.png)
Думайте о «бревне» как о незначительном нюансе, который помогает вещам работать в долгосрочной перспективе - он растет с ростом аргументов, поэтому, если термин будет редким, IDF будет высоким (множество документов разделено на очень несколько документов), если термин является общим, IDF будет низким (много документов, разделенных на много документов ~ = 1).
Скажем, у вас есть 100 рецептов, и все, кроме одного, требуют яиц, теперь у вас есть еще три документа, которые содержат слово «яйцо», один раз в первом документе, два раза во втором документе и один раз в третьем документе. Частота термина «яйцо» в каждом документе - 1 или 2, а частота документа - 99 (или, возможно, 102, если вы посчитаете новые документы. Давайте придерживаться 99).
TF-IDF 'яйца':
1 * log (100/99) = 0.01 # document 1
2 * log (100/99) = 0.02 # document 2
1 * log (100/99) = 0.01 # document 3
Это все довольно маленькие числа; напротив, давайте посмотрим на другое слово, которое встречается только в 9 из ваших 100 корпусов рецептов: «руккола». Это происходит дважды в первом документе, три раза во втором и не встречается в третьем документе.
TF-IDF для «рукколы»:
1 * log (100/9) = 2.40 # document 1
2 * log (100/9) = 4.81 # document 2
0 * log (100/9) = 0 # document 3
«руккола» действительно важна для документа 2, по крайней мере, по сравнению с «яйцом». Кого волнует, сколько раз появляется яйцо? Все содержит яйцо! Эти векторы терминов намного более информативны, чем простые подсчеты, и они приведут к тому, что документы 1 и 2 будут гораздо ближе друг к другу (по отношению к документу 3), чем если бы использовались простые подсчеты терминов. В этом случае, вероятно, возникнет тот же результат (эй! У нас здесь только два члена), но разница будет меньше.
Главная идея заключается в том, что TF-IDF генерирует более полезные показатели термина в документе, поэтому вы не сосредотачиваетесь на действительно общих терминах (стоп-словах, 'egg') и не упускаете из виду важные термины ( 'руккола').