Python分析国家领导人新春贺词建立主题模型

主题建模可以帮助开发人员直观地理解和探索数据,以便更好地挖掘语料库中的主题。成功的主题建模需要多次迭代:清洗数据、读取结果、相应地调整预处理并重试。本文通过分析国家领导人从2014年到2021年的新春贺词的主题,对文本数据进行预处理,建立主题模型,模型验证,模型可视化等操作,最后通过主题模型总结出从中获得的信息。具体实现过程如下:

1、数据预处理

本文的文本数据为国家领导人从2014年到2021年的新春贺词,利用os模块对数据进行批量读取,对文本数据中的换行符和空格进行replace处理。然后,除了spaCy本身自带的停用词列表,自定义多加入两个停用词“年”和“国家”,(第一次建模时直接使用spaCy自带的停用词列表,通过结果发现“年”和“国家”这两个关键词在文本中出现多次,但这两词本身对该文本分析的意义不大,所以加入自定义的停用词列表中。)再对其进行停用词处理。代码如下:

data = []
for file in files:
    for i in open(file,"r",encoding="utf-8"):
	text = i.replace('\n','').replace('\u3000','')
        data.append(text)

stopwords = ('年', '国家')

nlp=spacy.load('zh_core_web_sm')
#分词
texts=[]
for document in data:
    doc = nlp(document)
    text = []
    for w in doc:
        if not w.is_stop and not w.is_punct and not w.like_num:
            text.append(w.text)
            for stopword in stopwords:
                w = nlp.vocab[stopword]
                w.is_stop = True
    texts.append(text)

通过上述对数据进行预处理后,可以开始建立LDA主题模型。

2、建立主题模型并验证

通过上述分词后,利用corpora对每个词进行编码,构造一个词典。然后基于词典,把词变为稀疏向量,并将向量放入列表中,形成稀疏向量集,最后通过models模块建立LDA主题模型,进行主题推断。代码如下:

#构造词典
dictionary = corpora.Dictionary(texts)
# 基于词典,使【词】→【稀疏向量】,并将向量放入列表,形成【稀疏向量集】
corpus = [dictionary.doc2bow(text) for text in texts]
# lda模型,num_topics设置主题的个数
print("corpus:",corpus)
lda = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=2)
# 打印所有主题,每个主题显示4个词
for topic in lda.print_topics(num_words=4):
    print(topic)
# 主题推断
print("主题推断:",lda.inference(corpus)) ##文档分布

其中,每个步骤打印的结果如下:
稀疏向量集结果
主题打印:

打印主题结果
主题推断:

主题推断结果

另外,除了建立LDA主题模型,本文还通过gensim模块分别建立LDA、LSI和HDP模型进行对比,代码如下:

from gensim.models.coherencemodel import CoherenceModel
##建立模型
lda1 = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=2)
lsi1 = models.lsimodel.LsiModel(corpus=corpus, id2word=dictionary, num_topics=2)
hdp1 = models.hdpmodel.HdpModel(corpus=corpus, id2word=dictionary)
##比较模型
#print(corpus)
lda_coherence = CoherenceModel(model = lda1, texts=texts, dictionary=dictionary, coherence='c_v')
lsi_coherence = CoherenceModel(model = lsi1, texts=texts, dictionary=dictionary, coherence='c_v')
hdp_coherence = CoherenceModel(model = hdp1, texts=texts, dictionary=dictionary, coherence='c_v')
##输出比较结果
print(lda_coherence.get_coherence())
print(lsi_coherence.get_coherence())
print(hdp_coherence.get_coherence())

输出结果如下:
模型对比结果
从上述结果可以看出,HDP模型的分数最高,而LDA结果不太理想,证明主题模型一致性不高,这也是后期需要改进的地方。
并对其进行交叉验证,选择一致性最大的值(正负值都有意义)来对主题个数进行选择,代码如下:

c_v = []
for num_topics in range(1, 19):
        lm = models.ldamodel.LdaModel(corpus=corpus, num_topics=num_topics, id2word=dictionary)
        cm = CoherenceModel(model=lm, texts=texts, dictionary=dictionary,coherence='c_v')
        c_v.append(cm.get_coherence())
print(c_v)

输出结果如下:
交叉验证结果

3、模型可视化

最后,可以通过pyLDAvis模块对该模型进行可视化,但因为版本问题,可视化无法再notebook内显示(还未解决该问题),这里先放代码:

import pyLDAvis.gensim
data = pyLDAvis.gensim.prepare(lda, corpus, dictionary)
#data = pyLDAvis.sklearn.prepare(lda_model, doc_term_matrix, vectorizer)
#让可视化可以在notebook内显示
pyLDAvis.display(data)

4、结论

从上述主题推断和其余相关结果可以看出,从2013年到2021年的新春贺词中,国家领导人的主题都为对全国人民的新春祝福,和对过去一年国家政府在改革方面所做的工作成果和未来发展方向。另外,领导人也对每年都对台湾、香港、澳门同胞致以最真挚的问候和祝福。同时,对中国在世界的影响做了总结,从中可以看出中国的世界地位在逐步上升,构建人类命运共同体也是中国近年来的期望之一。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Gensim是一个相当专业的主题模型Python工具包。在文本处理中,比如商品评论挖掘,有时需要了解每个评论分别和商品的描述之间的相似度,以此衡量评论的客观性。评论和商品描述的相似度越高,说明评论的用语比较官方,不带太多感情色彩,比较注重描述商品的属性和特性,角度更客观。gensim就是  Python 里面计算文本相似度的程序包。示例代码:针对商品评论和商品描述之间的相似度,怎么使用gensim来计算?原理1、文本相似度计算的需求始于搜索引擎。搜索引擎需要计算“用户查询”和爬下来的众多”网页“之间的相似度,从而把最相似的排在最前返回给用户。2、主要使用的算法是tf-idftf:term frequency词频idf:inverse document frequency倒文档频率主要思想是:如果某个词或短语在一篇文章中出现的频率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。第一步:把每个网页文本分词,成为词包(bag of words)。第三步:统计网页(文档)总数M。第三步:统计第一个网页词数N,计算第一个网页第一个词在该网页中出现的次数n,再找出该词在所有文档中出现的次数m。则该词的tf-idf 为:n/N * 1/(m/M) (还有其它的归一化公式,这里是最基本最直观的公式)第四步:重复第三步,计算出一个网页所有词的tf-idf 值。第五步:重复第四步,计算出所有网页每个词的tf-idf 值。3、处理用户查询第一步:对用户查询进行分词。第二步:根据网页库(文档)的数据,计算用户查询中每个词的tf-idf 值。4、相似度的计算使用余弦相似度来计算用户查询和每个网页之间的夹角。夹角越小,越相似。 标签:Gensim
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值