【问题标题】:Compare cosine similarity of word with BERT model将单词的余弦相似度与 BERT 模型进行比较
【发布时间】:2023-11-01 08:48:01
【问题描述】:

您好,我正在寻找使用 BERT 模型为单词生成相似词的方法,与我们在 gensim 中生成 most_similar 词的方法相同,我发现该方法为:

from transformers import BertTokenizer, BertModel

import torch

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

model = BertModel.from_pretrained('bert-base-uncased')

word = "Hello"

inputs = tokenizer(word, return_tensors="pt")

outputs = model(**inputs)

word_vect = outputs.pooler_output.detach().numpy()

好的,现在这给了我用户给定的输入词的嵌入,那么我们可以将此嵌入与完整的 BERT 模型进行余弦相似度比较,以找到与该词最匹配的前 N ​​个嵌入,然后将嵌入转换为在模型中使用 vocab.txt 文件的单词?有可能吗?

【问题讨论】:

  • BERT 不像 Gensim 使用的 Word2Vec 模型那样是词袋模型,因此您不能只从模型本身中检索相似的词。您可以检索多个单词的向量表示,并通过余弦相似度或欧几里得距离建立接近度。
  • 哦,好吧,你的意思是我只能从 bert 模型中获取单词的向量,然后我可以比较它来找到相似的单词。所以要找到类似的东西,我必须得到一个数据集和保存从bert生成的word和embeddings的索引,然后应用余弦相似度??
  • 没错!但鉴于您的目的,我建议您只使用 Gensim。 BERT 是一个上下文感知模型,即它处理一个单词的语义上下文(在一个句子中)。由于您只会处理单个单词,因此 Gensim 就足够了。
  • 好的,是的,我目前正在使用带有 glove-wiki 模型的 gensim,结果有时并不好,因此探索其他选项也无法重新训练预训练模型。你知道任何替代的 gensim 模型,它涵盖了各种各样的词或具有良好相似词的词,可以帮助我吗??

标签: python nlp gensim bert-language-model word-embedding


【解决方案1】:

似乎您需要存储词汇表中所有单词的嵌入。 之后,您可以使用一些工具来找到最接近目标嵌入的嵌入。 例如,您可以使用 scikit-learn 中的 NearestNeighbors。 您可能要考虑的另一个选项是 HNSW,它是专门设计用于执行快速近似最近邻搜索的数据结构。 Faiss 是 Facebook 很好的 HNSW 实现。

【讨论】:

  • 哦,好吧,所以我无法从 bert 模型本身获取嵌入,我必须有一个数据集来获取嵌入,然后使用您提到的匹配算法找到相似的词?对
  • 我要记住的一件事是数据集大小,HNSW 绝对是处理大型数据集的方法,例如,如果您有 1M+ 向量/标记要比较 - 但如果您在
最近更新 更多