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.首先分析页面内容信息,确定正则表达式.例如想获取 ...
随机推荐
- Django signal 信号量
参考博客:方法发及使用场景:https://my.oschina.net/linktime/blog/151871 部分源码解析:https://www.cnblogs.com/shizhengwen ...
- 将Medium中的博客导出成markdown
Medium(https://medium.com)(需要翻墙访问)是国外非常知名的一个博客平台.上面经常有很多知名的技术大牛在上面发布博客,现在一般国内的搬运的技术文章大多数都是来自于这个平台. M ...
- 第七讲 自定义Realm实现授权
1.仅仅通过配置文件来指定权限不够灵活,并且不方便,在实际的应用中大多数情况下都是将用户信息,角色信息,权限信息保存到了数据库中.所以需要从数据库中去获取相关的数据信息.可以使用shiro提供的Jdb ...
- 2019-11-22-Roslyn-在多开发框架让-msbuild-的-Target-仅运行一次
title author date CreateTime categories Roslyn 在多开发框架让 msbuild 的 Target 仅运行一次 lindexi 2019-11-22 09: ...
- nmblookup - 基于TCP/IP上的NetBIOS客户用于查询NetBIOS名字的程序
总览 SYNOPSIS nmblookup [-M] [-R] [-S] [-r] [-A] [-h] [-B <broadcast address>] [-U <unicast a ...
- 基于Kintex Ultrasacle的万兆网络光纤 PCIe加速卡416 光纤PCIe卡
基于Kintex Ultrasacle的万兆网络光纤 PCIe加速卡 一.产品概述 本卡为企业级别板卡,可用于数据中心,安全领域数据采集处理.标准PCI Express全高板,适用于普通服务器.工作站 ...
- [转载]转一篇Systemverilog的一个牛人总结
原文地址:转一篇Systemverilog的一个牛人总结作者:dreamylife Systemverilog 数据类型 l 合并数组和非合并数组 1)合并数组: 存储方式是连续的,中间没 ...
- moc_XXXX.o:(.data.rel.ro._ZTI12CalculatorUI[_ZTI12CalculatorUI]+0x10): undefined reference to `typeinfo for QWidget' collect2: error: ld returned 1 exit status make: *** [Makefile:144: myCalculator]
main.cpp:(.text.startup+0x22): undefined reference to `QApplication::QApplication(int&, char**, ...
- python3-访问限制
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的na ...
- LA 4327 Parade(单调队列优化dp)
题目链接: 题目大意(摘自刘汝佳<<算法竞赛入门经典--训练指南>>):F城是由n+1条横向路和m+1条竖向路组成.你的任务是从最南边的路走到最北边的路,使得走过的路上的高兴值 ...