文章目录
- [0. 引言](#0. 引言)
- [1. 什么是词向量](#1. 什么是词向量)
- [2. Word2Vec](#2. Word2Vec)
-
- [2.1 介绍](#2.1 介绍)
- [2.2 例子](#2.2 例子)
- [3. 参考](#3. 参考)
0. 引言
前情提要:
《NLP深入学习(一):jieba 工具包介绍》
《NLP深入学习(二):nltk 工具包介绍》
《NLP深入学习(三):TF-IDF 详解以及文本分类/聚类用法》
《NLP深入学习(四):贝叶斯算法详解及分类/拼写检查用法》
《NLP深入学习(五):HMM 详解及字母识别/天气预测用法》
《NLP深入学习(六):n-gram 语言模型》
1. 什么是词向量
在自然语言处理(NLP)领域中,词向量是将单词映射为实数向量的一种方法,使得具有相似含义的词在数学空间中的距离更近。通过词向量表示,可以将原本无法直接进行数学运算的文本数据转化为数值形式,从而能够应用于机器学习和深度学习模型。
早期的词向量表示方法如 One-hot 编码,它是以稀疏向量的形式存在,每个词对应一个很长的向量,向量中只有一个位置上的值为1,其余全为0。这种表示方式简单直观,但无法表达词与词之间的语义关系。
随着技术的发展,出现了分布式词向量(Distributed Representation),其中最具代表性的有:
-
Word2Vec:
- 包括CBOW(Continuous Bag-of-Words)和Skip-gram两种训练模式。
- Skip-gram模型通过预测给定词语周围上下文的词语来学习词向量。
- CBOW则是通过给定的上下文预测中心词。
-
GloVe(Global Vectors for Word Representation):
- GloVe结合了全局统计信息和局部上下文窗口的优势,通过矩阵分解的方法学习词向量。
-
FastText:
- FastText不仅考虑整个词汇表的统计信息,还对词内部的子结构进行建模,特别适用于捕捉形态学特征丰富的语言中的词义。
这些词向量模型训练完成后,每个词都将有一个固定长度的稠密向量,通过计算两个词向量之间的余弦相似度或欧氏距离,可以衡量它们在语义上的接近程度。词向量技术极大地提升了诸如情感分析、文档分类、机器翻译等NLP任务的效果。
下面以 Word2Vec 为例介绍下词向量的具体使用方法!
2. Word2Vec
2.1 介绍
Word2Vec 是 Google 在2013年提出的一种用于自然语言处理的词嵌入(word embedding)技术,它将文本中的每个词映射为一个连续向量空间内的稠密向量。通过训练,Word2Vec 能够捕捉词汇之间的语义和语法关系,使得具有相似上下文环境或含义相近的词语在向量空间中的距离较近。
Word2Vec主要包含两种模型结构:
-
Continuous Bag-of-Words (CBOW):
- CBOW 模型试图根据给定单词周围的上下文单词来预测中心词。
- 训练过程中,模型的目标是最大化正确预测目标词的概率,即根据多个输入词预测出中间缺失的单个词。
-
Skip-gram:
- 与CBOW相反,Skip-gram 模型利用中心词去预测其前后出现的上下文单词。
- 在 Skip-gram 中,模型的任务是对于给定的一个词,尽可能准确地预测它前后窗口内的其他词。
这两种模型都采用神经网络架构进行训练,不过重点不同:CBOW 更关注于上下文信息的整体统计特征,而 Skip-gram 则强调单个词与其上下文的关系,通常能捕获到更丰富的词汇间关联性。
训练过程:
- 初始化时,所有的词都被随机赋予一个向量表示。
- 神经网络通过迭代优化损失函数(如负采样或 Hierarchical Softmax),不断调整词向量,使得模型可以更好地基于上下文预测目标词(CBOW)或者由目标词预测上下文(Skip-gram)。
最终得到的词向量可以在下游任务中直接使用,无需进一步特征工程,并且往往能提供优异的表现,比如在词类比任务、文档分类、情感分析等领域中展现出了强大的能力。例如,经过训练的Word2Vec模型中,"国王"-"男人"+"女人"≈"女王",这种操作展示了词向量在数学上的可加性和潜在的语义含义。
2.2 例子
使用 Word2Vec 进行训练和生成词向量的常见方法是使用 Gensim 库。以下是一个简单的 Word2Vec 的 Python 代码示例:
python
from gensim.models import Word2Vec
from nltk.tokenize import word_tokenize
import nltk
nltk.download('punkt') # 下载分词所需的资源
# 示例文本
corpus = "Word embeddings are dense vector representations of words."
# 分词
tokenized_corpus = word_tokenize(corpus.lower()) # 转为小写以便一致性
sentences = [tokenized_corpus]
# 设置 Word2Vec 参数
vector_size = 100 # 词向量维度
window_size = 5 # 上下文窗口大小
min_count = 1 # 最小词频,低于此频率的词将被忽略
workers = 4 # 并行处理的线程数
# 创建并训练 Word2Vec 模型
model = Word2Vec(sentences, vector_size=vector_size, window=window_size, min_count=min_count, workers=workers)
# 保存模型
model.save("word2vec_model.model")
# 加载模型
loaded_model = Word2Vec.load("word2vec_model.model")
# 获取单词的词向量
word_vector = loaded_model.wv['word']
# 打印词向量
print("Vector for 'word':", word_vector)
在这个例子中,我们首先使用 NLTK 进行分词,然后使用 Gensim 中的 Word2Vec 类创建和训练一个 Word2Vec 模型。模型可以保存到磁盘,以后可以加载并用于获取单词的词向量。
请注意,这只是一个简单的演示。在实际应用中,你通常需要使用更大规模的文本数据集,并调整模型的超参数以获得更好的性能。
在上述代码中:
vector_size
参数指定了生成词向量的维度。window_size
参数定义了上下文窗口的大小,即考虑当前词前后多少个词作为其上下文。min_count
参数设置了词汇表中保留词的最小出现次数,小于这个次数的词将被忽略。workers
参数表示训练时使用的并发进程数。
通过训练好的 Word2Vec 模型,我们可以获取每个词的向量表示,并利用这些向量进行后续的自然语言处理任务。
3. 参考
《NLP深入学习(一):jieba 工具包介绍》
《NLP深入学习(二):nltk 工具包介绍》
《NLP深入学习(三):TF-IDF 详解以及文本分类/聚类用法》
《NLP深入学习(四):贝叶斯算法详解及分类/拼写检查用法》
《NLP深入学习(五):HMM 详解及字母识别/天气预测用法》
《NLP深入学习(六):n-gram 语言模型》