gensim 词向量

gensim 是 Python 里做主题建模和词向量的经典库,最出名的就是 Word2Vec、Doc2Vec、LDA 这几个模型。

安装

pip install gensim

如果要用 Word2Vec 训练,建议一起装:

pip install gensim numpy scipy

核心功能

1. Word2Vec(词向量)

把词映射成向量,语义相近的词向量距离也近。

from gensim.models import Word2Vec

# 语料:分词后的句子列表
sentences = [
    ["我", "喜欢", "自然语言", "处理"],
    ["他", "喜欢", "机器学习"],
    ["她", "热爱", "深度学习"],
    ["自然语言", "处理", "和", "机器学习", "很", "相关"],
]

# 训练
model = Word2Vec(
    sentences,
    vector_size=100,   # 向量维度
    window=5,          # 上下文窗口
    min_count=1,       # 忽略词频低于此值的词
    workers=4,         # 并行线程
    epochs=10          # 训练轮数
)

# 获取词向量
vec = model.wv["自然语言"]        # 100维向量
print(vec.shape)

# 找相似词
print(model.wv.most_similar("机器学习", topn=3))

# 词类比:国王 - 男人 + 女人 ≈ 女王
# model.wv.most_similar(positive=["女人", "国王"], negative=["男人"])

2. Doc2Vec(文档向量)

把整篇文档映射成向量,适合文本分类、相似度计算。

from gensim.models.doc2vec import Doc2Vec, TaggedDocument

# 准备数据:每篇文档打上标签
docs = [
    TaggedDocument(words=["我", "喜欢", "自然语言", "处理"], tags=["doc1"]),
    TaggedDocument(words=["他", "喜欢", "机器学习"], tags=["doc2"]),
    TaggedDocument(words=["深度", "学习", "很", "有趣"], tags=["doc3"]),
]

model = Doc2Vec(
    docs,
    vector_size=100,
    window=5,
    min_count=1,
    workers=4,
    epochs=20
)

# 获取文档向量
vec = model.dv["doc1"]

# 找相似文档
similar = model.dv.most_similar("doc1", topn=2)
print(similar)

3. LDA(主题模型)

从文档集合里自动发现主题。

from gensim import corpora
from gensim.models import LdaModel

# 语料
texts = [
    ["自然语言", "处理", "文本", "分析"],
    ["机器学习", "算法", "模型", "训练"],
    ["深度学习", "神经网络", "卷积"],
    ["文本", "分类", "情感", "分析"],
]

# 构建词典和词袋
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]

# 训练 LDA,指定 2 个主题
lda = LdaModel(
    corpus=corpus,
    id2word=dictionary,
    num_topics=2,
    passes=10,
    random_state=42
)

# 查看主题词
for topic in lda.print_topics(num_words=4):
    print(topic)

# 推断新文档的主题分布
new_doc = ["文本", "分析", "情感"]
new_bow = dictionary.doc2bow(new_doc)
print(lda.get_document_topics(new_bow))

4. 加载预训练模型

from gensim.models import KeyedVectors

# 加载 Google News 预训练词向量(需要先下载)
# model = KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)

# 加载 glove
# model = KeyedVectors.load_word2vec_format('glove.6B.100d.txt', binary=False, no_header=True)

# 使用
# print(model.most_similar("king"))

常用模型对比

模型 用途 输出
Word2Vec 词向量 每个词一个向量
Doc2Vec 文档向量 每篇文档一个向量
FastText 词向量(含子词) 能处理未登录词
LDA 主题建模 文档-主题分布
TF-IDF 关键词权重 词的重要性

保存和加载

# 保存
model.save("word2vec.model")

# 加载
from gensim.models import Word2Vec
model = Word2Vec.load("word2vec.model")

# 只保存词向量(体积更小)
model.wv.save("word2vec.kv")
from gensim.models import KeyedVectors
wv = KeyedVectors.load("word2vec.kv")

常见坑

  1. 中文要先分词:gensim 不负责分词,用 jieba 先处理。

    import jieba
    sentences = [list(jieba.cut(text)) for text in raw_texts]
    
  2. min_count 别设太低:词频太低的词训练出来没意义,一般设 5 或 10。

  3. 数据量要大:Word2Vec 效果依赖语料规模,几十条句子只能验证流程,真正用得上百万级。

  4. vector_size 不是越大越好:一般 100~300 足够,太大反而过拟合。

你是要做中文文本还是英文?具体场景是什么(相似度、分类、推荐)?我可以给你更针对性的示例。

posted @ 2026-09-27 15:48  AceFenix  阅读(3)  评论(0)    收藏  举报