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")
常见坑
-
中文要先分词:gensim 不负责分词,用
jieba先处理。import jieba sentences = [list(jieba.cut(text)) for text in raw_texts] -
min_count别设太低:词频太低的词训练出来没意义,一般设 5 或 10。 -
数据量要大:Word2Vec 效果依赖语料规模,几十条句子只能验证流程,真正用得上百万级。
-
vector_size不是越大越好:一般 100~300 足够,太大反而过拟合。
你是要做中文文本还是英文?具体场景是什么(相似度、分类、推荐)?我可以给你更针对性的示例。
本文来自博客园,作者:AceFenix,转载请注明原文链接:https://www.cnblogs.com/ukzq/p/23133890

浙公网安备 33010602011771号