LDA主题模型虽然有时候结果难以解释,但由于其无监督属性还是广泛被用来初步窥看大规模语料(如财经新闻)的主题分布。这篇博客侧重提供一个LDA主题模型python代码的技术实现,不侧重如何分析财经新闻(后面看需要再更)。
# -*- coding: utf-8 -*-
#import pacakge
import pandas as pd
import re
import jieba
from pprint import pprint
#load data
jieba.load_userdict("financialDict.txt") #金融字典,提升新闻分词效果
df=pd.read_csv("newsContent.csv",sep="\t")
df.sample(10) #数据结构如下

image.png
#新闻文本数字统一替换为0,多余空格去除。
def cleantext(x):
try:
result = re.sub(r'\s+', '',x)# remove double space
result = re.sub(r'\d+','0',result) #normalize number to zero
except:return "None"
return result
df["content"]=df["content"].apply(cleantext)
#分词与去除停用词
stopwords=[i.strip() for i in open("stop_words.txt",encoding="utf8")]
def fenci(lines):
newslines=[]
for line in re.split("。|!|?|;", lines):
seg_list = jieba.cut(line+"。", cut_all=False)
newslines.extend([i for i in seg_list if len(i)>1 and i not in stopwords])
return newslines
df['fenci']=df.apply(lambda x: fenci(x['content']), axis=1)
df['fenci']=df.apply(lambda x: " ".join(x['fenci']), axis=1)
#LDA 模型准备
#prepare for LDA
import gensim
import gensim.corpora as corpora
from gensim.models import CoherenceModel
texts=list(df['fenci'])
texts=[i.split(" ") for i in texts]
#建立一个数字id与对应中文字的字典
id2word = corpora.Dictionary(texts)
#去掉出现在50%以上文章中的词汇 如 的,是...取前10万个高频词
id2word.filter_extremes(no_below=1, no_above=0.5, keep_n=100000)
#为每个新闻建立一个 词汇id 词频的 统计列表
corpus = [id2word.doc2bow(text) for text in texts]
#LDA主题模型训练很耗时,一万篇文章内是比较快的,更多就明显耗时
#这个多核方法训练较快,但训练结果会有待提高
lda_model = gensim.models.LdaMulticore(corpus, num_topics=30, id2word=id2word, passes=2, workers=2)
#一般用这个模型参数,效果会更好点
lda_model = gensim.models.ldamodel.LdaModel(corpus=corpus,
id2word=id2word,
num_topics=100,
random_state=100,
update_every=1,
chunksize=100,
passes=10,
alpha='auto',
per_word_topics=True)
LDA模型训练时间比较长,模型训练好后需要将结果可视化。
#查看与可视化Topic 需要使用jupyter才能查看
pprint(lda_model.print_topics())
import pyLDAvis
import pyLDAvis.gensim # don't skip this
import matplotlib.pyplot as plt
pyLDAvis.enable_notebook()
vis = pyLDAvis.gensim.prepare(lda_model,corpus,id2word)
vis

image.png
pyLDAvis被广泛用来可视化LDA主题模型结果。如上图,一个气泡代表一个topic,气泡越大,则说明该主题在语料中比重越大。好的LDA主题模型各个气泡之间应该有更少的重叠。我训练的模型气泡1和气泡3重叠较多,看了下二者是可以合并的。右边是该主题下的具体词汇,主题2似乎与公司运营相关。
遗留问题(后面再更):
1如何确定最佳主题数,如何评估LDA主题模型的好坏
2如何找到各个主题下的代表新闻,帮助理解主题
3给定新闻如何查看其主题分布,如何预测新新闻的主题分布