【发布时间】: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