主题建模101:从文本中发现隐藏主题的技术解析

主题建模101:从文本中发现隐藏主题的技术解析

【免费下载链接】Data-Science-45min-Intros Ipython notebook presentations for getting starting with basic programming, statistics and machine learning techniques 【免费下载链接】Data-Science-45min-Intros 项目地址: https://gitcode.com/gh_mirrors/dat/Data-Science-45min-Intros

什么是主题建模?

主题建模是一种无监督的机器学习技术,用于从大量文本数据中发现隐藏的主题结构。它能够自动识别文档集合中反复出现的主题模式,并将相似的文档归类到一起。这项技术在文本挖掘、信息检索和自然语言处理领域有着广泛应用。

核心概念解析

在深入主题建模之前,我们需要明确几个关键术语:

  1. 文档(Document):文本的基本单位,可以是一条推文、一篇文章或一个段落
  2. 文本语料库(Text Corpus):分析所用的文档集合,是所有待分析文本的汇总
  3. 词典(Dictionary):将文本中的词条(token)映射到唯一ID的数据结构
  4. 向量语料库(Vector Corpus):将文档转换为词频向量的集合,每个词条表示为(词条ID, 文档频率)的元组

预处理:停用词处理

主题建模的质量很大程度上取决于预处理步骤,其中停用词处理尤为关键。停用词是指在文本中出现频率很高但对主题区分贡献不大的词语(如"的"、"是"、"在"等)。

from nltk.corpus import stopwords
import pprint as pp

# 加载英文停用词
stopset = set(stopwords.words('english'))

# 自定义停用词
stopset.update(["ruby tuesday"])  # 添加特定停用词
stopset.remove("own")             # 移除不应被视为停用词的词

# 多语言停用词处理
langs = ['danish', 'dutch', 'english', 'french', 'german', 
         'italian', 'norwegian', 'portuguese', 'russian', 
         'spanish', 'swedish']
stop_list = []
for lang in langs:
    stop_list.extend(stopwords.words(lang))
stop_words_set = set(stop_list)  # 合并多语言停用词

构建文本语料库

主题建模的第一步是准备文本数据。通常,我们会从文件中读取文本,每行作为一个独立的文档:

with open('text_corpus.txt', 'r') as f:
    documents = []
    for line in f.readlines():
        documents.append(line.strip())
pp.pprint(documents)

创建词典与特征选择

构建词典是主题建模的关键步骤,它决定了哪些词语会被纳入模型考虑范围:

from gensim import corpora, models, similarities
import logging

# 创建初始词典
dictionary = corpora.Dictionary(line.lower().split() 
               for line in open('text_corpus.txt'))

# 移除停用词和低频词
stop_ids = [dictionary.token2id[stopword] 
            for stopword in stop_words_set 
            if stopword in dictionary.token2id]
once_ids = [tokenid for tokenid, corpus_freq in dictionary.dfs.items() 
            if corpus_freq == 1]
dictionary.filter_tokens(bad_ids=stop_ids + once_ids)
dictionary.compactify()

词典支持动态更新,这对于处理流式数据特别有用:

import copy
docs = [[item for item in "新增文档内容".lower().split() 
         if item not in stop_ids]]
d = copy.deepcopy(dictionary)
d.add_documents(docs)
d.compactify()

向量化表示

将文本转换为数值向量是机器学习处理文本的关键步骤。我们使用词袋模型(Bag-of-Words)表示:

vector_corpus = []
with open('text_corpus.txt', 'r') as f:
    for line in f.readlines():
        vector_corpus.append(dictionary.doc2bow(line.lower().split()))

TF-IDF加权

TF-IDF(词频-逆文档频率)是一种常用的文本特征加权方法,它能降低常见词的权重,提高有区分度词的权重:

tfidf = models.TfidfModel(vector_corpus, normalize=False)
corpus_tfidf = tfidf[vector_corpus]

TF-IDF的计算公式为:

TF-IDF = (词在文档中的频率) × ln(语料库中文档总数/包含该词的文档数)

主题建模算法比较

潜在语义索引(LSI)

LSI通过奇异值分解(SVD)将文档从TF-IDF空间映射到低维潜在语义空间:

lsi = models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=3)
corpus_lsi = lsi[corpus_tfidf]

潜在狄利克雷分配(LDA)

LDA是一种完全概率生成模型,假设文档是由多个主题混合生成的:

lda = models.ldamodel.LdaModel(corpus_tfidf, id2word=dictionary, 
                              num_topics=3, update_every=1, 
                              chunksize=10000, passes=1)
corpus_lda = lda[corpus_tfidf]

LDA的图模型表示使用"盘子表示法",其中:

  • M表示文档数量
  • N表示文档中的词数
  • α是文档-主题分布的狄利克雷先验参数
  • β是主题-词分布的狄利克雷先验参数
  • θᵢ是文档i的主题分布
  • φₖ是主题k的词分布
  • zᵢⱼ是文档i中第j个词的主题
  • wᵢⱼ是具体的词

主题聚类与结果分析

通过设定阈值,我们可以将文档分配到不同主题:

# 计算阈值
scores = list(chain(*[[score for topic,score in topic] 
                      for topic in [doc for doc in corpus_lda]]))
threshold = sum(scores)/len(scores)

# 文档聚类
cluster1 = [j for i,j in zip(corpus_lda,documents) if i[0][1] > threshold]
cluster2 = [j for i,j in zip(corpus_lda,documents) if i[1][1] > threshold]
cluster3 = [j for i,j in zip(corpus_lda,documents) if i[2][1] > threshold]

总结

主题建模是文本分析中强大的无监督学习技术。通过本文介绍的方法,你可以:

  1. 预处理文本数据(停用词处理、词干提取等)
  2. 构建文档-词矩阵
  3. 应用TF-IDF加权
  4. 使用LSI或LDA算法发现潜在主题
  5. 将文档聚类到不同主题

实际应用中,主题建模可用于新闻分类、用户反馈分析、学术文献归类等多种场景。理解这些基础概念和方法,是掌握更高级文本分析技术的重要第一步。

【免费下载链接】Data-Science-45min-Intros Ipython notebook presentations for getting starting with basic programming, statistics and machine learning techniques 【免费下载链接】Data-Science-45min-Intros 项目地址: https://gitcode.com/gh_mirrors/dat/Data-Science-45min-Intros

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值