LDA提取信息
文本主题模型提取
如下程序将句子主题提取后,将权重值存入dataframe.
#!/usr/bin/python
# -*- coding:utf-8 -*- import pandas as pd
import numpy as np
import matplotlib as mpl
import math
import warnings
import jieba
from gensim import corpora, models, similarities # 参数说明:
# doc_topics: 可用np.array(doc_topics)
# 对其进行查看,
# 它里面存储的是每个句子对应的list, list中分别是句子中部分词的标号和权重值,
# x:表示的是单个句子在dataframe的index
# num_show_topic:LdaMulticore提取的主题的个数
# col:是列名
def getlda(doc_topics, x, num_show_topic, col):
# topic是doc_topics中list的内容变成了二阶张量的形式
topic = np.array(doc_topics[x])
# topic[:,1]中是某个句子中部分词的权重值
# argsort函数返回的是数组值从小到大的索引值,即np.argsort(topic[:,1])中是list中所有的权重值由小到大排序后的索引
# topic_id中是topic按权重值排序后生成的二维张量
topic_id=topic[np.argsort(topic[:,1])]
# 如果该句子主题个数不够LdaMulticore提取的个数,则对缺少的部分补0
if topic_id.shape[0]<num_show_topic:
settopici=set(topic_id[:,0])
settopicadd=set([x for x in range(num_show_topic)])-settopici# 补上没出现的topic
dfall=pd.concat([pd.DataFrame({0:list(settopicadd),1:[0 for x in range(len(settopicadd))]}),pd.DataFrame(topic_id)],axis=0)
# 否则说明该句子中的主题个数与LdaMulticore中规定的一致,
else:
dfall=pd.DataFrame(topic_id)
# print(dfall)
# 对第一列进行排序,即按主题进行排序 共num_show_topic个主题
dfall.sort_values(0,inplace=True)
# 将dfall中的权重值列转化为dataframe,变为1行num_show_topic列
df =pd.DataFrame([dfall[1].values])
df=df.astype(np.float32)
# 生成num_show_topic个列
L = range(num_show_topic)
df.columns = [col + 'lda' + str(i) for i in L]
# 将最终生成的1行num_show_topic列的dataframe返回
return df def fenge(x):
x = x.split('|')
# print('x中不同元素共有:', len(set(x)))
return x df = pd.DataFrame({
'user_id': [113401,378358,434838,577061],
'taglist': [
'4707|70|3498|4707|2099|1832|1911',
'751|2207|1100|2099|1832|1911|70|2254|171',
'877|3242|5628|70|2684|691|70|4228|631|70',
'2431|3242|3242|1823|4020|3242|70|620|2168'
]
})
# r的数据类型是series,key是df的index,values是分割‘|’后返回的list
r = df['taglist'].map(lambda x: fenge(x))
# testdata是list,每个元素也是list
testdata = list(r)
# dictionary中是将testdata中所有不同的标记tokens都取了出来放在一个list中
dictionary = corpora.Dictionary(testdata)
# corpus中存放的是testdata中每个元素在dictionary中的编号与出现次数
# corpus中的数据形式是[[(0, 1), (1, 1), (2, 1)], [(0, 1), (1, 1), (2, 1), (5, 1), (6, 1)],.......
corpus = [dictionary.doc2bow(text) for text in testdata]
# 输出tfidf是TfidfModel(num_docs=4,num_nnz=31),其中num_docs表示的是处理了4个语句,num_nnz表示的是4个语句中共有31个不同的词
tfidf = models.TfidfModel(corpus)
# 此处计算得出语料库corpus中所有句子的tf-idf值,这儿放其他的语料库可能也行
corpus_tfidf = tfidf[corpus]
# LdaMulticore()参数解析官网链接:https://radimrehurek.com/gensim/models/ldamulticore.html
# 参数解释:corpus_tfidf:要训练的语料库
# num_topics:指定从要训练的语料库中要提取的主题数量
# id2word:与语料库对应的字典
# chunksize:每次训练的词的数量
# passes:训练中通过语料库的次数,即训练的次数
# minimum_probability:设置阈值,低于该阈值的主题将被舍弃掉
# workers:设置进程数,即用于并行化的工作进程的数量
# decay:一个介于(0.5,1)之间的数字,以表示在检查每个新文档时忘记前面lambda值的百分比 # https://radimrehurek.com/gensim/models/ldamulticore.html
lda = models.LdaMulticore(corpus_tfidf, num_topics=60, id2word=dictionary,chunksize=2000,
passes=1, random_state=0, minimum_probability=0.005, workers=11)
# print('lda is:', lda) # lda is: LdaModel(num_terms=23, num_topics=60, decay=0.5, chunksize=2000)
# 保存模型
# lda.save('./model/' + 'lad.model') # 留给test集合用 # doc_topics直接输出看不到内部的值
doc_topics = lda.get_document_topics(corpus_tfidf)
print(np.array(doc_topics)) # # 显示文档主题doc_topics有3种方法:
# doc_topic = [i for i in lda[corpus_tfidf]] ##法1
# print(doc_topic)
#
# for doc_topic in lda.get_document_topics(corpus_tfidf): ##法2
# print(doc_topic)
# print(np.array(doc_topics)) ##法3 item = 'taglist' # 列名
# [print(cols) for cols in df.reset_index()['index'].apply(lambda x: getlda(doc_topics, x, 60, item))]
# df.reset_index()['index'].apply(lambda x: getlda(doc_topics, x, 60, item))
# 是series类型,其中每个values都是返回的dataframe,1行num_show_topic列
dfjoin = pd.concat([cols for cols in
df.reset_index()['index'].apply(lambda x: getlda(doc_topics, x, 60, item))],
ignore_index=True)
print(dfjoin.shape) #(4, 60)
https://blog.csdn.net/sinat_26917383/article/details/71436563#gensimdoc2bow_209
https://radimrehurek.com/gensim/models/ldamulticore.html
https://blog.csdn.net/appleyuchi/article/details/78055371
https://blog.csdn.net/qq_23926575/article/details/79429689
https://radimrehurek.com/gensim/tut1.html#from-strings-to-vectors
http://www.pianshen.com/article/6714154086/
LDA提取信息的更多相关文章
- Python 抓取网页并提取信息(程序详解)
最近因项目需要用到python处理网页,因此学习相关知识.下面程序使用python抓取网页并提取信息,具体内容如下: #---------------------------------------- ...
- 在excel单元格中提取信息
平时在excel中处理数据的时候,肯定会遇到在单元格提取信息的情况,比如在地址中提取省.市.地区等,如果数据源内容规整的话,可以直接使用left().right().mid()等函数直接提取,但是大多 ...
- Excel不同工作簿之间提取信息
Sub 不同工作簿间提取信息() '用于单个字段信息的提取: Dim w As Workbook, wb1 As Workbook, wb2 As Workbook, wb3 As Workbook ...
- 用python库openpyxl操作excel,从源excel表中提取信息复制到目标excel表中
现代生活中,我们很难不与excel表打交道,excel表有着易学易用的优点,只是当表中数据量很大,我们又需要从其他表册中复制粘贴一些数据(比如身份证号)的时候,我们会越来越倦怠,毕竟我们不是机器,没法 ...
- Jmeter- 笔记5 - 从响应数据提取信息
JSON提取器 提取 响应体(response body)里的信息 在需要提取数据的请求下添加 JSON提取器,一个JSON提取器可以写多个json提取器 路径:后置处理器 -> JSON提取器 ...
- python读取excel一例-------从工资表逐行提取信息
在工作中经常要用到python操作excel,比如笔者公司中一个人事MM在发工资单的时候,需要从几百行的excel表中逐条的粘出信息,然后逐个的发送到员工的邮箱中.人事MM对此事不胜其烦,终于在某天请 ...
- 从PDF中提取信息----PDFMiner
今天由于某种原因需要将pdf中的文本提取出来,就去搜了下资料,发现PDFMiner是针对 内容提取的,虽然最后发现pdf里面的文本全都是图片,就没整成功,不过试了个文本可复制的 那种pdf文件,发现还 ...
- EXCEL跨工作薄查找。提取信息
=IF(ISERROR(INDEX(zdy!$B:$B,MATCH(B15,zdy!$B:$B,0))),"不存在",INDEX(zdy!$C:$C,MATCH(B15,zdy!$ ...
- 【Python学习笔记四】获取html内容之后,如何提取信息:使用正则表达式筛选
在能够获取到网页内容之后,发现内容很多,那么下一步要做信息的筛选,就和之前的筛选图片那样 而在python中可以通过正则表达式去筛选自己想要的数据 1.首先分析页面内容信息,确定正则表达式.例如想获取 ...
随机推荐
- how to install protobuff python
当前环境: operate system: Ubuntu 14.04.1 LTS protoc --version: libprotoc 2.5.0 protocol-buffers versi ...
- Maven下载清除jar包
maven jar包下载命令行方式 在STS中下载JAR包时经常卡住无法继续下载,这时可以用命令行方式进行下载.在终端中今入到该项目的根目录下,然后mvn clean;mvn install;等待下载 ...
- redux中间件来执行异步操作
在redux中我们都是执行同步操作,如果我们想要执行异步操作,那么我们就需要依赖到中间件,具体的中间件的概念我就不描述了相信官方文档更详尽.现在就描述下具体的用法,就已我们项目中用到的最多的数据请求为 ...
- [转]tKC(The Keyboard Caper)的自传
每个玩儿计算机的朋友都知道破解,或多或少地使用着各种各样的破解,也就逐渐地知道了一些著名的破解团体和破解人,比如:PC(Phrozen Crew).CiA(Crackers in Action)COR ...
- pip install mysql_python报错解决办法
首先请注意,mysql_python只支持Python2,所以假如你是python3,就直接用python-connector去吧.下面这一条命令就可以了 pip install mysql-conn ...
- ie下,首页打开页面非常慢
手里的项目,登录页面在IE下首次进入页面非常的慢,应该不只是登录页面,因为项目我也是半路接手的.开始以为是js的问题,后台把所有的代码都去掉,就一个空白的页面,然后慢慢的试试,最后才发现是一个CSS文 ...
- 【leetcode】525. Contiguous Array
题目如下: 解题思路:这个题目可以这么做,遍历数组,如果元素是0,则count --:否则count ++:这样的话,每遍历到一个下标i,count的值就是0>i区间内0和1的差值.如果我们能找 ...
- LeetCode--072--编辑距离(python)
给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个字符示例 1: 输入: ...
- 3分钟教会你把封装的js公共方法挂载在vue实例原型上
第一步:首先在src文件夹里面创建一个通用js文件夹,然后在创建的文件夹里面创建一个js文件 第二步:const 一个方法,然后通过export暴露出来(在同一个页面可以写多个方法,和暴露多个方法,在 ...
- 转:HTML5 History API 详解
从Ajax翻页的问题说起 请想象你正在看一个视频下面的评论,在翻到十几页的时候,你发现一个写得稍长,但非常有趣的评论.正当你想要停下滚轮细看的时候,手残按到了F5.然后,页面刷新了,评论又回到了第一页 ...