Word2Vec 嵌入和 BERT 嵌入之间有几个关键区别:
下面是使用 Python 中的 Gensim 库来展示 word2vec 和 Hugging Face Transformers 库来展示 BERT 的示例代码:
Word2Vec 嵌入示例:
# 导入所需的库
from gensim.models import Word2Vec
from gensim.models.keyedvectors import KeyedVectors
# 假设有一个句子列表作为训练数据
sentences = [["I", "love", "natural", "language", "processing"],
["Word", "embeddings", "are", "useful", "for", "NLP"],
["Word2Vec", "is", "a", "popular", "word", "embedding", "technique"]]
# 训练 Word2Vec 模型
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)
# 获取单词 "word" 的词向量表示
word_vector = model.wv["word"]
print("Word2Vec Embedding for 'word':", word_vector)
BERT 嵌入示例:
# 导入所需的库
from transformers import BertTokenizer, BertModel
import torch
# 加载 BERT tokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
# 假设有一个句子
sentence = "Word embeddings are useful for NLP"
# 使用 BERT tokenizer 对句子进行标记化和编码
inputs = tokenizer(sentence, return_tensors="pt", padding=True, truncation=True)
# 加载 BERT 模型
model = BertModel.from_pretrained('bert-base-uncased')
# 获取 BERT 嵌入
with torch.no_grad():
outputs = model(**inputs)
# 提取句子中每个 token 的嵌入表示
embeddings = outputs.last_hidden_state
# 提取第一个 token 的嵌入表示([CLS] 标记)
bert_embedding = embeddings[:, 0, :]
print("BERT Embedding for the sentence:", bert_embedding)
这里,Word2Vec 通过简单的神经网络训练得到词向量,而 BERT 是一个预训练的深度双向 Transformer 模型,在给定任务的基础上进行微调以获得更好的嵌入表示。Word2Vec 产生的向量通常具有相似含义的单词在空间中彼此靠近,而 BERT 的嵌入则更具有上下文感知性,可以更好地捕捉句子中的语义和语境。