词嵌入模型

我一直在寻找并尝试实现一个词嵌入模型来预测单词之间的相似性。我有一个由3550个公司名称组成的数据集,用户可以提供一个新的单词(该单词不在词汇表中),并计算新名称与现有名称之间的相似性。

在预处理过程中,我去除了停用词和标点符号(连字符、点、逗号等)。此外,我还应用了词干提取并分离了前缀,希望能获得更高的精度。因此,像BIOCHEMICAL这样的单词最终被分成BIOCHEMIC,即单词被分成两个部分(前缀和词干)。

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

enter image description here

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

#window: 句子中当前单词与预测单词之间的最大距离#min_count: 忽略总频率低于此值的所有单词#workers: 使用这些工作线程来训练模型#sg: 训练算法,CBOW(0)或skip gram(1)。默认为0sword2vec_model = Word2Vec(prepWords,size=300, window=2, min_count=1, workers=7, sg=1)

模型包含词汇表中的所有单词后,为每个公司名称计算平均句向量: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())

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

##保存名称和向量值到文件中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的近似单词分布:

enter image description here

另一方面,当我使用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)

这是最近单词的分布:

enter image description here

我想请教以下几点建议:

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

谢谢


回答:

3500个文本(公司名称)每个只有大约3个单词,总共只有大约10k个训练单词,唯一单词的词汇量更小。

对于依赖大量数据和足够多样化数据来训练有用向量排列的word2vec和相关算法来说,这非常非常小。

您可以通过使用远超过默认epochs=5的训练轮次,以及远小于默认size=100的向量大小,从有限数据中压榨出一些有意义的训练。这样,您可能会开始看到更有意义的most_similar()结果。

但是,尚不清楚word2vec,特别是您在平均名称单词比较中的word2vec,是否符合您的最终目标。

Word2vec需要大量数据,不查看子词单位,并且无法对训练期间未见过的单词标记发表任何意见。许多单词向量的平均值通常可以作为比较多词文本的简单基准,但也可能稀释某些单词的影响,与其他方法相比。

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

  • 像FastText这样的与word2vec相关的算法,它也学习子词单位的向量,因此可以为训练中未见过的单词启动不太差的猜测向量。(但这些也需要大量数据,要在小数据集上使用,您需要再次减少向量大小,增加轮次,并额外减少用于子词学习的buckets数量。)

  • 更复杂的多词文本比较,如“Word Mover’s Distance”。(这在较长的文本上可能非常昂贵,但在仅有几个单词的名称/标题上可能实用。)

  • 寻找与您的目标兼容的更多数据,以建立更强的模型。更大的公司名称数据库可能有帮助。如果您只是希望您的分析理解英语单词/词根,更通用的训练文本也可能有效。

  • 对于许多目的,仅仅是词汇学的比较 – 编辑距离,共享字符n元组的计数 – 也可能有帮助,尽管它不会检测到所有同义词/语义相似的单词。

Related Posts

在使用k近邻算法时,有没有办法获取被使用的“邻居”?

我想找到一种方法来确定在我的knn算法中实际使用了哪些…

Theano在Google Colab上无法启用GPU支持

我在尝试使用Theano库训练一个模型。由于我的电脑内…

准确性评分似乎有误

这里是代码: from sklearn.metrics…

Keras Functional API: “错误检查输入时:期望input_1具有4个维度,但得到形状为(X, Y)的数组”

我在尝试使用Keras的fit_generator来训…

如何使用sklearn.datasets.make_classification在指定范围内生成合成数据?

我想为分类问题创建合成数据。我使用了sklearn.d…

如何处理预测时不在训练集中的标签

已关闭。 此问题与编程或软件开发无关。目前不接受回答。…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注