比较不同格式的文档时,TF-IDF和余弦相似度的替代方法


12

我一直在从事一个小型的个人项目,该项目需要用户的工作技能,并根据这些技能为他们建议最理想的职业。我使用工作清单数据库来实现这一目标。目前,代码的工作方式如下:

1)处理每个职位清单的文本以提取清单中提到的技能

2)对于每个职业(例如“数据分析师”),将针对该职业的工作清单的处理后的文本合并到一个文档中

3)计算职业文件中每种技能的TF-IDF

之后,我不确定应该使用哪种方法根据用户的技能列表对职业进行排名。我见过的最流行的方法是将用户的技能也视为文档,然后计算技能文档的TF-IDF,并使用余弦相似度来计算技能文档与每个文档之间的相似度。职业文件。

这对我来说似乎不是理想的解决方案,因为在比较两个相同格式的文档时,最好使用余弦相似度。因此,TF-IDF似乎根本不适合应用于用户的技能列表。例如,如果用户将其他技能添加到他们的列表中,则每个技能的TF都会下降。实际上,我不在乎用户技能列表中技能的频率是多少—我只是在乎他们是否拥有这些技能(也许他们对这些技能的了解程度如何)。

似乎更好的指标是执行以下操作:

1)对于用户拥有的每种技能,请在职业文档中计算该技能的TF-IDF

2)对于每个职业,将所有用户技能的TF-IDF结果相加

3)根据上述总和来排名职业

我在想这里的正确方法吗?如果是这样,是否有任何算法可以沿这条线运行,但比简单的总和还要复杂?谢谢您的帮助!


3
签出Doc2vec,Gensim具有实现
Blue482 '17

Answers:


1

也许您可以使用单词嵌入来更好地表示某些技能之间的距离。例如,“ Python”和“ R”应比“ Python”和“时间管理”靠得更近,因为它们都是编程语言。

整个想法是,出现在相同上下文中的单词应该更接近。

一旦有了这些嵌入,就可以为应聘者提供一套技能,并为工作提供各种规模的技能。然后,您可以使用“ 地球移动者”的距离来计算集合之间的距离。此距离度量相当慢(二次时间),因此如果您要完成许多工作,它可能无法很好地扩展。

为了解决可伸缩性问题,您可能可以首先根据候选人具有多少共同技能来对职位进行排名,并偏爱这些职位。


1

正如您所描述的,匹配“文档”的一种常见且简单的方法是使用TF-IDF加权。但是,据我所知,您希望根据一组用户技能对每个职业(文档)进行排名。

如果您通过技能创建“查询向量”,则可以将该向量乘以任期职业矩阵(将所有tf-idf权重作为值)。得出的向量将为您提供每个职业文档的排名得分,您可以使用该得分为“查询技能”集选择前k个职业。

例如,如果您的查询向量由零和一组成,且大小为,并且您的任期文档矩阵的大小,则将产生一个大小为的向量 元素等于每个职业文档中每个查询词的TF-IDF权重之和。 1×| Ëř小号| M| Ëř小号| ×| documents| ˉ v中号1×| documents|q¯1×|terms|M|terms|×|documents|v¯M1×|documents|

这种排名方法是最简单的方法之一,并且存在许多变体。Wikipedia上的TF-IDF条目也简要描述了这种排名方法。我还找到了有关匹配文档的问答


令人惊讶的是,单词嵌入的简单平均值通常与使用Tf-Idf权重进行的加权加权平均值一样好。
wacax


0

您可以尝试使用“ gensim”。我用非结构化数据做了一个类似的项目。Gensim的得分比标准的TFIDF更好。它也跑得更快。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.