jieba分词以及LDA主题提取(python)
⼀、环境配置
在运⾏分词之前⾸先要确定Python已经正确安装,这⾥我安装的是python3.9,但建议安装低⼀个版本的,如python3.8,因为有些包在pip install安装的时候不⽀持最新版本。
其次,本⽂需要⽤到lda、jieba、numpy、wordcloud等主要的包。如果发现pip安装出现错误,可以上⼿动安装whl格式的包,在⽹页中利⽤Ctrl+F快速查到相应包,如果发现这⾥⾯没有,⽐如lda包,还有个⽹站提供后缀的压缩包,具体安装⽅式百度,主要就是⽤python setup.py install安装命令。
⼆、jieba分词-数据预处理
这⾥采⽤的是jieba分词,代码如下所⽰,相关数据及代码⽂件可以在下载,在复现时需要根据⾃⼰的⽂件名称修改下⾯的⽂件名称。(3.31补充:有同学反馈github因为某些原因,有时上不去,这⾥给上⽹盘地址,⼀个是只有500个的短⽂本版本,可以快速复现,另⼀个是完整的30M长⽂本-需要久点跑完)
springer投稿状态
import jieba
from os import path  #⽤来获取⽂档的路径
import jieba.analyse as anls
from PIL import Image
import numpy as  np
import matplotlib.pyplot as plt
#词云⽣成⼯具
from wordcloud import WordCloud,ImageColorGenerator
#需要对中⽂进⾏处理
import matplotlib.font_manager as fm
#背景图
bg=np.array(Image.open("boy.png"))
#获取当前的项⽬⽂件加的路径
d=path.dirname(__file__)
#读取停⽤词表
stopwords =[line.strip()for line in open('', encoding='UTF-8').readlines()]
#读取要分析的⽂本
text_path=""
#读取要分析的⽂本,读取格式
text=open(path.join(d,text_path),encoding="utf8").read()
text_split = jieba.cut(text)# 未去掉停⽤词的分词结果  list类型
#去掉停⽤词的分词结果  list类型
text_split_no =[]
for word in text_split:
if word not in stopwords:
text_split_no.append(word)
#print(text_split_no)
fW =open('','w',encoding ='UTF-8')
python入门教程网盘
fW.write(' '.join(text_split_no))
fW.close()
text_split_no_str =' '.join(text_split_no)#list类型分为str
with open('',"r",encoding ='UTF-8')as r:
lines =r.readlines()
with open('',"w",encoding ='UTF-8')as w:
for line in lines:
if len(line)>2:
w.write(line)
fW =open('','w',encoding ='UTF-8')
fW.write(' '.join(text_split_no))
fW.close()
text_split_no_str =' '.join(text_split_no)#list类型分为str
#基于tf-idf提取关键词
print("基于TF-IDF提取关键词结果:")
keywords =[]
for x, w act_tags(text_split_no_str, topK=200, withWeight=True):
keywords.append(x)#前200关键词组成的list
keywords =' '.join(keywords)#转为str
print(keywords)
print("基于词频统计结果")
txt =open("","r", encoding="UTF-8").read()
words = jieba.cut(txt)
counts ={}
for word in words:
if len(word)==1:
continue
sql语句default约束怎么用else:
rword = word
counts[rword]= (rword,0)+1
items =list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
for i in range(33):
入库单模板表格word, count=items[i]
print((word),count)
#⽣成
wc=WordCloud(
background_color="white",
max_words=200,
mask=bg,#设置词云形状,改为mask =None;默认⽣成矩形图云
黎曼zeta函数
max_font_size=60,
scale=16,
random_state=42,
font_path='f'#中⽂处理,⽤国标⿊体字体,如果系统没有需将附件的字体⽂件放到代码⽬录下).generate(keywords)
#为图⽚设置字体
my_font=fm.FontProperties(fname='f')
#产⽣背景图⽚,基于彩⾊图像的颜⾊⽣成器
image_colors=ImageColorGenerator(bg)
#开始画图
plt.imshow(wc,interpolation="bilinear")
#为云图去掉坐标轴
plt.axis("off")
#画云图,显⽰
#plt.figure()
plt.show()
#为背景图去掉坐标轴
plt.axis("off")
plt.imshow(bg,ay)
#plt.show()
#保存云图
<_file("ciyun.png")
print("词云图⽚已保存")
这⾥是处理前和处理后的结果
在代码实例中还加⼊了词云导出的功能,如下所⽰
三、LDA主题提取
address缩写基于第⼆步的jieba分词,可以得到分词后的⽂件,下⾯进⾏LDA主题提取。
在LDA模型拟合步骤中,需要修改的参数主要是num_topic和alpha,前者num_topic,即话题数量,通过不断地尝试得到⼀个合适的值,⼀般从10到100都可以取,后者⼀般取成话题数量的倒数,如10个数量,取成0.1,⼀般偏⼩较好。
import numpy as np
from gensim import corpora, models
if __name__ =='__main__':
# 读⼊⽂本数据
f =open('', encoding='utf-8')# 输⼊已经预处理后的⽂本
texts =[[word for word in line.split()]for line in f]
f.close()
M =len(texts)
print('⽂本数⽬:%d 个'% M)
# 建⽴词典
dictionary = corpora.Dictionary(texts)
V =len(dictionary)
print('词的个数:%d 个'% V)
# 计算⽂本向量g
corpus =[dictionary.doc2bow(text)for text in texts]# 每个text对应的稀疏向量
# 计算⽂档TF-IDF
corpus_tfidf = models.TfidfModel(corpus)[corpus]
# LDA模型拟合
num_topics =10# 定义主题数
lda = models.LdaModel(corpus_tfidf, num_topics=num_topics, id2word=dictionary,
alpha=0.01, eta=0.01, minimum_probability=0.001,
update_every=1, chunksize=100, passes=1)
# 所有⽂档的主题
doc_topic =[a for a in lda[corpus_tfidf]]
print('Document-Topic:')
print(doc_topic)
# 打印⽂档的主题分布
num_show_topic =5# 每个⽂档显⽰前⼏个主题
print('⽂档的主题分布:')
doc_topics = _document_topics(corpus_tfidf)# 所有⽂档的主题分布
idx = np.arange(M)# M为⽂本个数,⽣成从0开始到M-1的⽂本数组
for i in idx:
topic = np.array(doc_topics[i])
topic_distribute = np.array(topic[:,1])
topic_idx = topic_distribute.argsort()[:-num_show_topic -1:-1]# 按照概率⼤⼩进⾏降序排列print('第%d个⽂档的前%d个主题:'%(i, num_show_topic))
print(topic_idx)
print(topic_distribute[topic_idx])
# 每个主题的词分布
num_show_term =15# 每个主题显⽰⼏个词
for topic_id in range(num_topics):
print('主题#%d:\t'% topic_id)
term_distribute_all = _topic_terms(topicid=topic_id)# 所有词的词分布
term_distribute = term_distribute_all[:num_show_term]# 只显⽰前⼏个词
term_distribute = np.array(term_distribute)
term_id = term_distribute[:,0].astype(np.int)
print('词:', end="")
for t in term_id:
print(dictionary.id2token[t], end=' ')
print('概率:', end="")
print(term_distribute[:,1])
# 将主题-词写⼊⼀个⽂档 ,每个主题显⽰20个词
with open('','w', encoding='utf-8')as tw:
for topic_id in range(num_topics):
term_distribute_all = _topic_terms(topicid=topic_id, topn=20)
term_distribute = np.array(term_distribute_all)
term_id = term_distribute[:,0].astype(np.int)
for t in term_id:
tw.write(dictionary.id2token[t]+" ")
tw.write("\n")
可得结果如下:
参考

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。