【问题标题】:Word Embedding Model词嵌入模型
【发布时间】:2020-02-02 10:14:59
【问题描述】:

我一直在搜索并尝试实现一个词嵌入模型来预测词之间的相似性。我有一个由 3,550 个公司名称组成的数据集,其想法是用户可以提供一个新词(不在词汇表中)并计算新名称与现有名称之间的相似度。

在预处理过程中,我去掉了停用词和标点符号(连字符、点、逗号等)。此外,我应用了词干和分隔前缀,希望获得更高的精度。然后像BIOCHEMICAL 这样的词以BIO CHEMIC 结束,这是一分为二的词(前缀和词干)

公司名称的平均长度由 3 个单词组成,频率如下:

作为预处理结果的标记被发送到 word2vec:

#window: Maximum distance between the current and predicted word within a sentence
#min_count: Ignores all words with total frequency lower than this.
#workers: Use these many worker threads to train the model
#sg: The training algorithm, either CBOW(0) or skip gram(1). Default is 0s
word2vec_model = Word2Vec(prepWords,size=300, window=2, min_count=1, workers=7, sg=1)

模型包含 vocab 中的所有单词后,计算每个公司名称的平均句子向量: df['avg_vector']=df2.apply(lambda row : avg_sentence_vector(row, model=word2vec_model, num_features=300, index2word_set=set(word2vec_model.wv.index2word)).tolist())

然后,保存向量以供进一步查找:

##Saving name and vector values in file
df.to_csv('name-submission-vectors.csv',encoding='utf-8', index=False)

如果经过预处理(去除停用词和标点符号)后词汇中没有包含新的公司名称,那么我会继续再次创建模型并计算平均句子向量并再次保存。

我发现这个模型没有按预期工作。例如,计算最相似的词pet得到以下结果:

ms=word2vec_model.most_similar('pet')

('fastfood', 0.20879755914211273)
('hammer', 0.20450574159622192)
('allur', 0.20118337869644165)
('wright', 0.20001833140850067)
('daili', 0.1990675926208496)
('mgt', 0.1908089816570282)
('mcintosh', 0.18571510910987854)
('autopart', 0.1729743778705597)
('metamorphosi', 0.16965581476688385)
('doak', 0.16890916228294373)

在数据集中,我有 paws 或 petcare 等词,但其他词正在与 pet 词创建关系。

这是pet的最近词的分布:

另一方面,当我使用GoogleNews-vectors-negative300.bin.gz 时,我无法在词汇表中添加新单词,但pet 与周围单词的相似度符合预期:

ms=word2vec_model.most_similar('pet')
('pets', 0.771199643611908)
('Pet', 0.723974347114563)
('dog', 0.7164785265922546)
('puppy', 0.6972636580467224)
('cat', 0.6891531348228455)
('cats', 0.6719794869422913)
('pooch', 0.6579219102859497)
('Pets', 0.636363685131073)
('animal', 0.6338439583778381)
('dogs', 0.6224827170372009)

这是最近词的分布:

我想听听您对以下方面的建议:

  • 此数据集是否适合继续此模型?
  • 数据集的长度是否足以让word2vec“学习”单词之间的关系?
  • 我可以做些什么来改进模型以使 word2vec 创建与 GoogleNews 相同类型的关系,例如在相似词之间正确设置单词 pet
  • 考虑到当前数据集的性质,是否可以实施另一个替代方案,例如 fasttext
  • 您知道任何可以与当前数据集一起用于创建这些关系的公共数据集吗?

谢谢

【问题讨论】:

    标签: machine-learning deep-learning word2vec word-embedding fasttext


    【解决方案1】:

    Word2vec 不会泛化到看不见的单词。

    它甚至不适用于可见但稀有的病房。这真的取决于有很多单词用法的例子。此外,您需要左右足够的上下文,但您只使用公司名称 - 这些太短了。这可能就是您的嵌入表现如此糟糕的原因:数据太少,文本太短。

    因此,这对您来说是错误的方法。用新的公司名称重新训练模型是不够的——你仍然只有一个数据点。你也可以省略看不见的单词,即使你重新训练,word2vec 也不能比这更好。

    【讨论】:

      【解决方案2】:

      如果您只想计算单词之间的相似度,可能不需要在词汇表中插入新单词。

      通过眼睛,我认为您也可以使用 FastText 而无需词干。它还计算未知单词的向量。

      来自FastText FAQ

      fastText 单词表示的一个关键特性是它的能力 为任何单词生成向量,甚至是虚构的单词。确实,fastText 词向量是由字符子串的向量构建的 包含在其中。这允许即使拼写错误也可以构建向量 单词或单词的连接。

      FastText 似乎对您的目的有用。 对于您的任务,您可以关注FastText supervised tutorial

      如果您的语料库太小,您可以从可用的预训练向量 (pretrainedVectors parameter) 开始构建模型。

      【讨论】:

        【解决方案3】:

        3500 个文本(公司名称),每个只有约 3 个词,总训练词仅约 10k,唯一词的词汇量要少得多。

        这对于 word2vec 和相关算法来说非常非常小,它们依赖大量数据和充分变化的数据来训练有用的向量排列。

        您可以通过使用比默认epochs=5 更多 个训练时期以及比默认@ 小得多 的向量从有限的数据中提取一些有意义的训练987654322@。通过这些调整,您可能会开始看到更有意义的most_similar() 结果。

        但是,目前还不清楚 word2vec,特别是在您的平均姓名词比较中的 word2vec,是否与您的最终目标相匹配。

        Word2vec 需要大量数据,不查看子词单元,并且不能说关于训练期间未见过的词标记的任何内容。多词向量的平均值通常可以作为比较多词文本的简单基准,但与其他方法相比,也可能会削弱某些词的影响。

        需要考虑的事项可能包括:

        • 与 Word2vec 相关的算法(如 FastText)也可以学习子词单元的向量,因此可以引导训练中未见过的词的不太糟糕的猜测向量。 (但是,这些也需要大量数据,并且要在小数据集上使用,您需要再次减小向量大小、增加 epoch 并另外减少用于子词学习的 buckets 的数量。)

          李>
        • 对多词文本进行更复杂的比较,例如“Word Mover's Distance”。 (这对于较长的文本可能会非常昂贵,但对于只有几个单词的名称/标题可能是实用的。)

        • 查找更多与您的目标相兼容的数据,以获得更强大的模型。更大的公司名称数据库可能会有所帮助。如果您只是希望您的分析能够理解英语单词/词根,那么更通用的培训文本也可能会起作用。

        • 对于许多目的,单纯的字典比较(编辑距离、共享字符 n-gram 的计数)也可能会有所帮助,尽管它不会检测到所有同义词/语义相似的词。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-09-21
          • 2018-09-04
          • 2018-06-11
          • 2019-05-17
          • 1970-01-01
          • 2019-11-14
          • 2019-03-07
          • 2019-09-01
          相关资源
          最近更新 更多