主题建模可以帮助开发人员直观地理解和探索数据,以便更好地挖掘语料库中的主题。成功的主题建模需要多次迭代:清洗数据、读取结果、相应地调整预处理并重试。本文通过分析国家领导人从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)) ##文档分布

其中,每个步骤打印的结果如下:

python主题强度分析 python 主题建模_主题模型


主题打印:

python主题强度分析 python 主题建模_python主题强度分析_02


主题推断:

python主题强度分析 python 主题建模_机器学习_03

另外,除了建立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())

输出结果如下:

python主题强度分析 python 主题建模_机器学习_04


从上述结果可以看出,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)

输出结果如下:

python主题强度分析 python 主题建模_python_05

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