一、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 关键细节说明

  1. 预训练模型注意事项
    • word2vec-google-news-300是英文模型,无法处理中文;中文预训练词向量可选择sgns.wiki.word(维基百科中文)、sgns.sogou.word(搜狗新闻)等;
    • 该模型约3.6GB,首次下载耗时较长,可根据网络情况选择是否加载;
  2. 中文分词必做:示例中手动分词([‘猫’,‘吃’,‘鱼’]),实际处理中文文本时需先用jieba分词(pip install jiebajieba.lcut('猫吃鱼'));
  3. 路径问题:保存模型时需确保model文件夹已存在,否则会报FileNotFoundError,可提前用os.makedirs('model', exist_ok=True)创建;
  4. 词向量维度:默认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}(词语不在训练集中)")

总结

  1. 核心目标:词嵌入(word2vec)的核心是把离散词语转成能反映语义的连续向量,让计算机“理解”词语含义;
  2. gensim核心用法
    • 预训练模型:gensim.downloader.load()快速复用通用语义,适合英文场景;
    • 自定义模型:Word2Vec()训练专属词向量,需先分词,小数据集用sg=1+min_count=1
  3. 实操关键点
    • 中文必须分词(jieba),否则模型无法学习语义;
    • 保存模型前创建文件夹,避免路径报错;
    • 预训练模型体积大,按需选择是否加载,中文场景可替换为中文预训练词向量。

避坑提示

  1. 安装依赖:pip install gensim(核心)、pip install jieba(中文分词)、pip install numpy(gensim依赖);
  2. 预训练模型下载失败:检查网络,或手动下载模型文件放到~/.gensim/data/目录;
  3. 词向量查询报错KeyError:确保查询的词语在训练集中出现过(如示例中只能查“猫/狗/吃/鱼/肉”);
  4. PyCharm运行无输出:确保代码中print()语句未被注释,且运行配置正确。

更多推荐