前情提要:
《NLP深入学习(一):jieba 工具包介绍》
《NLP深入学习(二):nltk 工具包介绍》
《NLP深入学习(三):TF-IDF 详解以及文本分类/聚类用法》
《NLP深入学习(四):贝叶斯算法详解及分类/拼写检查用法》
《NLP深入学习(五):HMM 详解及字母识别/天气预测用法》
《NLP深入学习(六):n-gram 语言模型》
在自然语言处理(NLP)领域中,词向量是将单词映射为实数向量的一种方法,使得具有相似含义的词在数学空间中的距离更近。通过词向量表示,可以将原本无法直接进行数学运算的文本数据转化为数值形式,从而能够应用于机器学习和深度学习模型。
早期的词向量表示方法如 One-hot 编码,它是以稀疏向量的形式存在,每个词对应一个很长的向量,向量中只有一个位置上的值为1,其余全为0。这种表示方式简单直观,但无法表达词与词之间的语义关系。
随着技术的发展,出现了分布式词向量(Distributed Representation),其中最具代表性的有:
Word2Vec:
GloVe(Global Vectors for Word Representation):
FastText:
这些词向量模型训练完成后,每个词都将有一个固定长度的稠密向量,通过计算两个词向量之间的余弦相似度或欧氏距离,可以衡量它们在语义上的接近程度。词向量技术极大地提升了诸如情感分析、文档分类、机器翻译等NLP任务的效果。
下面以 Word2Vec 为例介绍下词向量的具体使用方法!
Word2Vec 是 Google 在2013年提出的一种用于自然语言处理的词嵌入(word embedding)技术,它将文本中的每个词映射为一个连续向量空间内的稠密向量。通过训练,Word2Vec 能够捕捉词汇之间的语义和语法关系,使得具有相似上下文环境或含义相近的词语在向量空间中的距离较近。
Word2Vec主要包含两种模型结构:
Continuous Bag-of-Words (CBOW):
Skip-gram:
这两种模型都采用神经网络架构进行训练,不过重点不同:CBOW 更关注于上下文信息的整体统计特征,而 Skip-gram 则强调单个词与其上下文的关系,通常能捕获到更丰富的词汇间关联性。
训练过程:
最终得到的词向量可以在下游任务中直接使用,无需进一步特征工程,并且往往能提供优异的表现,比如在词类比任务、文档分类、情感分析等领域中展现出了强大的能力。例如,经过训练的Word2Vec模型中,“国王”-“男人”+“女人”≈“女王”,这种操作展示了词向量在数学上的可加性和潜在的语义含义。
使用 Word2Vec 进行训练和生成词向量的常见方法是使用 Gensim 库。以下是一个简单的 Word2Vec 的 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 模型,我们可以获取每个词的向量表示,并利用这些向量进行后续的自然语言处理任务。
《NLP深入学习(一):jieba 工具包介绍》
《NLP深入学习(二):nltk 工具包介绍》
《NLP深入学习(三):TF-IDF 详解以及文本分类/聚类用法》
《NLP深入学习(四):贝叶斯算法详解及分类/拼写检查用法》
《NLP深入学习(五):HMM 详解及字母识别/天气预测用法》
《NLP深入学习(六):n-gram 语言模型》