[python] LDA处理文档主题分布及分词、词频、tfidf计算

本文介绍了使用Python进行LDA主题模型处理文档的方法,包括输入输出、核心代码实现,以及如何进行TF-IDF和词频TF计算。还提供了百度互动主题分布的案例分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        这篇文章主要是讲述如何通过LDA处理文本内容TXT,并计算其文档主题分布,主要是核心代码为主。其中LDA入门知识介绍参考这篇文章,包括安装及用法:
        [python] LDA处理文档主题分布代码入门笔记

        1.输入输出

        输入是test.txt文件,它是使用Jieba分词之后的文本内容,通常每行代表一篇文档。
        该文本内容原自博客:文本分析之TFIDF/LDA/Word2vec实践 ,推荐大家去阅读。
新春 备 年货 , 新年 联欢晚会
新春 节目单 , 春节 联欢晚会 红火
大盘 下跌 股市 散户
下跌 股市 赚钱
金猴 新春 红火 新年
新车 新年 年货 新春
股市 反弹 下跌
股市 散户 赚钱
新年 , 看 春节 联欢晚会
大盘 下跌 散户
        输出则是这十篇文档的主题分布,Shape(10L, 2L)表示10篇文档,2个主题。
        具体结果如下所示:
shape: (10L, 2L)
doc: 0 topic: 0
doc: 1 topic: 0
doc: 2 topic: 1
doc: 3 topic: 1
doc: 4 topic: 0
doc: 5 topic: 0
doc: 6 topic: 1
doc: 7 topic: 1
doc: 8 topic: 0
doc: 9 topic: 1
        同时调用 matplotlib.pyplot 输出了对应的文档主题分布图,可以看到主题Doc0、Doc1、Doc8分布于Topic0,它们主要描述主题新春;而Doc2、Doc3、Doc9分布于Topic1,主要描述股市。


        其过程中也会输出描述LDA运行的信息,如下图所示:


        2.核心代码

       &nbs

### 使用 TfidfVectorizer 和 CountVectorizer 进行 LDA 的方法及区别 #### 方法概述 LDA(Latent Dirichlet Allocation)是一种用于主题建模的技术,其输入通常是一个文档-词项矩阵。这个矩阵可以通过 `CountVectorizer` 或 `TfidfVectorizer` 来生成。 1. **CountVectorizer**: 它仅基于词频构建文档-词项矩阵,不考虑词的重要性或稀有性。对于 LDA 而言,这种方法更常见,因为 LDA 关注的是单词在整个语料库中的分布情况,而不是单个文档内的相对重要性[^2]。 2. **TfidfVectorizer**: 它不仅计算词频 (TF),还会引入逆文档频率 (IDF) 加权机制,使得那些频繁出现在多个文档中的通用词汇权重降低,而特定于某些文档的低频词汇权重提高。然而,在 LDA 中使用 TF-IDF 可能会改变原始词频的比例关系,影响主题建模的效果[^4]。 #### 实现代码示例 以下是分别利用两种方式创建文档-词项矩阵并应用于 LDAPython 示例: ```python from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer from sklearn.decomposition import LatentDirichletAllocation as LDA # 数据集 df['cutword'] 是预处理后的分词文本列表 texts = [" ".join(doc.split()) for doc in df['cutword']] # 使用 CountVectorizer 构造文档-词项矩阵 count_vectorizer = CountVectorizer() X_count = count_vectorizer.fit_transform(texts) lda_model_count = LDA(n_components=5, random_state=42) topics_count = lda_model_count.fit_transform(X_count) # 输出前几个主题及其对应的词分布 def display_topics(model, feature_names, no_top_words): for topic_idx, topic in enumerate(model.components_): print(f"Topic {topic_idx}:") print(" ".join([feature_names[i] for i in topic.argsort()[:-no_top_words - 1:-1]])) display_topics(lda_model_count, count_vectorizer.get_feature_names_out(), 10) # 使用 TfidfVectorizer 构造文档-词项矩阵 tfidf_vectorizer = TfidfVectorizer() X_tfidf = tfidf_vectorizer.fit_transform(texts) lda_model_tfidf = LDA(n_components=5, random_state=42) topics_tfidf = lda_model_tfidf.fit_transform(X_tfidf) # 显示由 TfidfVectorizer 得到的主题 display_topics(lda_model_tfidf, tfidf_vectorizer.get_feature_names_out(), 10) ``` #### 主要差异分析 1. **数据表示的不同**: - `CountVectorizer`: 创建纯计数形式的数据结构,适合捕捉全局性的模式。 - `TfidfVectorizer`: 添加 IDF 权重调整,更适合区分不同文档间的独特特征[^1]。 2. **对 LDA 结果的影响**: - 当采用 `CountVectorizer` 时,由于保留了纯粹的词频信息,因此可以较好地反映整体语义倾向。 - 若选用 `TfidfVectorizer` ,则可能强调个别高频次但较少见的重要术语,这可能会使部分主题偏向局部特性而非广泛适用的内容[^3]。 综上所述,虽然两者都能完成相似的任务即生成适配 LDA 输入需求的形式化表达,但在具体应用场景下需依据实际目标选取合适工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值