【问题标题】:Looking for an effective NLP Phrase Embedding model寻找有效的 NLP 短语嵌入模型
【发布时间】:2020-12-29 18:49:12
【问题描述】:

我想要实现的目标是找到一个好的 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、glove-wiki-gigaword-300、glove-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,这似乎不合理。

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

【问题讨论】:

  • 为什么这个分数不合理?通过标记化,单词将被拆分为子单词,这些子单词被引用到嵌入中,因此它将有效地解决您的一个问题。要嵌入整个句子,您可以计算每个词嵌入的平均值?可以看这篇文章engineering.talkdesk.com/…
  • 因为 0.93 应该是非常相似的短语。我没有看到“女婴”和“年报”相似
  • 您如何评价 0.93 不合理?我认为您应该评估某个最终任务的嵌入,而不是查看原始相似性值,无论是您想到的任务,还是仅使用嵌入器提供的嵌入来使用一些分类/匹配数据集
  • 相似度比较几乎是我的最终任务。也许我不应该认为路径 2 是一个好的选择?
  • 那么我建议从互联网上删除许多应该相似或不同的对(句子或单词),然后检查相似输出的分布。也许匹配对是 0.99 相似,而 0.93 实际上是有区别的

标签: nlp gensim word2vec fasttext


【解决方案1】:

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

好在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)

【讨论】:

  • 使用这种方法,我可以获得更多短语的嵌入。只是好奇,它是否使用字符 ngram 向量的总和来处理 OOV 单词,就像这里讨论的那样:stackoverflow.com/questions/50828314/…?如果是这样,为什么我得到一个全零数组嵌入 'blargfizzle'?
  • 是的,链接的答案是相关的。使用英语 cc.en.300.bin 模型,我得到了一个有效的“blargfizzle”词嵌入。如果我的回答有用,请采纳并投票。
  • 再次尝试了 get_sentence_vector() 和 get_word_vector() 但仍然得到了一个全零数组嵌入 'blargfizzle'。在我接受之前,请您分享您的代码吗?非常感谢!
  • 我使用了答案中的相同代码:model.get_word_vector('blargfizzle') 返回:array([ 0.00646026, 0.02136607, 0.0110087 , 0.04861083, -0.04463948, ...])
  • 这很奇怪,也许我们有不同的 lib 版本?我的 fasttext 是 0.9.2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 1970-01-01
相关资源
最近更新 更多