LDA模型是什么,LDA模型干嘛用的

  LDA模型是什么,LDA模型干嘛用的

  

1.LDA模型简介

(摘自百度百科)

  LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,也称为三层贝叶斯概率模型,包括词、主题和文档三层。所谓生成模型,就是我们认为文章中的每一个词都是通过“以一定的概率选择一个话题,再以一定的概率从这个话题中选择一个词”的过程获得的。文档到主题服从多项式分布,主题到单词服从多项式分布。

  LDA是一种无监督的机器学习技术,可以用来识别大规模文档集合或语料库中隐藏的主题信息。它采用词袋的方法,将每篇文档视为一个词频向量,从而将文本信息转化为易于建模的数字信息。而词袋法不考虑词与词之间的顺序,简化了问题的复杂性,为模型的改进提供了契机。每个文档代表一个由一些主题组成的概率分布,每个主题代表一个由许多单词组成的概率分布。

  

2.LDA生成过程

(摘自百度百科)

  对于语料库中的每个文档,LDA定义了以下生成过程:

  1.对于每个文档,从主题分布中抽取一个主题;

  2 .从提取的主题对应的词分布中提取词;

  3.重复上述过程,直到文档中的每个单词都被遍历。

  语料库中的每个文档对应于T的多项式分布(预先通过试错法等给出。)主题,多项式分布表示为。每个主题对应于词汇中V个单词的多项式分布,并且该多项式分布被表示为。

  

3.LDA模型实践(Python)

  导入所需的库

  从gensim import corporation导入panda作为PD导入从gensim import corporation重新导入jieba,模型,从pprint导入pprint导入numpy作为NP导入时间输入处理数据的相似性

  2=PD . read _ excel( 1 . xlsx )data 2 _ LDA=data 2[ details ]data 2 _ LDA . shape data 2 _ LDA . drop _ duplicates()机械压缩

  def condense_1(str): for i in [1,2]: j=0 while j len(str)-2*i: #判断if str[j:j I]==str[j I:j 2 * I]and str[j:j I]==str[j 2 * I:j 3 * I]:k=j 2 *。==str[ki:k2 * I]:k=I str=str[:j I]str[ki:]j=1 I=1 for I in[3,4,5]: j=0 while j len(str)-2*i: #判断if str[j:j I]==str[j I:j 2 * I]:k=j I while k ilen(str)and str[j:j I]==str[k I:k 2

  Def李俶_lda(a):#过滤数据a.astype (str )。应用(x:len(x))。sum () # count字符长度data1=a.astype (str )。apply (lambda x: condense _ 1 (x)) #去掉重复的单词data1.apply (lambda x: len (x))。sum()data2=data 1 . apply(lambda x:len(x))data 3=PD . concat((data1,data 2)),Axis=1)# merge data 3 . columns=[ details , character length ]data 4=data 3 . loc[data 3[ character length ]4, details] #过滤长度大于4的注释,返回data4data _ LDA=李俶_ LDA (data2 _ LDA) data _ LDA

  jieba . load _ user dict( hotspot construction . txt )定义了停用词过滤函数。

  停止后定义(数据):#添加词典,去掉停用词data _ cut=数据。应用(lambda x:jieba。lcut(str(x)),lcut(x)表示给x分词,并且返回列表形式停用词=PD。read _ CSV(停止字。 txt ,编码=GB18030 ,sep=哈哈哈,header=None,engine=python) #此时注意用词里面的,不被作为分隔符停止言语=[,,,,,会, 月, 日,]列表(停用词。iloc[:0]) #将停用词添加在所有行额第0列中数据_停止后=数据_切割。apply(x:[I for I in x if I not in stop words])返回data _ after _ stop data _ LDA _ after _ stop=after _ stop(data _ LDA)data _ LDA _ after _ stop。to _ CSV( data _ LDA _ after _ stop。CSV ,编码=utf-8 )加载停用词表

  def load_stopword():#加载停用词表f _ stop=open(停止字。txt )SW=[line。f _ stop]f _ stop中的行的strip()。关闭()返回开关主程序

  if _ _ name _ _== _ _ main _ _ :print( 1 .初始化停止词列表- ) # 开始的时间t_start=time.time() #加载停用词表stop _ words=load _ stop word()print( 2 .开始读入语料数据- ) # 读入语料库f=open( data _ LDA _ after _ stop。CSV , rb) #语料库分词并去停用词文本=[[在线条.条带中逐字逐句()。降低()。如果单词不在f]打印(中的行的stop_words]中,则拆分()读入语料数据完成,用时%.3f秒%(时间。time()-t _ start))f . close()M=len(texts)print(文本数目:%d个% M)打印( 3。正在建立词典-)打印( 4。正在计算文本向量- ) # 转换文本数据为索引,并计数语料库=【词典。文档2文本的bow(文本)中的文本]打印( 5 .正在计算文档TF-IDF - ) t_start=time.time() #计算文档频率值corpus_tfidf=模型TfidfModel(语料库)打印(建立文档词频反完成,用时%.3f秒%(时间。time()-t _ start))打印( 6 .皱胃向左移模型拟合推断- ) # 训练模型num _ topics=30t _ start=time。time()LDA=models .LdaModel(corpus_tfidf,num_topics=num_topics,id2word=dictionary,alpha=0.01,eta=0.01,minimum_probability=0.001,chunksize=100,passes=1) print(LDA模型完成,训练时间为t%.3f秒% (time.time() - t_start)) #随机打印某10个文档的主题num_show_topic=10 #每个文档显示前几个主题打印( 7。结果:10个文档的主题分布:-)doc _ topics=LDA。get _ document _ topics(corpus _ tfi df)#所有文档的主题分布idx=NP。arange(M)NP。随机的。shuffle(idx)idx=idx[:10]for I in idx:topic=NP。array(doc _ topics[I])topic _ distribute=NP。array(topic[:1])# print topic _ distribute topic _ idx=topic _ distribute。argsort()[:-num _ show _ topic-1:-1]print(第%d个文档的前%d个主题: % (i,num_show_topic)),topic _ idx print(topic _ distribute[topic _ idx])num _ show _ term=7 #每个主题显示几个词打印( 8。结果:每个主题的词分布:-)对于范围(主题数量)中的topic _ id:print(主题# % d: t % topic _ id)term _ distribute _ all=LDA。get _ topic _ terms(主题id=主题id)term _ distribute=term _ distribute _ all[:num _ show _ term]term _ distribute=NP。array(term _ distribute)term _ id=term _ distribute[:0].astype(np.int) print(词:t ,)for t in term _ id:print(dictionary。id 2标记[t],)打印( n概率:t ,term_distribute[:1])运行结果展示

LDA模型是什么,LDA模型干嘛用的