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

本文介绍了如何使用Python的gensim库实现LDA主题模型,以进行财经新闻的主题分类。通过预处理新闻内容,如替换数字、分词、去除停用词,然后构建词汇表和文档向量,最后训练LDA模型并进行可视化。文章指出,LDA模型的气泡大小代表主题比重,好的模型应有较少的重叠,并提出了如何确定最佳主题数、找到主题代表新闻及预测新新闻主题等问题。

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给定新闻如何查看其主题分布,如何预测新新闻的主题分布

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值