word2vec 更适合词粒度向量且语料规范的场景;fasttext 仅在需处理未登录词或错别字时选用。分词必须为二维列表,如[["今天","天气"],["苹果","香蕉"]],禁用str.split();min_count建议≥5,避免低频噪声。

Word2Vec 模型选 Word2Vec 还是 FastText?
如果你只关心词粒度的向量(比如“苹果”“香蕉”),且语料里没有大量拼写错误、未登录词或子词结构需求,Word2Vec 就够用;FastText 虽能生成子词向量,但训练慢、内存高,对中文分词后语料收益有限。别一上来就切到 FastText,除非你明确需要处理“未出现过的词形”(如新网络用语带错别字)。
分词结果必须是二维列表,不是字符串或一维
常见错误是把句子直接喂给 Word2Vec:传入 ["今天天气很好"] 或 "今天 天气 很好",模型会把整句当一个 token 训练,完全失效。Gensim 要求输入是形如 [["今天", "天气", "很好"], ["苹果", "和", "香蕉"]] 的列表套列表。
实操建议:
- 用
jieba分词后务必调用list(jieba.lcut(sentence)),再把每个结果 append 到大列表里 - 过滤掉空字符串和纯空白符(
if word.strip()),否则""会被当成有效 token,后续相似度计算可能异常 - 避免用
str.split()做中文分词——它按空格切,中文几乎没空格
min_count 和 vector_size 怎么设才不翻车
这两个参数直接影响向量质量和内存占用,设错会导致训练失败或结果无意义:
-
min_count=1看似“不丢词”,但低频词噪声大、向量不稳定,中文语料建议从5起步,小语料(2 -
vector_size=100是平衡点:太小(如 50)区分度差;太大(如 300)内存暴涨,且中文词义在 100 维已较饱和 -
workers别盲目设成 CPU 核数——Windows 下超过 4 可能触发 GIL 争抢,反而变慢;Linux 可设min(8, os.cpu_count())
示例初始化:
from gensim.models import Word2Vec
model = Word2Vec(
sentences=tokenized_corpus, # 二维列表
vector_size=100,
window=5,
min_count=5,
workers=4,
sg=1 # 用 skip-gram,对低频词更友好
)
训练完必须调用 model.wv.save_word2vec_format() 才能导出标准格式
直接 pickle.dump(model) 或保存整个 model 对象,会导致后续无法用其他工具(如 gensim.downloader 加载方式)读取,也难做向量比对。标准二进制/文本格式才是通用接口。
注意点:
- 如果后续要加载进 PyTorch/TensorFlow,用
binary=False输出纯文本格式,方便解析 -
model.wv是向量存储主体,model本身还含训练参数,导出只需model.wv - 中文词含空格或特殊符号时,文本格式里会自动用
_替换空格,但原始分词时已去空格,一般不触发
导出示例:
model.wv.save_word2vec_format("word2vec_zh.txt", binary=False)
训练中最容易被忽略的是:语料清洗不彻底导致的低频噪声词泛滥,以及误把未分词文本当输入。这两点造成的向量漂移,比参数调优的影响大得多。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











