我正在尝试在 IT 领域的职位之间定义一个指标。为此,我需要在同一个职位中没有一起出现的职位词之间的一些度量,例如词之间的度量
高级,主要,领导,负责人,副总裁,主任,东西,校长,首席,
或的话
分析师、专家、建模师、研究员、科学家、开发人员、工程师、建筑师。
我怎样才能用它们的距离得到所有这些可能的词?
我正在尝试在 IT 领域的职位之间定义一个指标。为此,我需要在同一个职位中没有一起出现的职位词之间的一些度量,例如词之间的度量
高级,主要,领导,负责人,副总裁,主任,东西,校长,首席,
或的话
分析师、专家、建模师、研究员、科学家、开发人员、工程师、建筑师。
我怎样才能用它们的距离得到所有这些可能的词?
这是一个有趣的问题,感谢您在堆栈中提出。
我认为这个问题类似于我们在情感分析中应用LSA(潜在语义分析)来查找与一些预定义的正负词相关的具有极性的正负词列表。
好读:
因此,根据我的说法,LSA 是您在这种情况下开始的最佳方法,因为它从语料库中学习单词之间的潜在关系,这可能就是您正在寻找的。
如果我理解您的问题,您可以查看使用标题后面的术语形成的共现矩阵;例如,高级 FOO、初级 BAR 等。然后您可以使用合适的度量来计算任何一对术语之间的相似度,例如“高级”和“初级”;例如,余弦相似度。
不确定这是否正是您正在寻找的,但 r-base 有一个名为“adist”的函数,它创建一个近似字符串距离的距离矩阵(根据 Levenshtein 距离)。键入“?adist”以获取更多信息。
words = c("senior", "primary", "lead", "head", "vp", "director", "stuff", "principal", "chief")
adist(words)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 0 6 5 5 6 5 5 7 5
[2,] 6 0 6 6 7 7 7 6 6
[3,] 5 6 0 1 4 7 5 8 5
[4,] 5 6 1 0 4 7 5 8 4
[5,] 6 7 4 4 0 8 5 8 5
[6,] 5 7 7 7 8 0 8 8 7
[7,] 5 7 5 5 5 8 0 9 4
[8,] 7 6 8 8 8 8 9 0 8
[9,] 5 6 5 4 5 7 4 8 0
此外,如果 R 不是一个选项,Levenshtein 距离算法在此处以多种语言实现: http ://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance
(评论太长了)
基本上,@Emre 的答案是正确的:简单的相关矩阵和余弦距离应该可以很好地工作*。不过,有一个微妙之处——职称太短,无法承载重要的背景。让我解释一下。
想象一下 LinkedIn 个人资料(这是一个很好的数据来源)。通常,它们包含 4-10 句话来描述一个人的技能和资格。您很可能会在同一个人资料中找到“首席数据科学家”和“Matlab 和 R 的专业知识”之类的短语,但不太可能在其中看到“初级 Java 开发人员”。所以我们可以说“lead”和“professional”(以及“data science”和“Matlab”和“R”)经常出现在相同的上下文中,但它们很少与“junior”和“Java”一起出现。
共现矩阵正好说明了这一点。在相同的上下文中出现的 2 个单词越多,它们在矩阵中的向量看起来就越相似。而余弦距离只是衡量这种相似性的好方法。
但是职称呢?通常它们要短得多,实际上并没有创建足够的上下文来捕捉相似之处。幸运的是,您不需要源数据本身就是标题 - 您需要找到一般技能之间的相似之处,而不是专门在标题中。因此,您可以简单地从(长)配置文件中构建共现矩阵,然后使用它来测量标题的相似性。
* - 事实上,它已经在一个类似的项目中为我工作了。