Word2Vec
- 1、引言
- 2、Word2Vec
- 2.1 定义
- 2.2 原理
- 2.3 实现方式
- 2.4 算法公式
- 2.5 代码示例
- 3、总结
1、引言
小屌丝:鱼哥, help ,help
小鱼: 你这是在鱼塘里面无法呼吸了?
小屌丝:… 别闹,鱼哥,
小鱼:你平时问我问题,可都是说中文的, 只有一种情况,说的事英文.
小屌丝:…这…这 … 唉
小鱼:所以,我说你在鱼塘里面…
小屌丝:唉~~ 可不能这么说, 我这是正儿八经的求助
小鱼:那你说说, 要问啥呢?
小屌丝:就是 ,Word
小鱼:啊? Word还问?
小屌丝: 我没说完呢, Word2Vec
小鱼:这整的,我还以为你问Word呢,Word2Vec咋了?
小屌丝:我不会啊
小鱼:不会就学啊
小屌丝:我这不向你请教了嘛
小鱼: 那…楼下的烟火味挺浓啊
小屌丝:啊… 好说好说, 我这就给老板娘打电话,留桌。
小鱼:这… 多不好意思啊。
2、Word2Vec
2.1 定义
Word2Vec 是一种用于学习词向量表示的自然语言处理(NLP)技术。其核心思想是将文本中的单词映射到高维空间中的向量,使得这些向量能够捕捉单词之间的语义和语法关系。
Word2Vec 的两种主要模型是 Skip-Gram 和 Continuous Bag of Words (CBOW)。
2.2 原理
-
CBOW:连续词袋模型通过上下文(即周围的词)来预测当前词。其核心思想是通过上下文的词向量的平均值来预测当前词。
-
Skip-Gram:与CBOW相反,Skip-Gram模型通过当前词来预测上下文。这种方式在处理较小数据集时表现更好,尤其是在捕捉稀有词上。
这两种模型都是通过构建一个神经网络,并通过训练来优化网络权重,从而得到词向量。
2.3 实现方式
Word2Vec的实现主要依赖于两种技术:负采样(Negative Sampling)和层序softmax(Hierarchical Softmax)。
- 负采样通过随机选择少量的“负”样本来更新权重,以此加速训练过程;
- 层序softmax则是通过构建一棵哈夫曼树来减少计算复杂度。
2.4 算法公式
Word2Vec算法的核心是最大化对数似然函数,对于Skip-Gram模型,目标函数可以表示为:
[ L ( θ ) = ∑ t = 1 T ∑ − c ≤ j ≤ c , j ≠ 0 log p ( w t + j ∣ w t ; θ ) ] [L(\theta) = \sum_{t=1}^{T}\sum_{-c \leq j \leq c, j \neq 0} \log p(w_{t+j}|w_t;\theta)] [L(θ)=t=1∑T−c≤j≤c,j=0∑logp(wt+j∣wt;θ)]
其中, ( w t ) (w_t) (wt)是目标词, ( w t + j ) (w_{t+j}) (wt+j)是上下文词, ( c ) (c) (c)是上下文窗口大小, ( θ ) (\theta) (θ)是模型参数。
2.5 代码示例
# -*- coding:utf-8 -*-
# @Time : 2024-05-07
# @Author : Carl_DJfrom gensim.models import Word2Vec
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
import nltk
nltk.download('punkt')
nltk.download('stopwords')# 示例文本数据,实际应用中你可能会加载一个更大的文本数据集
texts = ["Word2Vec is a group of related models that are used to produce word embeddings.","These models are shallow, two-layer neural networks that are trained to reconstruct linguistic contexts of words.","Word2Vec takes as its input a large corpus of text and produces a vector space.","Each unique word in the corpus is assigned a corresponding vector in the space."]# 分词和去除停用词
stop_words = set(stopwords.words('english'))
sentences = []
for text in texts:words = [w for w in word_tokenize(text.lower()) if w.isalpha() and w not in stop_words]sentences.append(words)# 训练Word2Vec模型
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)# 使用模型
# 寻找与'word2vec'最相似的词
similar_words = model.wv.most_similar('word2vec', topn=5)
print("与'word2vec'最相似的词有:")
for word, similarity in similar_words:print(f"{word}: {similarity}")# 获取某个词的词向量
word_vector = model.wv['embedding']
print("\n'embedding'的词向量:")
print(word_vector)# 计算两个词的相似度
similarity = model.wv.similarity('word2vec', 'embedding')
print(f"\n'word2vec'与'embedding'的相似度为:{similarity}")# 寻找不匹配的词
odd_word = model.wv.doesnt_match("word2vec neural corpus embedding".split())
print(f"\n在'word2vec', 'neural', 'corpus', 'embedding'中,不匹配的词是:{odd_word}")
代码解析
- 首先下载了必要的nltk数据包,
- 然后定义了一组文本数据作为输入。
- 对每个文本进行了分词和去除停用词的预处理步骤,然后使用Word2Vec模型进行训练。
- 模型训练完成后,使用这个模型来找到与某个词最相似的词、获取特定词的词向量、计算两个词之间的相似度以及寻找不匹配的词。
3、总结
Word2Vec是深度学习和自然语言处理领域的里程碑算法。
通过将词转换为向量,它能够有效地捕捉到词之间的语义关系,极大地推动了文本相关应用的发展,如情感分析、文本分类和机器翻译等。
尽管它已经有几年的历史,但Word2Vec仍然是自然语言处理领域非常重要的工具之一。
我是小鱼:
- CSDN 博客专家;
- 阿里云 专家博主;
- 51CTO博客专家;
- 企业认证金牌面试官;
- 多个名企认证&特邀讲师等;
- 名企签约职场面试培训、职场规划师;
- 多个国内主流技术社区的认证专家博主;
- 多款主流产品(阿里云等)测评一、二等奖获得者;
关注小鱼,学习【机器学习】&【深度学习】领域的知识。