【耿直哥深度学习】15.1-词嵌入和word2vec
·
一、Jupyter Notebook版本(带详细注释)
15.1-词嵌入和word2vec
1. word2vec模型
1.1 代码包引入
# 从gensim库的word2vec模块导入Word2Vec类,核心作用是训练自定义的word2vec模型
from gensim.models.word2vec import Word2Vec
# 导入gensim的downloader模块,用于获取预训练模型列表、下载/加载官方预训练词向量(如Google News的word2vec)
import gensim.downloader
1.2 引入Word2vec模型
# gensim.downloader.info():返回所有可下载的预训练模型元信息(字典格式)
# ['models']:提取预训练模型的核心字典(key=模型名,value=模型详情)
# keys():获取所有预训练模型的名称,list()转为列表便于查看
# 输出结果包含不同类型(word2vec/glove/fasttext)、不同语料、不同维度的预训练词向量模型
list(gensim.downloader.info()['models'].keys())
# 加载官方预训练的word2vec模型:'word2vec-google-news-300'是Google基于1000亿+新闻语料训练的300维词向量
# 首次运行会自动下载模型(约3.6GB),下载完成后缓存到本地(~/.gensim/data/),后续加载无需重复下载
# 该模型覆盖约300万个英文词汇,能反映丰富的语义关系(如king-man+woman≈queen)
word_vectors = gensim.downloader.load('word2vec-google-news-300')
1.3 训练word2vec模型
# 构造极简训练数据集:由2个中文句子组成的列表,每个句子是分词后的词语列表
# 注:实际中文场景需先用jieba等工具分词(如jieba.lcut('猫吃鱼')),示例简化为手动分词
sentences = [['猫','吃','鱼'],['狗','吃','肉']]
# 训练自定义word2vec模型
# min_count=1:忽略出现次数少于1的词(小数据集必须设为1,默认值是5,会过滤所有词)
# sg=1:使用Skip-gram算法训练(sg=0则用CBOW算法;小数据集用Skip-gram效果更好)
# 其他默认参数:vector_size=100(词向量维度,旧版本参数名是size)、window=5(上下文窗口大小)、epochs=5(训练迭代次数)
model = Word2Vec(sentences, min_count=1, sg=1)
# 定义模型保存路径:当前目录下的model文件夹,文件名为demo.model
model_path = 'model/demo.model'
# 保存训练好的模型到指定路径,后续可直接加载,无需重复训练
model.save(model_path)
1.4 词向量
# 从指定路径加载之前保存的word2vec模型,恢复模型对象
model = Word2Vec.load(model_path)
# 提取模型中“猫”这个词对应的词向量
# 输出结果是100维的浮点型数组(vector_size=100),每个数值代表“猫”在向量空间中的一个维度值
# 词向量的核心意义:将离散的“猫”这个词映射到连续的低维向量空间,使语义相近的词向量距离更近
model.wv['猫']
二、核心知识点梳理
2.1 核心概念(小白友好版)
| 概念 | 定义 | 小白解释 |
|---|---|---|
| 词嵌入(Word Embedding) | 将离散的词语转换为连续的低维稠密向量,向量空间能反映词语的语义/语法关系 | 把“猫”“狗”这些词变成一串数字,比如[0.1, -0.2, 0.3,…],“猫”和“狗”的数字串相似度高,“猫”和“桌子”相似度低 |
| word2vec | 经典的词嵌入训练算法,包含CBOW和Skip-gram两种核心架构 | 专门用来训练词向量的方法,能让计算机学会“猫≈狗”“吃≈啃”这类语义关系 |
| CBOW算法 | 用上下文词语预测中心词语(如用[猫,鱼]预测[吃]) | 看周围的词猜中间的词,训练速度快,适合大数据集 |
| Skip-gram算法 | 用中心词语预测上下文词语(如用[吃]预测[猫,鱼]) | 看中间的词猜周围的词,对小数据集/生僻词更友好,语义效果更好 |
| 预训练词向量 | 基于大规模语料(如Google新闻、维基百科)训练好的词向量,可直接复用 | 大厂已经训好的“数字词典”,拿来就能用,不用自己从零训 |
| 自定义词向量 | 基于自有小语料训练的词向量,适配特定场景(如示例的“猫/狗/吃/鱼/肉”) | 自己的数据集太小,通用词典不好用,就自己训一个简单的 |
2.2 gensim库核心用法与参数梳理
| 模块/函数 | 作用 | 关键参数 | 参数解释(小白版) |
|---|---|---|---|
gensim.downloader.info()['models'] | 获取可下载的预训练模型信息 | - | 查看有哪些现成的预训练词向量可以用 |
gensim.downloader.load(model_name) | 加载预训练词向量模型 | model_name | 模型名称(如’word2vec-google-news-300’) |
Word2Vec(sentences, ...) | 训练自定义word2vec模型 | sentences | 训练数据,格式为[[词1,词2], [词3,词4]](句子列表+分词) |
min_count | 过滤生僻词,小数据集设1,大数据集设5+ | ||
sg | 训练算法:1=Skip-gram(小数据友好),0=CBOW(大数据快) | ||
vector_size | 词向量维度(新版本),旧版本用size,默认100维 | ||
window | 上下文窗口大小,默认5(中心词前后各5个词) | ||
epochs | 训练迭代次数,默认5次,次数越多训练越充分(易过拟合) | ||
model.save(path) | 保存训练好的模型 | path | 模型保存路径(如’model/demo.model’) |
Word2Vec.load(path) | 加载保存的模型 | path | 模型文件路径 |
model.wv[word] | 获取单个词的词向量 | word | 要查询的词语(必须在训练集中出现过) |
model.wv.similarity(w1, w2) | 计算两个词的语义相似度 | w1/w2 | 两个词语,返回0-1之间的相似度值(越高越像) |
2.3 关键细节说明
- 预训练模型注意事项:
word2vec-google-news-300是英文模型,无法处理中文;中文预训练词向量可选择sgns.wiki.word(维基百科中文)、sgns.sogou.word(搜狗新闻)等;- 该模型约3.6GB,首次下载耗时较长,可根据网络情况选择是否加载;
- 中文分词必做:示例中手动分词([‘猫’,‘吃’,‘鱼’]),实际处理中文文本时需先用
jieba分词(pip install jieba→jieba.lcut('猫吃鱼')); - 路径问题:保存模型时需确保
model文件夹已存在,否则会报FileNotFoundError,可提前用os.makedirs('model', exist_ok=True)创建; - 词向量维度:默认100维,可通过
vector_size调整(如vector_size=200),维度越高表达能力越强,但计算/存储成本越高。
三、PyCharm版本代码(可直接运行)
# ==================== 导入核心依赖库 ====================
# 导入Word2Vec类,用于训练自定义word2vec模型
from gensim.models.word2vec import Word2Vec
# 导入gensim下载器,用于查看/加载预训练模型
import gensim.downloader
# 导入os库,用于创建文件夹(避免保存模型时路径不存在报错)
import os
# ==================== 1. 查看可下载的预训练模型 ====================
# 获取所有可下载的预训练模型名称列表
all_pretrained_models = list(gensim.downloader.info()['models'].keys())
# 打印前5个模型名称(避免输出过长)
print("=== 可下载的预训练模型(前5个) ===")
print(all_pretrained_models[:5])
# ==================== 2. 加载预训练模型(可选,注释掉可跳过) ====================
# 注:word2vec-google-news-300模型约3.6GB,首次下载耗时久,按需选择是否加载
# 如需加载,取消下方注释
# print("\n=== 开始加载预训练模型 ===")
# word_vectors = gensim.downloader.load('word2vec-google-news-300')
# print("预训练模型加载完成!")
# ==================== 3. 训练自定义word2vec模型 ====================
# 构造中文训练数据集(手动分词,实际需用jieba)
sentences = [['猫','吃','鱼'],['狗','吃','肉']]
print("\n=== 训练自定义word2vec模型 ===")
# 训练模型:适配小数据集的参数配置
model = Word2Vec(
sentences,
min_count=1, # 保留所有词(小数据集必须设1)
sg=1, # 使用Skip-gram算法
vector_size=100, # 词向量维度(新版本参数)
window=5, # 上下文窗口大小
epochs=5 # 训练迭代次数
)
# ==================== 4. 保存模型(自动创建文件夹) ====================
# 定义模型保存路径
model_dir = 'model'
model_path = os.path.join(model_dir, 'demo.model')
# 创建model文件夹(不存在则创建,存在则不报错)
os.makedirs(model_dir, exist_ok=True)
# 保存模型
model.save(model_path)
print(f"模型已保存到:{model_path}")
# ==================== 5. 加载模型并获取词向量 ====================
# 加载保存的模型
loaded_model = Word2Vec.load(model_path)
# 获取“猫”的词向量
cat_vec = loaded_model.wv['猫']
# 打印词向量维度和前10个值(避免输出过长)
print("\n=== 加载模型并查看词向量 ===")
print(f"'猫'的词向量维度:{cat_vec.shape}")
print(f"'猫'的词向量(前10个值):{cat_vec[:10]}")
# ==================== 6. 拓展:计算词语相似度 ====================
# 计算“猫”和“狗”的语义相似度(余弦相似度)
try:
similarity = loaded_model.wv.similarity('猫', '狗')
print(f"\n'猫'和'狗'的语义相似度:{similarity:.4f}")
except KeyError as e:
print(f"\n计算相似度失败:{e}(词语不在训练集中)")
总结
- 核心目标:词嵌入(word2vec)的核心是把离散词语转成能反映语义的连续向量,让计算机“理解”词语含义;
- gensim核心用法:
- 预训练模型:
gensim.downloader.load()快速复用通用语义,适合英文场景; - 自定义模型:
Word2Vec()训练专属词向量,需先分词,小数据集用sg=1+min_count=1;
- 预训练模型:
- 实操关键点:
- 中文必须分词(jieba),否则模型无法学习语义;
- 保存模型前创建文件夹,避免路径报错;
- 预训练模型体积大,按需选择是否加载,中文场景可替换为中文预训练词向量。
避坑提示
- 安装依赖:
pip install gensim(核心)、pip install jieba(中文分词)、pip install numpy(gensim依赖); - 预训练模型下载失败:检查网络,或手动下载模型文件放到
~/.gensim/data/目录; - 词向量查询报错
KeyError:确保查询的词语在训练集中出现过(如示例中只能查“猫/狗/吃/鱼/肉”); - PyCharm运行无输出:确保代码中
print()语句未被注释,且运行配置正确。
更多推荐
所有评论(0)