gensim和jieba分词进行主题分析,文本相似度
参考链接:https://blog.csdn.net/whzhcahzxh/article/details/17528261
demo1:结巴分词:
# 构造分词库,格式如下: ''' [['楼下', '买', '水果', '这家', '店', '价格比', '店要', '高', '', '', '%', '价格', '太高', '老板', '说', '老板', '您好', '家', '水果', '很漂亮', '新鲜', '进货', '价格', '挺', '高', '我刚', '搬', '喜欢', '吃水果', '购买', '老板', '回应', '说', '价格', '优惠', '一点', '更好', '老板', '微笑', '说', '长期', '购买', '', '', '折', '说', '老板', '真', '大方', '就常', '买', '', '', '折', '老板', '听后', '计算机', '算了', '', '', '折', '再少', '开心', '', '', '折', '价格', '购买', '水果'],
['工作', '做', '行政助理', '跟着', '老板', '一年', '工资', '变化', '', '', '有次', '老板', '聊天', '问', '一年', '表现', '有没有', '批评', '指导', '一年', '表现', '帮', '加', '工资', '老板', '', '', '帮', '工资', '提高']]
''' stopwords = [line.strip() for line in codecs.open('./data/stopwords.txt', 'r', encoding = 'utf-8').readlines()] train = []
fp = codecs.open('./result/demo5_sheet1_1.csv','r',encoding='utf8')
for line in fp.readlines():
line = line.strip()
if not len(line):#判断是否为空行
continue
outstr = ' '
seg_list =jieba.cut(line,cut_all=False)#采用精确模式分词,效果最好
for word in seg_list:
if word not in stopwords:
if word != '\t':
outstr += word
outstr += " "
train.append(outstr.strip().split(" "))#字符串转列表
fp.close()
详细实例:
# coding=utf-8
import codecs
import gensim
import jieba
from gensim import corpora,models,similarities
from gensim.models import LdaModel
from gensim.corpora import Dictionary # 构造分词库,格式如下: ''' [['楼下', '买', '水果', '这家', '店', '价格比', '店要', '高', '', '', '%', '价格', '太高', '老板', '说', '老板', '您好', '家', '水果', '很漂亮', '新鲜', '进货', '价格', '挺', '高', '我刚', '搬', '喜欢', '吃水果', '购买', '老板', '回应', '说', '价格', '优惠', '一点', '更好', '老板', '微笑', '说', '长期', '购买', '', '', '折', '说', '老板', '真', '大方', '就常', '买', '', '', '折', '老板', '听后', '计算机', '算了', '', '', '折', '再少', '开心', '', '', '折', '价格', '购买', '水果'],
['工作', '做', '行政助理', '跟着', '老板', '一年', '工资', '变化', '', '', '有次', '老板', '聊天', '问', '一年', '表现', '有没有', '批评', '指导', '一年', '表现', '帮', '加', '工资', '老板', '', '', '帮', '工资', '提高']]
''' stopwords = [line.strip() for line in codecs.open('./data/stopwords.txt', 'r', encoding = 'utf-8').readlines()] train = []
fp = codecs.open('./result/demo5_sheet1_1.csv','r',encoding='utf8')
for line in fp.readlines():
line = line.strip()
if not len(line):#判断是否为空行
continue
outstr = ' '
seg_list =jieba.cut(line,cut_all=False)#采用精确模式分词,效果最好
for word in seg_list:
if word not in stopwords:
if word != '\t':
outstr += word
outstr += " "
train.append(outstr.strip().split(" "))#字符串转列表
fp.close()
# print(type(train))
# print(train)
# exit() #各个词或词组在字典中的编号 '''
北京 编号为:12
搭 编号为:6
的 编号为:9
喜欢 编号为:1
不 编号为:10
东西 编号为:4
土豆 编号为:2
霾 编号为:14
是 编号为:7
个 编号为:5
雾 编号为:13
百 编号为:8
今天 编号为:11
我 编号为:3
吃 编号为:0
'''
dic = corpora.Dictionary(train)
for name,index in dic.token2id.items():
print(name+":"+str(index))
break#执行一次 # 词典生成好之后,就开始生成语料库了
'''
corpus=[[(0, 1), (1, 1), (2, 1), (3, 1)], [(2, 1), (4, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1)], [(1, 1), (3, 1), (9, 1), (10, 1), (11, 1), (12, 1), (13, 1), (14, 1)]]
每个中括号代表一句话,用逗号隔开,(0,1)代表词典中编号为0的词出现了一次,以此类推,很好理解
'''
corpus = [ dic.doc2bow(text) for text in train ]
# print(corpus)
# exit() '''
得到了语料库,接下来做一个TF-IDF变换 可以理解成 将用词频向量表示一句话 变换成为用 词的重要性向量表示一句话
(TF-IDF变换:评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。)
vec是查询文本向量,比较vec和文档中的文本的相似度
执行结果:
[(0, 0.7071067811865475), (4, 0.7071067811865475)]
[(0, 0.8425587958192721), (1, 0.3109633824035548), (2, 0.3109633824035548), (3, 0.3109633824035548)]
[(2, 0.16073253746956623), (4, 0.4355066251613605), (5, 0.4355066251613605), (6, 0.4355066251613605), (7, 0.4355066251613605), (8, 0.4355066251613605), (9, 0.16073253746956623)]
[(1, 0.1586956620869655), (3, 0.1586956620869655), (9, 0.1586956620869655), (10, 0.42998768831312806), (11, 0.42998768831312806), (12, 0.42998768831312806), (13, 0.42998768831312806), (14, 0.42998768831312806)]
'''
tfidf = models.TfidfModel(corpus)
vec =[(0,1),(4,1)]
corpus_tfidf = tfidf[corpus]
for doc in corpus_tfidf:
print(doc)
break#执行一次 # exit()
'''
得到比较结果:
[(0, 0.59577906), (1, 0.30794966), (2, 0.0)] 表示和第1句话相似度为59.578%,和第二句话的相似度位30.79%,第三句没有相似度, 我们看看vec这句话是什么:0为吃,4为东西,所以vec这句话可以是["吃东西"]或者["东西吃"] 而第一句话"我喜欢吃土豆","土豆是个百搭的东西"明显有相似度,而第三句话"我不喜欢今天雾霾的北京",相似度几乎为0,至于为什么第一句比第二句更相似,就需要考虑TfIdf document representation和cosine similarity measure了
'''
# index = similarities.SparseMatrixSimilarity(tfidf[corpus],num_features=3)
# sims =index[tfidf[vec]]
# print(list(enumerate(sims)))#报错待调试 '''
回到tfidf转换,接着训练LSI模型,假定文档属于10个主题,
'''
lsi = models.LsiModel(corpus_tfidf,id2word=dic,num_topics=10)
lsiout =lsi.print_topics(10)
print(lsiout[0])
# exit()
'''
基于SVD建立的两个主题模型内容,将文章投影到主题空间中
输出: [(0, -0.70861576320682107), (1, 0.1431958007198823)]
[(0, -0.42764142348481798), (1, -0.88527674470703799)]
[(0, -0.66124862582594512), (1, 0.4190711252114323)] 因此第一三两句和主题一相似,第二句和主题二相似
'''
corpus_lsi = lsi[corpus_tfidf]
for doc in corpus_lsi:
print(doc)
break '''
LDA
得到的结果每次都变,给一次的输出: 0.077*吃 + 0.075*北京 + 0.075*雾 + 0.074*今天 + 0.073*不 + 0.072*霾 + 0.070*喜欢 + 0.068*我 + 0.062*的 + 0.061*土豆
0.091*吃 + 0.073*搭 + 0.073*土豆 + 0.073*个 + 0.073*是 + 0.072*百 + 0.071*东西 + 0.066*我 + 0.065*喜欢 + 0.059*霾
[(0, 0.31271095988105352), (1, 0.68728904011894654)]
[(0, 0.19957991735916861), (1, 0.80042008264083142)]
[(0, 0.80940337254233863), (1, 0.19059662745766134)] 第一二句和主题二相似,第三句和主题一相似
结论和LSI不一样,我估计这和样本数目太少,区别度不高有关,毕竟让我来区分把第一句和哪一句分在一个主题,我也不确定
''' lda = models.LdaModel(corpus_tfidf, id2word=dic, num_topics=10)
ldaOut=lda.print_topics(10)
print (ldaOut[0])
print (ldaOut[1])
corpus_lda = lda[corpus_tfidf]
for doc in corpus_lda:
print (doc)
break '''
输入一句话,查询属于LSI得到的哪个主题类型,先建立索引:
输出: [(13, 1), (14, 1)]
[(0, 0.50670602027401368), (1, -0.3678056037187441)] 与第一个主题相似
'''
index = similarities.MatrixSimilarity(lsi[corpus])
query = "客户"
query_bow = dic.doc2bow(list(jieba.cut(query)))
print (query_bow)
query_lsi = lsi[query_bow]
print (query_lsi)
'''
比较和第几句话相似,用LSI得到的索引接着做,并排序输出
[(0, 0.90161765), (1, -0.10271341), (2, 0.99058259)]
[(2, 0.99058259), (0, 0.90161765), (1, -0.10271341)] 可见和第二句话相似度很高,因为只有第二句话出现了雾霾两个词,可是惊讶的是和第一句话的相似度也很高,这得益于LSI模型的算法:在A和C共现,B和C共现的同时,可以找到A和B的相似度
'''
gensim和jieba分词进行主题分析,文本相似度的更多相关文章
- 转:Python 文本挖掘:使用gensim进行文本相似度计算
Python使用gensim进行文本相似度计算 转于:http://rzcoding.blog.163.com/blog/static/2222810172013101895642665/ 在文本处理 ...
- 文本相似度分析(基于jieba和gensim)
基础概念 本文在进行文本相似度分析过程分为以下几个部分进行, 文本分词 语料库制作 算法训练 结果预测 分析过程主要用两个包来实现jieba,gensim jieba:主要实现分词过程 gensim: ...
- python 用gensim进行文本相似度分析
http://blog.csdn.net/chencheng126/article/details/50070021 参考于这个博主的博文. 原理 1.文本相似度计算的需求始于搜索引擎. 搜索引擎需要 ...
- 【Pyhton 数据分析】通过gensim进行文本相似度分析
环境描述 Python环境:Python 3.6.1 系统版本:windows7 64bit 文件描述 一共有三个文件,分别是:file_01.txt.file_02.txt.file_03.txt ...
- pypinyin, jieba分词与Gensim
一 . pypinyin from pypinyin import lazy_pinyin, TONE, TONE2, TONE3 word = '孙悟空' print(lazy_pinyin(wor ...
- jieba分词的功能和性能分析
jieba分词问题导引 用户词典大小最大可以有多大 用户词典大小对速度的影响 有相同前缀和后缀的词汇如何区分 对比百度分词的API 问题一:词典大小 从源码大小分析,整个jieba分词的源码总容量为8 ...
- Lucene.net(4.8.0) 学习问题记录五: JIEba分词和Lucene的结合,以及对分词器的思考
前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...
- python结巴(jieba)分词
python结巴(jieba)分词 一.特点 1.支持三种分词模式: (1)精确模式:试图将句子最精确的切开,适合文本分析. (2)全模式:把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解 ...
- 【机器学习】使用gensim 的 doc2vec 实现文本相似度检测
环境 Python3, gensim,jieba,numpy ,pandas 原理:文章转成向量,然后在计算两个向量的余弦值. Gensim gensim是一个python的自然语言处理库,能够将文档 ...
随机推荐
- Spring再接触 Scope范围
<bean id="userService" class="com.bjsxt.service.UserService" scope="prot ...
- 搭建redis-sentinel(哨兵机制)集群
redis怎么才能做到高可用 对于redis主从架构,slave可以对应多个本身可以保障高可用,但是对于一个master节点,如果宕机,整个缓存系统就无法进行写的操作,显然整个系统会无法做到高可用 s ...
- 《DOM Scripting》学习笔记-——第五章、第六章 案列改进
第四章的案例代码可以得到更好的改进.例如:预留退路.向后兼容性和分离js. 原html代码: <!DOCTYPE html> <html lang="en"> ...
- 软件工程小组讨论设计NABCD
项目名称:失物招领平台 项目工作小组:冰淇淋队 项目简介:目前同学们丢了东西都qq空间转发或者某个特定的qq群发消息,qq空间转发浪费了别人的时间,qq群发消息也浪费了别人的时间.怎么样才能浪费最少的 ...
- spring boot + apache camel 传输文件
一 sftp搭建略 这里简单说一下为什么使用sftp.ftp和sftp各有优点,差别并不是太大.sftp安全性好,性能比ftp低.ftp对于java来说并不复杂,效率也高.之所以使用sftp主要是可以 ...
- LeetCode Smallest Range
数据范围是3500,3500也就是说n的平方是可以接受的.这里告诉你就是有序的,也就是在提醒你可能会是一个类似于二分的算法,所以的话其实基于这两个认识的话我们就可以利用一个枚举叫二分的算法来解决这道题 ...
- Ubuntu16.04 使用lvm挂载硬盘以及扩容
1.首先通过fdisk -l 查看磁盘的属性,找到要添加的磁盘名称(Disk /dev/sda) 2.使用fdisk将磁盘进行逻辑分区 fdisk /dev/sda m来查看命令帮助 n添加一张新的p ...
- Android 代码判断是否有网络
public void okGo() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemServic ...
- mysql 中启动服务的命令 、登录命令、退出命令 mysql 的常用命令
1.cmd 以管理员执行 下面命令 启动服务 :net start mysql57 关闭 服务:net stop mysql57 查看mysql 的版本信息 : mysql -V 指定主机地址登录: ...
- SpringCloud微服务负载均衡与网关
1.使用ribbon实现负载均衡ribbon是一个负载均衡客户端 类似nginx反向代理,可以很好的控制htt和tcp的一些行为.Feign默认集成了ribbon. 启动两个会员服务工程,端口号分别为 ...