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

数据挖掘 nlp 文本挖掘 相似 余弦距离
2021-09-21 03:41:30

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

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

2) 对于每个职业(例如“数据分析师”),将该职业的职位列表的处理文本合并到一个文档中

3)计算职业文档中每个技能的TF-IDF

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

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

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

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

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

3)根据上述总和对职业进行排名

我在这里思考是否正确?如果是这样,是否有任何算法可以沿着这些思路工作,但比简单的求和更复杂?谢谢您的帮助!

4个回答

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

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

一旦你有了这些嵌入,你就会有一套适合候选人的技能,以及适合工作的不同规模的技能。然后,您可以使用Earth Mover 的距离来计算组之间的距离。这种距离测量相当慢(二次时间),因此如果您有很多工作要完成,它可能无法很好地扩展。

为了解决可扩展性问题,您也许可以首先根据候选人拥有多少共同技能对工作进行排名,并偏爱这些工作。

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

如果您从技能中创建“查询向量”,则可以将该向量与您的术语职业矩阵相乘(所有 tf​​-idf 权重作为值)。生成的向量将为您提供每个职业文档的排名分数,您可以使用它来选择“查询技能”集的前 k 个职业。

例如,如果您的查询向量 q¯ 由 0 和 1 组成,大小为 1×|ers|,以及您的术语文档矩阵 是大小 |ers|×|dCens|, 然后 v¯ 将产生一个大小的向量 1×|dCens| 元素等于每个职业文档中每个查询词的 TF-IDF 权重之和。

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

使用Jaccard 索引这将非常符合您的目的。

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