LDA模型:建立词典+文本数量+建立文档TF-IDF+LDA模型拟合
1.LDA模型简介(节选自百度百科)
LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,也称为一个三层贝叶斯概率模型,包含词、主题和文档三层结构。所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到。文档到主题服从多项式分布,主题到词服从多项式分布。
LDA是一种非监督机器学习技术,可以用来识别大规模文档集(document collection)或语料库(corpus)中潜藏的主题信息。它采用了词袋(bag of words)的方法,这种方法将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息。但是词袋方法没有考虑词与词之间的顺序,这简化了问题的复杂性,同时也为模型的改进提供了契机。每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。
2.LDA生成过程(节选自百度百科)
对于语料库中的每篇文档,LDA定义了如下生成过程(generativeprocess):
1.对每一篇文档,从主题分布中抽取一个主题;
2.从上述被抽到的主题所对应的单词分布中抽取一个单词;
3.重复上述过程直至遍历文档中的每一个单词。
语料库中的每一篇文档与T(通过反复试验等方法事先给定)个主题的一个多项分布 (multinomialdistribution)相对应,将该多项分布记为θ。每个主题又与词汇表(vocabulary)中的V个单词的一个多项分布相对应,将这个多项分布记为φ。
3.LDA模型实践(Python)
导入所需库
import pandas as pd
import re
import jieba
from gensim import corpora, models, similarities
from pprint import pprint
import numpy as np
import time
输入处理数据
data2 = pd.read_excel('1.xlsx')
data2_lda = data2['详情']data2_lda.shape
data2_lda.drop_duplicates()
机械压缩
def condense_1(str):for i in [1,2]:j=0while 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*iwhile k+i<len(str) and str[j:j+i]==str[k+i:k+2*i]:k+=istr =str[:j+i]+str[k+i:]j+=1i+=1for i in [3,4,5]:j=0while j < len(str)-2*i:#判断至少出现了一次if str[j:j+i] == str[j+i:j+2*i]:k= j+iwhile k+i<len(str) and str[j:j+i]==str[k+i:k+2*i]:k+=istr =str[:j+i]+str[k+i:]j+=1i+=1return str
数据筛选
def chuli_lda(a):#筛选数据a.astype('str').apply(lambda x:len(x)).sum() # 统计字符长度data1 = a.astype('str').apply(lambda x: condense_1(x)) # 去除重复词data1.apply(lambda x: len(x)).sum()data2 = data1.apply(lambda x: len(x))data3 = pd.concat((data1, data2), axis = 1) # 合并data3.columns = ['详情','字符长度']data4 = data3.loc[data3['字符长度'] > 4, '详情'] # 筛选长度大于4的评论return data4
data_lda = chuli_lda(data2_lda)
data_lda
中文分词
jieba.load_userdict('热点\建设.txt')
定义停用词过滤函数
def after_stop(data):#添加词典,去掉停用词data_cut=data.apply(lambda x:jieba.lcut(str(x)))#lcut(x)表示给x分词,并且返回列表形式stopWords=pd.read_csv('stopword.txt',encoding='GB18030',sep='hahaha',header=None,engine='python')#此时注意用词里面的,不被作为分隔符stopWords=['≮', '≯', '≠', '≮', ' ', '会', '月', '日', '–']+list(stopWords.iloc[:,0])#将停用词添加在所有行额第0列中data_after_stop=data_cut.apply(lambda x:[i for i in x if i not in stopWords])return data_after_stopdata_lda_after_stop = after_stop(data_lda)
data_lda_after_stop.to_csv('data_lda_after_stop.csv',encoding='utf-8')
加载停用词表
def load_stopword():#加载停用词表f_stop = open('stopword.txt')sw = [line.strip() for line in f_stop]f_stop.close()return sw
主程序
if __name__ == '__main__':print('1.初始化停止词列表 ------')# 开始的时间t_start = time.time()# 加载停用词表stop_words = load_stopword()print('2.开始读入语料数据 ------ ')# 读入语料库f = open('data_lda_after_stop.csv','rb')# 语料库分词并去停用词texts = [[word for word in line.strip().lower().split() if word not in stop_words] for line in f]print('读入语料数据完成,用时%.3f秒' % (time.time() - t_start))f.close()M = len(texts)print('文本数目:%d个' % M)print('3.正在建立词典 ------')print ('4.正在计算文本向量 ------')# 转换文本数据为索引,并计数corpus = [dictionary.doc2bow(text) for text in texts]print ('5.正在计算文档TF-IDF ------')t_start = time.time()# 计算tf-idf值corpus_tfidf = models.TfidfModel(corpus)print ('建立文档TF-IDF完成,用时%.3f秒' % (time.time() - t_start))print ('6.LDA模型拟合推断 ------')# 训练模型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 # 每个文档显示前几个主题print('7.结果:10个文档的主题分布:--')doc_topics = lda.get_document_topics(corpus_tfidf) # 所有文档的主题分布idx = np.arange(M)np.random.shuffle(idx)idx = idx[:10]for i in idx:topic = np.array(doc_topics[i])topic_distribute = np.array(topic[:, 1])# print topic_distributetopic_idx = topic_distribute.argsort()[:-num_show_topic-1:-1]print ('第%d个文档的前%d个主题:' % (i, num_show_topic)), topic_idxprint(topic_distribute[topic_idx])num_show_term = 7 # 每个主题显示几个词print('8.结果:每个主题的词分布:--')for topic_id in range(num_topics):print('主题#%d:\t' % topic_id)term_distribute_all = lda.get_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('词:\t',)for t in term_id:print(dictionary.id2token[t],)print('\n概率:\t', term_distribute[:, 1])
运行结果展示
LDA模型:建立词典+文本数量+建立文档TF-IDF+LDA模型拟合相关推荐
- 使用lingpipe自然语言处理包进行文本分类/** * 使用 lingpipe的tf/idf分类器训练语料 * * @author laigood */ public class trai
/** * 使用 lingpipe的tf/idf分类器训练语料 * * @author laigood */ public class traintclassifier { //训练语料文件 ...
- 文本特征抽取的向量空间模型(VSM)和TF/IDF方法
文本特征抽取 两组小说,一组是爱情的,另一组是科幻的.我们能否用支持向量机训练一个模型,用来识别小说类型呢? 这个并不容易.因为支持向量机这类机器学习算法只能接受数学里面的向量作为输入.如果用它来做文 ...
- 基于主题模型的专利文本主题挖掘与应用研究- 专利文本主题挖掘方法
基于分类 需要认为提前设定好一定的分类标准,并需要规定好各个主题类别信息,它是一种有监督或者半监督的方法,对于一个新文本的归类过程也是对其文本主题信息解读的过程. 基于聚类 无监督 通过对聚类各个类簇 ...
- lda数学八卦_【技术博客】文本挖掘之LDA主题模型
作者:郑培 引言 主题模型是文本挖掘的重要工具,近年来在工业界和学术界都获得了非常多的关注.在文本挖掘领域,大量的数据都是非结构化的,很难从信息中直接获取相关和期望的信息,一种文本挖掘的方法:主题模型 ...
- LDA模型中需要输入的数据格式
LDA模型需要输入文本数据, 其中每个文档都是一组词语. 为了进行训练和预测, 需要将文本数据转化为数值型数据, 如将每个词语转化为整数编号或词袋表示.
- 文本建模PLSA与LDA模型
文本建模PLSA与LDA模型 – 潘登同学的Machine Learning笔记 文章目录 文本建模PLSA与LDA模型 -- 潘登同学的Machine Learning笔记 文本生成过程 Unigr ...
- LDA模型中文文本主题提取丨可视化工具pyLDAvis的使用
主题模型LDA的实现及其可视化pyLDAvis 1. 无监督提取文档主题--LDA模型 1.1 准备工作 1.2 调用api实现模型 2. LDA的可视化交互分析--pyLDAvis 2.1 安装py ...
- 百度开源其NLP主题模型工具包,文本分类等场景可直接使用L——LDA进行主题选择本质就是降维,然后用于推荐或者分类...
2017年7月4日,百度开源了一款主题模型项目,名曰:Familia. InfoQ记者第一时间联系到百度Familia项目负责人姜迪并对他进行采访,在本文中,他将为我们解析Familia项目的技术细节 ...
- NLP之TM之LDA:利用LDA算法瞬时掌握文档的主题内容—利用希拉里邮件数据集训练LDA模型并对新文本进行主题分类
NLP之TM之LDA:利用LDA算法瞬时掌握文档的主题内容-利用希拉里邮件数据集训练LDA模型并对新文本进行主题分类 目录 输出结果 设计思路 核心代码 训练数据集 LDA模型应用 输出结果 设计思路 ...
- 通过分析希拉里邮件简单熟悉使用lda模型提取语料库主题
1.知识准备 1.1 函数解析 函数官网参考 class gensim.models.ldamodel.LdaModel(corpus=None, num_topics=100, id2word=No ...
最新文章
- ios微信登录不上服务器,iOS微信授权登录
- TCP握手--(HTTP权威指南学习笔记)
- oracle地址已被占用,Listener Tns-12542:Tns:地址已被占用
- Silverlight实用窍门系列:47.Silverlight中元素到元素的绑定,以及ObservableCollection和List的使用区别...
- win10启动telnet
- CV之FR:DIY脚本通过人脸图像得到人脸特征向量并输出多张人脸图片之两两图片之间的距离
- 如何启用SAP C4C OData Event Notification
- 验证回文串Python解法
- c ++类成员函数_仅使用C ++创建具有公共数据成员的类
- java 压缩jar 仓库,java服务安装(一):使用java service wrapper及maven打zip包
- POJ 2031 Building a Space Station
- 天天动听 半透明Menu效果
- vue el-input输入框禁止输入空格
- vue.js2.0 新手开发_vue.js2.0实战(1):搭建开发环境及构建项目
- 【网络安全】大学信息安全技术 期末考试复习题
- python数据分析与应用-Python数据分析与应用 PDF 内部全资料版
- matlab进行多光栅衍射仿真,光栅衍射MATLAB仿真.docx
- Shopee虾皮电商平台考试题附答案
- fans域名启动全球调价
- 加密IC卡保险柜控制器的设计