【问题标题】:First time working with Word2Vec, try to cluster users based on their skill set第一次使用 Word2Vec,尝试根据他们的技能组合用户
【发布时间】:2020-07-14 08:21:37
【问题描述】:

对于我的论文,我必须分析候选人的技能。我必须对用户进行聚类并比较他们的技能。这些信息是分类的,所以我创建了一个具有相同结构的随机数据库,这样我就可以展示我的数据是如何构建的。

import random
listOfSkills = ["Dutch","Java OSGI","XML Transformation Query","Java Enterprise Edition","Functional Design","Scrum","Python","JavaScript","Ruby","Java","SQL","Data Analytics","Machine Learning","Deep Learning","English"]

rand_item = random.choice(listOfSkills)

n = 5

rand_items = random.sample(listOfSkills, n)

test_skillset = []

for i in range(5):
    result = random.sample(listOfSkills, n)
    string = ", ".join(result)
    test_skillset.append(string)

test_id_ = np.arange(0, len(test_skillset)).tolist()

test_dict = {'id' : test_id_,
             'skillset' : test_skillset
             }

test_df = pd.DataFrame(test_dict)

运行此代码后,我得到一个如下所示的 DataFrame:

id, skillset
0, "Java, ruby, ..."
1, "Java, ruby, ..."
2, "Java, ruby, ..."

我得到的数据库也是这样。

技能列表是我在数据库中找到的一些技能。数据库中的用户也更多,他们也有更多的技能。

我对机器学习和使用 Word2Vec 模型非常陌生。我尝试了一些东西,但几乎所有时候我都没有得到可以给我额外信息的结果。有些技能的名称很长,可能会弄乱模型。或者我做错了什么。

我的目标之一是对用户进行聚类并找到每个技能集之间的相似之处。

我的最终目标是将技能集的向量与空缺职位进行匹配,以检查用户与空缺职位的匹配程度。但首先我需要知道我是否可以找到用户之间的相似之处。

所以我的问题是:

  • 如何使用 Word2Vec 找到个人技能之间的相似之处?
  • 如何使用 Word2Vec 对用户进行集群以找到相似的技能组合?

对不起,如果我的问题有点含糊,英语不是我的母语,Python 对我来说有点新。 如果需要,我愿意澄清事情。

【问题讨论】:

    标签: python machine-learning nlp cluster-analysis word2vec


    【解决方案1】:

    Word2vec 最初是作为一种针对长而真实的自然语言文本进行训练的算法推出的,其中包括许多在原始上下文中细微变化的单词用法示例。

    您似乎将其应用于较小的已知技能受控词汇表,使用的训练数据不是完整的自然语言交流 - 只是列表。

    Word2vec 和类似的算法有时可以在这种不完全真实的语言语料库上提供有趣的结果,但可能需要对训练数据进行更多的修改,以及远离自然语言文本的通常默认值的参数,以获得更好的结果。

    特别是,如果您使用的是随机生成的语料库——尤其是通过从仅有 15 个“单词”的小列表中统一采样而生成的语料库! – 你不应该期望 word2vec 算法做任何有用的事情。在这样的人工语料库中,不存在类似语言的相对词义模式。 (而且,任何一次运行可能显示的任何微小的相关性提示都将是来自您的随机样本的噪声,这与真实语言所具有的含义渐变以及真实的训练文本所显示的完全不同。)

    (在您的“尝试了一些东西”的实验中,可能还存在其他错误,但没有产生有用的结果——但是在您所展示的内容中,随机训练集的这种使用只是最明显的问题.)

    要获得有用的“技能向量”,您需要大量真实数据,并调整训练的规模/选项等内容,以匹配您现有的限制。 (仅举一个例子,尝试训练 20 维的“密集嵌入”向量(例如 word2vec 中的那些)对于少于 20 个标记的词汇表是荒谬的——你可能需要 400 多个独特的标记来制作 20 个维向量开始有意义。)

    有了正确的数据,您应该开始看到这些技能向量之间的有意义的关系——相关技能比不相关的技能更接近,甚至可以看出技能的某些人类可描述方面的差异方向(例如“更进取”或“更抽象的数学”)。但您甚至无法真正目睹这些结果的理智/改进,除非它是真实的数据,具有真实的关系,您可以使用您的领域知识对其进行评估。

    然后,您也许可以尝试将这些组合成每个候选人摘要的替代方法(例如将技能向量平均在一起),或者仅使用一些依赖于词向量的复合距离度量(例如“Word Mover's Distance”),以尝试候选级聚类。

    祝你好运!

    【讨论】:

    • 感谢您的回复,我查看了我的数据集,大约有 1061 个独特技能,总共有近 5000 个技能除以 200 个用户。你认为这足以工作吗?虚拟数据库中的技能列表只是为了显示数据库的外观。所以在那种情况下,我给出的例子可能不是那么有代表性。
    • 这对于训练像 word2vec 这样的数据密集型算法来说真的很小......但唯一知道的方法就是尝试。请注意,您将无法为这么小的词汇量做典型的 100-300 维向量,如果每个用户平均有 25 种技能,当您创建虚假“句子”结果时,请避免使用任意选择创建虚假关系令牌排序。 (例如,按字母顺序或任何稳定的顺序列出技能,并加上一个小的window,可能会在您碰巧列出的技能之间建立虚假的密切关系。)
    猜你喜欢
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2013-09-21
    相关资源
    最近更新 更多