话题模型-topic model

主题模型综述

reference:http://blog.youkuaiyun.com/xianlingmao/article/details/7076165

                     http://blog.sina.com.cn/s/blog_5033f3b40101flbj.html

1.

话题模型(topic model)的提出及发展历史

topic model 是一种应用十分广泛的产生式模型(generative model),在IR, NLP,ML都有广泛的应用,本文将对目前已有的topic model进行分类总结,然后选择几个代表性的topic model进行较为详细的介绍,从而理解topic model 的思想,以及怎么应用。

topic model最经典的模型之一是LDA(latent dirichlet allocation) ,其它的topic model大都充分利用了LDA的思想去设计,所以下面先简单地描述一下其生成一个文档集合过程:


Topic Model (LDA)认为一个离散数据集合(如文档集合,图片集合,为行文方便,本文统统以文档集合作为描述对象,其他的数据集合只需换掉对应的术语即可)是由隐含在数据集合背后的topic set 生成的,这个set中的每一个topic都是词的概率分布。对于文档中的每一篇文档,先抽取一个topics proportion \theta;然后对于这个文档中的每一个词的位置 w_i, LDA 先从\theta中选择一个topic,然后再从这个topic对应的词分布中选择一个词去填充;按照上述步骤直到整个文档集合产生完毕。


下面我会把目前出现的topic models进行分门别类,小结。

我认为topic models主要可以分为四大类:1)无监督的、无层次结构的topic model;2)无监督的、层次结构的topic model;3)有监督的、无层次结构的topic model;4)有监督的、层次结构的topic model。

对于1)主要有: PLSA, LDA, Correlated Topic Model, PAM,Concept Topic Model等

对于2)主要有: HLDA, HDP,HPAM等

对于3)主要有: S-LDA, Disc-LDA, MM-LDA, Author-Model, Labeled LDA, PLDA 等等

对于4)主要有: hLLDA, HSLDA

以上模型对应的文章名字,用google直接搜索即可得到,这里就不列出。


下面对于每一类topic model,我都选择一个模型来进行介绍:

对于1) 上述已经介绍了LDA,所以就不介绍这类模型了;

对于2) 我想介绍HLDA(Hierarchical Latent Dirichlet Allocation) 模型

由于LDA产生出来的topic都是孤立的,topic之间没有关系,HLDA模型在LDA的基础上,试图建立topic之间的层次关系,同时考虑到LDA需要指定topic的数量作为参数,如果能自动决定topic的数量就比较理想了。为了自动发现决定topic的数量,HLDA用Chinese Restaurant  Process去自动决定每一层的topic数量,然而需要指定topic层次的高度H(也就是有多少层的topic),同时它训练出来的层次结构是等高的,都是H这么高。至于怎么产生文档的每个词,这个和LDA都是一样的。

对于3) 我想介绍Labeled LDA (Labeled Latent Dirichlet Allocation) 模型

这个模型最大的好处是能够训练出来带标签的topic,因为在以前的topic model训练出来的topic都是分布,怎么赋予一个标签给这些topic则是很难的一个问题。

Labeled LDA与LDA最大的不同是: LDA是在所有topics上为某一个词进行选择某个topic,而labeled LDA则是只从文档相关的label对应的topic中去选择,其余和LDA都是一样的。

对于4) 我想介绍hLLDA (hierarchical Labeled Latent Dirichlet Allocation)模型

这个模型最大的好处就是在Labeled Latent Dirichlet Allocation模型的基础上扩展到层次结构,其思想也是很简单的,认为一个文档只是由这个文档对应的层次label所产生,具体学习和推断的时候几乎和Labeled Latent Dirichlet Allocation模型一样。


这些模型相对来说都是较为容易理解的,关键是要先理解LDA,包括数学公式的推导,如果LDA能弄得比较清楚,其它的模型就会非常的容易理解。

 ————————————————————————————————————————————————————————————————

2.

以下内容主要基于《Latent Dirichlet Allocation,JMLR-2003一文,另加入了一些http://blog.sina.com.cn/s/blog_5033f3b40101flbj.html的理解 

LDA-Latent Dirichlet Allocation

JMLR-2003

 

摘要:本文讨论的LDA是对于离散数据集,如文本集,的一种生成式概率模型。LDA是一个三层的贝叶斯分层模型,将数据集中每一项,如每个文本,建模为某些未知的topic组成的集合的混合。每个topic又建模为某种混合概率分布。在文本建模中,话题的概率就提供了每个doc的具体表示。

个人理解:1.生成式模型,就好像我们要写出一篇文章(生成一篇文档),我们在下笔的时候脑袋里要先有这个文章的主题,然后在这个主题下再构建合适的词来组成文档。这样的过程就是这篇文章里‘生成’的过程。

2.doc->mixture of topics; 每个topic->mixture of words,文中的Dirichlet分布也体现在这个分布的分布上,原因后续讲解。

 

基础知识,如果都懂,可以跳过:

一、tf-idf scheme

tf-idf scheme: 首先选中一个基字典basic vocabulary, 然后对每一个文档doc,查找每个词word的出现次数,然后进行归一化,最后得到的表示形式为一个term-by-document的矩阵X,而将任意长度的doc表示成固定长度的一个向量,而所有的doc则可以用一个list,也就是矩阵X,来表示:

                                          doc_1      doc _2     …    doc _ N

word_1          *     *           …    *

### 如何解决BERTopic模型Topic-1的问题或优化其表现 在使用 BERTopic 进行话题建模时,如果发现某个特定主题(如 Topic-1)存在问题或者表现不佳,可以采取多种策略来改进。以下是可能的原因以及对应的解决方案: #### 1. 数据质量问题 如果输入的数据质量较差,可能会导致某些主题的质量下降。例如,数据中可能存在噪声、重复项或其他无关内容。 - **清洗数据**:移除停用词、特殊字符和无意义的短语[^1]。 - **过滤不相关文档**:通过预处理阶段筛选掉与目标领域无关的内容。 ```python import re from nltk.corpus import stopwords def clean_text(text): stop_words = set(stopwords.words('english')) text = re.sub(r'[^\w\s]', '', text.lower()) # 移除非字母数字字符并转为小写 words = text.split() filtered_words = [word for word in words if word not in stop_words] return ' '.join(filtered_words) cleaned_data = data['content'].apply(clean_text) ``` --- #### 2. 嵌入表示不足 BERTopic 使用嵌入向量作为基础,因此嵌入的质量直接影响主题的效果。 - **调整嵌入模型**:尝试不同的语言模型(如 `paraphrase-MiniLM-L6-v2` 或其他 Sentence-BERT 变体),以获得更优的上下文表示[^1]。 - **增加训练样本数量**:更多的数据可以帮助模型学习更加丰富的特征。 ```python from sentence_transformers import SentenceTransformer embedding_model = SentenceTransformer("all-MiniLM-L6-v2") # 更改嵌入模型 topic_model = BERTopic(embedding_model=embedding_model) topics, probs = topic_model.fit_transform(cleaned_data) ``` --- #### 3. 聚类参数设置不当 聚类算法的选择及其超参数会影响最终的主题划分效果。 - **修改聚类算法**:默认情况下,BERTopic 使用 HDBSCAN 进行聚类。可以通过更改距离度量方式或最小簇大小等参数提升性能。 - **重新定义主题边界**:对于模糊不清的主题,可适当降低阈值或将相似子群合并。 ```python from hdbscan import HDBSCAN hdbscan_model = HDBSCAN(min_cluster_size=10, metric='euclidean', cluster_selection_method='eom') topic_model = BERTopic(hdbscan_model=hdbscan_model) topics, probs = topic_model.fit_transform(cleaned_data) ``` --- #### 4. 关键词提取不够精准 有时,即使整体框架正常运行,个别主题的关键术语仍显得不合理。 - **自定义关键词权重计算逻辑**:利用 TF-IDF 方法增强稀有但重要的词语的重要性[^2]。 - **手动干预校正**:针对具体场景需求微调部分高频干扰词汇的影响因子。 ```python vectorizer_model = CountVectorizer(ngram_range=(1, 2), stop_words="english") topic_model = BERTopic(vectorizer_model=vectorizer_model) topics, probs = topic_model.fit_transform(cleaned_data) ``` --- #### 5. 结果可视化辅助诊断 借助可视化工具有助于快速定位异常现象所在位置,并验证上述措施的实际成效。 - 绘制主题分布图谱以便直观感受各组间关系紧密程度; - 对比不同版本间的差异从而选取最佳配置组合方案。 ```python fig = topic_model.visualize_topics() fig.show() ``` --- ### 总结 通过对原始资料进一步加工整理、选用更适合当前任务特性的算法组件以及合理调节各项控制变量等方式均能有效改善单一指定主题的表现状况。实际操作过程中需结合具体情况灵活运用以上建议达成预期目的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值