Косинус сходства и тф-идф - PullRequest
29 голосов
/ 06 июня 2011

Меня смущает следующий комментарий о TF-IDF и Cosine Similarity .

Я читал и то, и другое, а затем в вики под косинусным сходством. Я нахожу это предложение: ) не может быть отрицательным. Угол между двумя частотными векторами не может быть больше 90 ".

Теперь мне интересно ... разве это не две разные вещи?

Является ли tf-idf уже в косинусном подобии? Если да, то, что, черт возьми, - я вижу только внутренние точки и евклидовы длины.

Я думал, что tf-idf - это то, что вы могли бы сделать до того, как запустит косинусное сходство в текстах. Я что-то пропустил?

Ответы [ 5 ]

36 голосов
/ 27 октября 2013

TF-IDF - это просто способ измерить важность токенов в тексте; это просто очень распространенный способ превратить документ в список чисел (термин вектор, который обеспечивает один край угла, от которого вы получаете косинус).

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

Вы можете просто посчитать, сколько раз каждый термин встречается в документе ( T erm F Реквенсия), и использовать этот целочисленный результат для оценки термина в векторе, но результаты не будут очень хорошими. Чрезвычайно общие термины (такие как «есть», «и» и «the») могут привести к тому, что многие документы будут похожи друг на друга. (Эти конкретные примеры могут быть обработаны с использованием списка стоп-слов , но другие общие термины, которые не являются достаточно общими, чтобы считаться стоп-словом, вызывают проблему такого же рода. В Stackoverflow слово «вопрос» может падать в эту категорию. Если бы вы анализировали кулинарные рецепты, вы, вероятно, столкнулись бы с проблемами со словом «яйцо».)

TF-IDF регулирует частоту необработанных терминов, принимая во внимание частоту встречаемости каждого слагаемого в целом (реквизит D F ). I nverse D ocument F обычно это журнал количества документов, разделенный на количество документов, в которых встречается термин (изображение из Википедии):

IDF, credit to wikipedia

Думайте о «бревне» как о незначительном нюансе, который помогает вещам работать в долгосрочной перспективе - он растет с ростом аргументов, поэтому, если термин будет редким, 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') и не упускаете из виду важные термины ( 'руккола').

33 голосов
/ 06 июня 2011

Tf-idf - это преобразование, которое вы применяете к текстам, чтобы получить два действительных вектора. Затем вы можете получить косинусное сходство любой пары векторов, взяв их точечное произведение и разделив его на произведение их норм. Это дает косинус угла между векторами.

Если d 2 и q - векторы tf-idf, то

enter image description here

, где θ - угол между векторами. Поскольку θ находится в диапазоне от 0 до 90 градусов, cos θ находится в диапазоне от 1 до 0. θ может только в диапазоне от 0 до 90 градусов потому что векторы tf-idf неотрицательны.

Нет особой глубокой связи между tf-idf и косинус-подобием / моделью векторного пространства; tf-idf очень хорошо работает с матрицами терминов документа. Однако он используется за пределами этого домена, и в принципе вы можете заменить другое преобразование в VSM.

(формула взята из Википедии , следовательно, d 2 .)

6 голосов
/ 03 декабря 2014

Полная математическая процедура для косинусного подобия объясняется в этих уроках

Предположим, если вы хотите вычислить косинусное сходство между двумя документами, первым шагом будет вычисление векторов tf-idf для двух документов. а затем найти скалярное произведение этих двух векторов. Эти уроки помогут вам:)

0 голосов
/ 20 июня 2016

Tf-idf просто используется для поиска векторов из документов на основе tf - Term Frequency - который используется для определения того, сколько раз термин встречается в документе, и обратной частоты документа - который дает меру того, сколько разтермин появляется во всей коллекции.

Тогда вы можете найти косинусное сходство между документами.

0 голосов
/ 08 июня 2013

взвешивание tf / idf имеет некоторые случаи, когда они терпят неудачу и генерируют ошибку NaN в коде во время вычислений. Очень важно прочитать это: http://www.p -value.info / 2013/02 / когда-tfidf-и-косинус-Сходство-fail.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...