技术标签: 自然语言处理
在使用gensim训练LDA模型之前需要先训练一个词袋模型
词袋模型的输入数据是分词后的词列表
多个数据时就是列表套列表,如:
[[想,买辆,汽车]]
from gensim import corpora, models
dictionary = corpora.Dictionary(train)
词典可以存储起来便于后续的使用
存储
dictionary.save('/gensim.dict')
加载
corpora.Dictionary.load('/gensim.dict')
训练时使用的数据需要使用词典转换数据
corpus = [dictionary.doc2bow(text) for text in train]
然后就可以使用corpus训练LDA模型了
lda = models.LdaModel(corpus=corpus, id2word=dictionary, num_topics=n,iterations=m)
直接使用api训练模型,需要传入数据词典以及topic的个数和迭代的次数
保存模型
lda.save(filename)
加载模型
lda =models.LdaModel.load(filename)
训练好模型后会得到模型的各主题的主题词分布,使用下面的代码可以查看各主题的主题词以及权重分布
topic_list = lda.print_topics(n)
for topic in topic_list:
print(topic)
预测使用的api是:
ret = lda.get_document_topics(corpus)
返回的结果是元祖套元祖,格式如下
((topic_id,概率)...)
因此使用下面的代码可以查看概率最高的预测topic的主题词分布(可能会预测出多个topic,这里我只取了最高的那个)
ret.sort(key = lambda x:x[1],reverse=True)
topic_list[ret[0][0]][1]
在一些数据输入后,lda返回的预测结果为空,即没有预测的主题,后来发现是因为该数据由每一个topic的构成的概率都小于一个阈值,被忽略了
可以通过传入参数来设置这个阈值
ret = lda.get_document_topics(corpus,minimum_probability=1e-3)
这个暂时没找到解决办法
由于数据量比较大,无法一次加载到内存中,于是尝试使用下面的方法来加载训练数据
train = (i.strip().split() for i in f)
dictionary = corpora.Dictionary(train)
结果发现使用词典转换的数据是空的,后续的lda也没有训练,还是老老实实的使用列表存储数据
有两种方式来评价,一个是perplex,另一个是使用 CoherenceModel
from gensim.models import CoherenceModel
cm = CoherenceModel(model=lda, corpus=corpus,dictionary=dictionary, coherence='u_mass')
print(f'cm={cm.get_coherence()}')
cv = CoherenceModel(model=lda, texts=train,dictionary=dictionary, coherence='c_v',processes=1)
cv_score = cv.get_coherence()
具体的解释见另一篇文章
在使用dictionary将训练数据转换之后,可以直接将数据存储便于后续的使用,在存储的时候需要序列化存储,使用的api是:
gensim.corpora.MmCorpus.serialize(file_name,corpus)
加载数据时使用:
gensim.corpora.MmCorpus(file_name)
lda是加载的lda模型
a = lda.get_topic_terms(0,10)
print(a)
输出结果
[(167, 0.12648638), (633, 0.073268488), (1710, 0.041437898), (4176, 0.035599157), (214, 0.035313852), (4062, 0.032541309), (1674, 0.028383246), (4101, 0.024133874), (671, 0.023899818), (8889, 0.022549478)]
前面是词的编号,后面是权重
需要使用模型将其在转换回词
print([lda.id2word[i[0]] for i in a])
['开', '分', '腿', '运动', '作用', '资料', '朋友圈', '达', '距离', '式']
另一种方式直接获取权重和词的计算公式,这是输出全部topic的模型,这里只查看topicid为0的:
topic_list = lda.print_topics(n,num_words=10)
topic_list.sort(key=lambda x:x[0])
print(topic_list[0])
(0, '0.126*"开" + 0.073*"分" + 0.041*"腿" + 0.036*"运动" + 0.035*"作用" + 0.033*"资料" + 0.028*"朋友圈" + 0.024*"达" + 0.024*"距离" + 0.023*"式"')
print_topics有两个参数 第一个是输出的topic个数,第二个是每一个topic输出的主题词的个数
在加载gensim的lda模型进行预测时,输入的数据转换为词向量的形式时不需要加载词典,直接使用lda模型转换即可
lda.id2word.doc2bow(['开', '分', '腿', '运动', '作用', '资料', '朋友圈', '达', '距离', '式'])
这样的形式就可以转换为词向量的稀疏矩阵表示
[(167, 1), (214, 1), (633, 1), (671, 1), (1674, 1), (1710, 1), (4062, 1), (4101, 1), (4176, 1), (8889, 1)]
文章浏览阅读2.2k次。2015年自从我担任当时算法组的小组leader,我作为面试官面试了不少同学。前前后后面试了超过200名同学,其中有不少入职的同学后来发展都不错,也坚定了自己对于选人的标准的自信心。今年2020年找工作尤其艰难,我把这些年作为面试官一些重要的面试题整理出来,一共80道,希望能够帮助到大家,为了方便大家,我做了一个归类,一共分成了6大类,分别是:机器学习,特征工程,深度学习,NLP,CV,推荐系统。这些知识既是面试中的常见问题,也可以作为大家整理自己思路的参考资料。机器学习理论类:1. ._算法岗年薪40
文章浏览阅读492次。文章目录一、通信接口的背景知识1.处理器与外部设备通信的两种方式2.串行通信按照数据传送方向分为:3.串行通信的通信方式:二、STM32串口通信基础1.STM32的串口通信接口2.UART异步通信方式引脚连接方法:3.UART异步通信方式特点:4.STM32串口通信过程:5.STM32异步通信要定义哪些参数:6.串口通信框图7.串口设置的一般步骤可以总结为如下几个步骤:一、通信接口的背景知识1.处理器与外部设备通信的两种方式(1)并行通信 -传输原理:数据各个位同时传输-优点:速度快-缺点:_stm32最大支持的串行通信个数
文章浏览阅读1.9k次。composer require firebase/php-jwtgit地址:https://github.com/firebase/php-jwt栗子:<?phpuse \Firebase\JWT\JWT;$key = "example_key";$token = array( "iss" => "http://example.org", "aud"..._laravel 解密 jwt
文章浏览阅读338次,点赞2次,收藏3次。作者:知乎用户链接:https://www.zhihu.com/question/20131784/answer/28026813来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。一共有0~6一共7种,这其中RAID 0、RAID1、RAID 5和RAID6比较常用。RAID 0:如果你有n块磁盘,原来只能同时写一块磁盘,写满了再下一块,做了RAID 0之..._raid4 得盘率
文章浏览阅读1.2w次,点赞10次,收藏34次。1.单击开始程序,找到Microsoft SQL Server 2012,点击SQL Server配置管理器2.在弹出的窗口中点击sqlserver网络配置,点击协议在右侧点击tcp/ip,如果状态为禁用的话 先启用3.启用后右键点击tcp/ip协议,选择属性4.4.在弹出的窗口中,切换到ip地址窗口找到127.0.0.1本地IP地址,修改启用状态为是,然后点击确定5.然后返回到sqlserver服务,选择实例服务右键进行重新启动6.再次点击开始菜单,找到sql server mana_sqlserver启动程序在哪
文章浏览阅读1.3k次。parsing ranges item in pcie-designware.c
文章浏览阅读5.5k次。这个是针对tinker报错问题,在运行gradlew assemblerelease的时候报一下错误:> Task :app:transformClassesAndResourcesWithR8ForRelease FAILEDR8 is the new Android code shrinker. If you experience any issues, ple..._transformclassesandresourceswithr8forrelease
文章浏览阅读2.8k次,点赞3次,收藏5次。一、确认服务端是否安装ssh的服务器端ssh -V #这一步不准确netstat -tlp #用这个直接看有没有这样的进程[::]:ssh 如果安装可以看到下图所示:二、安装ssh服务端#执行如下命令sudo apt install openssh-server三、启动ssh-server#执行如下命令:/etc/init.d/ssh restart四、确认ssh-server已经正常工作#执行如下命令netstat -tlp如果正常工作会看到如下图所示的信息:看_sudo apt install openssh-server
文章浏览阅读2.2k次。本周尝试在中标麒麟操作系统下安装greenplum。中标麒麟操作系统采用强化的Linux内核,我们首先准备好三台已安装中标麒麟服务版系统的虚拟机。规划他们的IP地址分别为:Master:10.81.2.20Segment1:10.81.2.21Segment2:10.81.2.22通过查找greenplum的官方网站可知,greenplum支持的操作系统如下:Red Hat Enterprise Linux 64-bit 7.x (See the following Note.)Re_麒麟系统编译greenplum
文章浏览阅读329次。例:百度一下:输入百度,点击搜索,这个过程的自动化1.点击元素 右键检查/打开开发者工具;2.选择那行代码右键选择copy,选择copy Xpath;3.粘贴到自己所写的代码里;4.搜索按钮定位使用同样方法;5.结果如下;参考:https://blog.csdn.net/Hu_wen/article/details/94738559..._python webfriver xpath
文章浏览阅读133次。VMware Workstation 15 与 Device/Credential Guard不兼容解决办法参考1参考2参考3看完 参考1 能解决问题的不用看 往后看了 因为 我是两者结合起来弄得 也就是关了hv,设置了hv服务禁用,并且关闭了内核保护1. 打开本电脑-》管理-》服务和应用程序-》服务下找到如下图的HV 主机服务,双击选择禁用。2. 打开Windows Po..._vmware与device/credential分别采用什么虚拟化架构
文章浏览阅读280次。先来看一下最基本的用法AsyncHttpClient client = new AsyncHttpClient();client.get("http://www.google.com", new AsyncHttpResponseHandler() { @Override public void onSuccess(String response) {..._d:\desk\android\meowsic-master\meowsic-master\app\libs\android-async-http-1.