第七章 文本表示:主题表示(二)
目录
前置案例——文本的表示与应用
一、概念介绍
二、向量空间模型
三、主题模型LDA
四、词嵌入模型Embding
五、 哈希模型--Simhash
三、主题模型LDA
传统的向量空间模型是一种显式的文本表示方法,无法深入捕获文本中隐含的语义关系。以潜在语义分析(latent semantic analysis,LSA)、概率潜在语义分析(probabilistic latent semantic analysis,PLSA)和潜在狄利克雷分布(latent Dirich-let allocation,LDA)为代表的主题模型,旨在挖掘文本中隐含的主题(topic)或概念(concept),可以在一定程度上捕获多义性(polysemy)和同义性(synonyms),从而部分地解决一词多义和一义多词问题。同时,主题提供了一种高维文本数据维数的约减方法,将传统的向量空间模型中的高维稀疏向量转化为低维稠密向量,以缓解维数灾难问题。
LDA是一种生成式概率主题模型,广泛用于文本主题挖掘,其核心思想是将文档视为多个主题的混合,而每个主题则由特定词汇的概率分布表示。LDA是一种典型的词袋模型,即它认为一篇文档是由一组词构成的一个集合,词与词之间没有顺序以及先后的关系。一篇文档可以包含多个主题,文档中每一个词都由其中的一个主题生成。所谓词袋模型,是将一篇文档,我们仅考虑一个词汇是否出现,而不考虑其出现的顺序。在词袋模型中,“我喜欢你”和“你喜欢我”是等价的。与词袋模型相反的一个模型是n-gram,n-gram考虑了词汇出现的先后顺序。
LDA对文本数据有以下几个基本假设:
词袋假设:文档中的词序无关,单词的顺序不会影响主题建模。
主题生成假设:每个文档由若干主题混合生成,每个单词对应于某个主题。
主题分布与词分布:每篇文档的主题分布服从一个狄利克雷分布;每个主题的词分布也服从一个狄利克雷分布。
实现过程详解
(1)输入准备
输入:一组未标注的文本文档(语料库)。
预处理:分词、去停用词、词干化(如使用NLTK或jieba)。
(2)模型参数设定
K:预设的主题数量(需人工指定,可通过困惑度或一致性评分调优)。
α(alpha):文档-主题分布的先验参数,控制文档中主题的稀疏性。
β(beta):主题-词语分布的先验参数,控制主题中词语的稀疏性。
(3)生成过程(简化版)
LDA认为文档是按如下方式“生成”的:
1)对所有预设主题,分别从狄利克雷分布中采样得到每个主题的词分布(全局共享)。
2)为每篇文档从狄利克雷分布中采样,得到该文档专属的主题分布(如 [0.6, 0.3, 0.1])。
3)对文档中的每个词:
从当前文档的主题分布中随机选择一个主题;
从该主题对应的词分布中随机选择一个词输出
实际训练时,LDA 使用反向推断(如Gibbs采样或变分推断)从已有文本中还原这些分布。
(4)输出结果
文档-主题矩阵:每篇文档在K个主题上的概率分布。
主题-词语矩阵:每个主题下Top-N高概率词语列表,用于解释主题含义。
代码如下:
from gensim import corpora, models texts = [ ['人工智能', '学习', '机器', '算法'], ['猫', '宠物', '狗', '动物'], ['机器', '学习', '模型', '训练'], ['水果', '苹果', '香蕉', '营养'] ] dictionary = corpora.Dictionary(texts) corpus = [dictionary.doc2bow(text) for text in texts] lda_model = models.LdaModel( corpus, id2word=dictionary, num_topics=2, passes=20, random_state=42, # 固定随机种子 alpha='auto', # 自动学习α eta='auto' # 自动学习β ) # 打印主题-词语分布 print("主题-词语分布:") for topic_id, topic in lda_model.print_topics(num_words=4): print(f"主题 {topic_id}: {topic}") # 查看文档-主题分布 print("\n文档-主题分布:") for i, doc in enumerate(corpus): doc_topics = lda_model.get_document_topics(doc) print(f"文档 {i}: {doc_topics}")运行结果如下:
主题-词语分布: 主题 0: 0.136*"宠物" + 0.136*"猫" + 0.136*"动物" + 0.136*"狗" 主题 1: 0.132*"学习" + 0.131*"机器" + 0.079*"训练" + 0.079*"水果" 文档-主题分布: 文档 0: [(0, np.float32(0.02778941)), (1, np.float32(0.9722106))] 文档 1: [(0, np.float32(0.92947286)), (1, np.float32(0.07052716))] 文档 2: [(0, np.float32(0.027789496)), (1, np.float32(0.97221047))] 文档 3: [(0, np.float32(0.027792636)), (1, np.float32(0.97220737))]优点:可解释性强,主题可通过Top词直观命名;适合文档聚类、内容推荐等宏观分析任务。
局限:依赖词频统计,无法捕捉上下文语义;对一词多义处理能力有限(如“苹果”手机 vs 水果);对短文本效果差,因统计信号不足。
