Альтернативы TF-IDF и Cosine Similarity при сравнении документов разных форматов

12

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

1) Обработайте текст каждого списка вакансий для извлечения навыков, упомянутых в списке

2) Для каждой карьеры (например, «Аналитик данных») объедините обработанный текст списков вакансий для этой карьеры в один документ

3) Рассчитайте TF-IDF каждого навыка в рамках карьерных документов.

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

Это не кажется мне идеальным решением, так как косинусное сходство лучше всего использовать при сравнении двух документов одного формата. В этом отношении TF-IDF не кажется подходящей метрикой для применения к списку навыков пользователя вообще. Например, если пользователь добавляет дополнительные навыки в свой список, TF для каждого навыка будет понижен. На самом деле мне все равно, как часто встречаются навыки в списке навыков пользователя - мне просто важно, чтобы у них были эти навыки (и, возможно, насколько хорошо они знают эти навыки).

Похоже, что лучшей метрикой было бы сделать следующее:

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

2) Для каждой карьеры суммируйте результаты TF-IDF для всех навыков пользователя.

3) Ранжирование карьеры на основе вышеуказанной суммы

Думал ли я в правильном направлении здесь? Если да, есть ли алгоритмы, которые работают в этом направлении, но являются более сложными, чем простая сумма? Спасибо за помощь!

Ричард Ноче
источник
3
Проверьте Doc2vec, у Gensim есть реализация
Blue482

Ответы:

1

Возможно, вы могли бы использовать вложения слов, чтобы лучше представить расстояние между определенными навыками. Например, «Python» и «R» должны быть ближе друг к другу, чем «Python» и «Time management», так как они оба являются языками программирования.

Вся идея в том, что слова, которые появляются в одном контексте, должны быть ближе.

Как только у вас появятся эти вложения, у вас будет набор навыков для кандидата и наборы навыков различного размера для рабочих мест. Затем вы можете использовать расстояние движителя Земли для расчета расстояния между наборами. Эта мера расстояния довольно медленная (квадратичное время), поэтому она может плохо масштабироваться, если вам нужно выполнить много заданий.

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

Валентин Каломм
источник
1

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

Если вы создадите «вектор запроса» из навыков, вы можете умножить вектор на свою матрицу срочной карьеры (со всеми весами tf-idf в качестве значений). Полученный вектор даст вам рейтинговый балл за карьерный документ, который вы можете использовать, чтобы выбрать топ-k профессий для набора «навыков запроса».

q¯1×|terms|M|terms|×|documents|v¯M1×|documents|

Этот метод ранжирования является одним из самых простых и существует множество вариаций. Запись TF-IDF в Википедии также кратко описывает этот метод ранжирования. Я также нашел этот вопрос и ответ на вопрос о соответствующих документах.

KorkiBuziek
источник
Удивительно, но простое среднее вложение слов часто так же хорошо, как средневзвешенное вложение, выполненное с весами Tf-Idf.
Wacax
0

Вы можете попробовать использовать "gensim". Я сделал аналогичный проект с неструктурированными данными. Gensim дал лучшие результаты, чем стандартный TFIDF. Это также бежало быстрее.

Харша Редди
источник