词向量是一种将单词映射到低维稠密向量空间的方法,旨在保留单词之间的语义关系。这种表示方法使得模型能够理解并捕捉单词的语义相似性,从而在许多自然语言处理(NLP)任务中大幅提高了性能。
Word2Vec:
GloVe(Global Vectors for Word Representation):
每个单词被表示为一个固定长度的稠密向量,通常为几十到几百维(如 100、200 或 300 维)。这种低维表示显著减少了数据的稀疏性,相较于 One-Hot 编码等高维稀疏表示,词向量能够更有效地学习和执行计算。
gensim
库示例下面是使用 Word2Vec 生成词向量的示例代码,采用了 Python 的 gensim
库。我们将展示如何使用 Skip-gram 和 CBOW 两种模型来训练词向量。
首先,确保你已经安装了 gensim
库。如果尚未安装,可以使用以下命令进行安装:
pip install gensim
import gensim
from gensim.models import Word2Vec
# 示例语料,这里采用的是一个小型的示例数据集
corpus = [
["dog", "barks"],
["cat", "meows"],
["cat", "and", "dog", "are", "pets"],
["fish", "swims"],
["birds", "fly"]
]
# 训练 Word2Vec 模型(Skip-gram)
model_skipgram = Word2Vec(sentences=corpus, vector_size=100, window=2, min_count=1, sg=1)
# 获取单词 "dog" 的词向量
dog_vector = model_skipgram.wv['dog']
print("Skip-gram model - Word vector for 'dog':")
print(dog_vector)
# 找到与 "cat" 最相似的词
similar_words = model_skipgram.wv.most_similar('cat', topn=3)
print("\nWords similar to 'cat' (Skip-gram):")
print(similar_words)
# 训练 Word2Vec 模型(CBOW)
model_cbow = Word2Vec(sentences=corpus, vector_size=100, window=2, min_count=1, sg=0)
# 获取单词 "dog" 的词向量
dog_vector_cbow = model_cbow.wv['dog']
print("\nCBOW model - Word vector for 'dog':")
print(dog_vector_cbow)
# 找到与 "cat" 最相似的词
similar_words_cbow = model_cbow.wv.most_similar('cat', topn=3)
print("\nWords similar to 'cat' (CBOW):")
print(similar_words_cbow)
代码解析
语料(corpus):我们创建了一个简单的列表,包含多个句子。每个句子都是单词列表。这些句子用作模型的训练数据。
Word2Vec模型:
vector_size
:指定词向量的维度,这里设定为 100。window
:指定上下文窗口大小,这里设定为 2,表示考虑前后两个单词的上下文。min_count
:忽略在训练集中出现次数少于此值的单词,设定为 1 表示所有单词都参与训练。sg
:模型选择参数,sg=1
代表使用 Skip-gram 模型,sg=0
代表使用 CBOW 模型。获取词向量:使用 model.wv['word']
来获取特定单词的词向量。
相似词查找:使用 model.wv.most_similar('word', topn=3)
方法来查找与给定单词最相似的词汇,topn
参数为返回的相似词数量。
运行以上代码后,你将能够看到 Skip-gram 和 CBOW 模型为单词 "dog" 生成的词向量,以及与 "cat" 最相似的词汇列表。由于数据集中词汇的数量有限,生成的输出会相对简单,但核心方法是相同的,可以应对更大规模的训练集。
fastText
库示例下面是使用 fastText
库生成词向量的示例代码。fastText
是由 Facebook AI Research (FAIR) 开发的高效的文本分类和表示学习工具,支持生成词嵌入并允许单词的亚字节(subword)级别的训练,从而可以更好地处理罕见或者拼写错误的词汇。
首先,确保你已经安装了 fastText
库。如果尚未安装,可以使用以下命令进行安装:
pip install fasttext
以下代码展示了如何使用 fastText
训练词向量,并保存训练后的模型。
import fasttext
# 示例语料,通常在实际应用中,输入会是一个文本文件,每行一个句子
corpus = [
"dog barks",
"cat meows",
"cat and dog are pets",
"fish swims",
"birds fly"
]
# 将语料写入文本文件,因为 fastText 需要从文件中读取数据
with open('corpus.txt', 'w') as f:
for line in corpus:
f.write(line + '\n')
# 训练 fastText 模型
model = fasttext.train_unsupervised('corpus.txt', model='skipgram')
# 获取单词 "dog" 的词向量
dog_vector = model.get_word_vector('dog')
print("Word vector for 'dog':")
print(dog_vector)
# 查找与 "cat" 相似的词
similar_words = model.get_nearest_neighbors('cat')
print("\nWords similar to 'cat':")
for similarity in similar_words:
print(f"Word: {similarity[1]}, Similarity: {similarity[0]}")
代码解析
语料(corpus):我们创建了一个示例语料,该示例属于一小部分的句子。在实际使用中,建议将文本数据保存在文件中并在训练期间加载。
写入文件:将示例语料写入文本文件 (corpus.txt
)。
训练模型:使用 fasttext.train_unsupervised
的 model
参数指定 training method,skipgram
表示使用 Skip-gram 模型。如果希望使用 CBOW,可以将 model
参数设为 'cbow'
。
获取词向量:使用 model.get_word_vector('word')
方法可以获取特定单词的词向量。
查找相似词:使用 model.get_nearest_neighbors('word')
方法可以查找与给定单词相似的词汇,返回相似度和对应单词。
运行以上代码后,你将能看到单词 "dog" 的词向量以及与 "cat" 最相似的词汇和相似度。由于数据集非常小,生成的输出可能相对简单,但 fastText
能处理更大规模的训练集并生成高质量的词嵌入。
词向量通过有效的统计方法将单词映射到稠密向量空间,能够捕捉单词间的语义关系,广泛应用于各种自然语言处理任务。尽管存在静态性质的局限性,词向量仍然是许多NLP应用中的基础工具,并为后续的上下文相关词嵌入(如BERT、GPT等)奠定了重要基础。