寻找有效的NLP词组嵌入模型

问题描述

我要实现的目标是找到一个可以做到的好word_and_phrase嵌入模型: (1)对于我感兴趣的单词和短语,它们都有嵌入。 (2)我可以使用嵌入来比较两件事(可能是单词或短语)之间的相似性

到目前为止,我已经尝试了两条路径:

1:一些Gensim加载的预训练模型,例如:

from gensim.models.word2vec import Word2Vec
import gensim.downloader as api
# download the model and return as object ready for use
model_glove_twitter = api.load("fasttext-wiki-news-subwords-300")
model_glove_twitter.similarity('computer-science','machine-learning')

此路径的问题是我不知道短语是否已嵌入。对于此示例,我收到此错误

KeyError: "word 'computer-science' not in vocabulary"

我将不得不尝试不同的预训练模型,例如word2vec-google-news-300,g手套-wiki-gigaword-300,g手套-twitter-200等。结果相似,总有兴趣短语没有嵌入。

  1. 然后我尝试使用一些基于BERT的句子嵌入方法https://github.com/UKPLab/sentence-transformers
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('distilbert-base-nli-mean-tokens')

from scipy.spatial.distance import cosine

def cosine_similarity(embedding_1,embedding_2):
    # Calculate the cosine similarity of the two embeddings.
    sim = 1 - cosine(embedding_1,embedding_2)
    print('Cosine similarity: {:.2}'.format(sim))

phrase_1 = 'baby girl'
phrase_2 = 'annual report'
embedding_1 = model.encode(phrase_1)
embedding_2 = model.encode(phrase_2)
cosine_similarity(embedding_1[0],embedding_2[0])

使用这种方法,我可以为词组嵌入单词,但是相似度为0.93,这似乎不合理。

那么我还能尝试实现上述两个目标吗?

解决方法

第一个路径的问题是您正在加载诸如word2vec嵌入之类的fastText嵌入,而word2vec无法处理词汇量不足的单词

好处是 fastText可以管理OOV单词。 您可以使用Facebook原始实现(pip install fasttext)或Gensim实现。

例如,使用Facebook实现,您可以执行以下操作:

import fasttext
import fasttext.util

# download an english model
fasttext.util.download_model('en',if_exists='ignore')  # English
model = fasttext.load_model('cc.en.300.bin')

# get word embeddings
# (if instead you want sentence embeddings,use get_sentence_vector method)
word_1='computer-science'
word_2='machine-learning'
embedding_1=model.get_word_vector(word_1)
embedding_2=model.get_word_vector(word_2)

# compare the embeddings
cosine_similarity(embedding_1,embedding_2)