基于财经新闻的LDA主题模型实现:Python

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) #数据结构如下

基于财经新闻的LDA主题模型实现:Python_第1张图片

#新闻文本数字统一替换为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)


#查看与可视化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

基于财经新闻的LDA主题模型实现:Python_第2张图片

pyLDAvis被广泛用来可视化LDA主题模型结果。如上图,一个气泡代表一个topic,气泡越大,则说明该主题在语料中比重越大。好的LDA主题模型各个气泡之间应该有更少的重叠。我训练的模型气泡1和气泡3重叠较多,看了下二者是可以合并的。右边是该主题下的具体词汇,主题2似乎与公司运营相关。

遗留问题(后面再更):

1如何确定最佳主题数,如何评估LDA主题模型的好坏

2如何找到各个主题下的代表新闻,帮助理解主题

3给定新闻如何查看其主题分布,如何预测新新闻的主题分布

 

 

你可能感兴趣的:(data,mining/machine,learning)