python、numpy计算不同文档下的词的TF-IDF值以及进行文档相似度匹配(实战)
TF-IDF
计算公式(一个词的 tf-idf 值在不同文档,它的值也不同):
1、根据已有的原始数据,只展示了前5片文档,content是文档内容,s_words是通过jieba分词将文档划分成了若干个词:
2、统计整个语料库所有词的词频,只计算前5000个高频词的TF-IDF值(因为如果词表太大,那么最后文本的向量化表示也会太大了,词表的大小就是文本向量化后的维度)
3、计算TF-IDF
# 根据tfidf的公式,求出每个文档中,每个词的tf、idf和tfidf
import numpy as np def get_word_tfidf(docs,corpus):
dim = len(corpus) #获得语料库维度
word2id = {} #将word映射成id
print(f"docs number:{len(docs)}\tdim:{dim}")
for index,term in enumerate(corpus):
word2id[term[0]] = index #生成Word2id
word_tf = np.zeros((len(docs),dim)) #生成需要统计的tf表
N = len(docs) #文档总数
word_idf = np.zeros(dim) #词的IDF值
word_df = np.zeros(dim) #词的DF值
docs_set = [] #将同一个文档的词组表去重,这个目的是为了加速查找
for doc in docs:
docs_set.append(set(doc)) #生成 docs_set
for term in corpus: #统计df
word = term[0]
num = 0 #计数
for doc_set in docs_set: #doc_set
if word in doc_set: #判断是否在当前文档出现过
num+=1
word_df[word2id[word]] = num #获取词的df值
word_idf = np.log(N/(word_df+1)) #计算IDF值
for index, doc in enumerate(docs): #计算不同文档下词的tf值
n = len(doc) # 统计文档的词总数
for word in doc: #循环
if word in word2id.keys(): #遍历
cnt = doc.count(word) #计数
word_tf[index][word2id[word]] = cnt/n #计算
word_tf_idf = np.multiply(word_tf , word_idf) #计算tf-idf
return word_tf_idf #返回的是不同文档下词的TF-IDF值 docs = []
for d in list(s_data.iterrows()):
docs.append(d[1]['s_words'])
#由于特征维度太多内存装载不下,出现memory error,因此取top 5000个词作为维度
corpus = cntr.most_common(5000)
corpus_tf_idf = get_word_tfidf(docs,corpus) #调用函数
print(corpus_tf_idf.shape) #输出
print(corpus_tf_idf[:5])#输出样例
文档向量化——计算文档之间的相似度
根据刚才得到的 corpus_tf_idf 矩阵,每一行其实就是文档的向量化表示,通过计算两个向量的余弦相似度,从而得到文档与文档之间的相关程度。
# 把文档按照tfidf值进行向量化
# 通过cos相似度找出跟某文档最相似的top5文档
def cos_similar(a, b): #计算两个向量的余弦相似度
dot = a * b #点积
a_len = np.linalg.norm(a, axis=0) #取模
b_len = np.linalg.norm(b, axis=0) #取模
cos = dot.sum(axis=0) / (a_len * b_len) #计算余弦相似度
return cos def search(query_vec,docs_vec): #计算查询向量和文档向量的余弦相似度
candidates = [] #统计所有文档
for i in range(docs_vec.shape[0]): #遍历
cos = cos_similar(query_vec,docs_vec[i]) #计算余弦相似度
candidates.append((i,cos)) #添加id,为了排序
candidates = sorted(candidates,key=lambda x:-x[1]) #按照余弦相似度倒排
return candidates #返回 #计算查询文档和候选文档的余弦相似度
candidates = search(corpus_tf_idf[0],corpus_tf_idf)
K= 5
for i in range(K): #输出top5的文档
print(f"cos:{candidates[i][1]} data:{s_data.iloc[candidates[i][0]]}")
根据自己的语料训练word2vec模型
使用gensim库进行训练,语料的输入格式为(中文就需要先分词,英文直接按空格划分就行):
训练代码和展示:
from gensim.models import Word2Vec
#训练Word2vec模型
model = Word2Vec(docs , size=100, window=5, min_count=1, workers=4)
#生成词向量
model['喜欢']
python、numpy计算不同文档下的词的TF-IDF值以及进行文档相似度匹配(实战)的更多相关文章
- 配置允许匿名用户登录访问vsftpd服务,进行文档的上传下载、文档的新建删除等操作
centos7环境下 临时关闭防火墙 #systemctl stop firewalld 临时关闭selinux #setenforce 0 安装ftp服务 #yum install vsftpd - ...
- 怎样在Linux下使用Markdown进行文档工作
怎样在Linux下使用Markdown进行文档工作 在Linux系统中,编辑markdown能够用retext工具: sudo apt-get install retext retext Releas ...
- Linux系统通过FTP进行文档基本操作【华为云分享】
[摘要] Linux系统里通过FTP可以对文档进行上传,更改权限和基本的文档管理. 获得Linux系统后,不熟悉命令操作的情况下,可以通过FTP工具进行文档操作,下面以WinSCP工具为例进行讲解: ...
- 机器学习实战之朴素贝叶斯进行文档分类(Python 代码版)
贝叶斯是搞概率论的.学术圈上有个贝叶斯学派.看起来吊吊的.关于贝叶斯是个啥网上有很多资料.想必读者基本都明了.我这里只简单概括下:贝叶斯分类其实就是基于先验概率的基础上的一种分类法,核心公式就是条件概 ...
- Linux 计算某文件夹下的所有文件的md5值
使用find 命令 find /root -type f -print0 |xargs -0 md5sum >a.md5 校验的话 md5sum -c a.md5
- SharePoint2016如何使用策略进行文档归档
前言 最近项目用户需要提供文档按照日期或标题关键字进行对应的文档归档操作,为了实施这个操作,需要准备2个文档库,我这里准备了如下文档库: 1. 测试文档库:在测试文档中上传几篇文档,如下图: 2. 我 ...
- 利用kibana插件对Elasticsearch进行文档和索引的CRUD操作
#添加索引PUT lagou { "settings": { "index": { , } } }#查看 索引设置 GET lagou/_settings GE ...
- 使用Word进行文档修订版本的比较
项目经理在实际的工作过程中,比如要写文档方案,就需要对文档的修订版本进行管理和控制.在以前的工作中,笔者使用的是UltraEdit这个软件工具中的Ultra Compare这个子工具来进行的文档版本的 ...
- sharepoint2013用场管理员进行文档库的爬网提示"没有权限,拒绝"的解决方法
爬网提示被拒绝,场管理员明明可以打开那个站点的,我初步怀疑是:环回请求(LoopbackRequest)导致的 解决方法就是修改环回问题.修改注册表 具体操作方法: http://www.c-shar ...
- Python TF-IDF计算100份文档关键词权重
上一篇博文中,我们使用结巴分词对文档进行分词处理,但分词所得结果并不是每个词语都是有意义的(即该词对文档的内容贡献少),那么如何来判断词语对文档的重要度呢,这里介绍一种方法:TF-IDF. 一,TF- ...
随机推荐
- 谈谈JSF业务线程池的大小配置
1.简介 JSF业务线程池使用JDK的线程池技术,缺省情况下采用Cached模式(核心线程数20,最大线程数200).此外,还提供了Fixed固定线程大小的模式,两种模式均可设置请求队列大小. 本文旨 ...
- Row Major
Smiling & Weeping ----昨天, 别人在我身旁大声说出你的名字, 这对于我, 像从敞开的窗口扔进了一朵玫瑰花. 思路:不客气地说,这是一道令人费解的题目,要求构造一个字符串, ...
- SpringBoot + 自定义注解,实现用户操作日志(支持SpEL表达式)
背景 一个成熟的系统,都会针对一些关键的操作,去创建用户操作日志. 比如: XX人创建了一条订单,订单号:XXXXXXXXX 因为操作人或者订单号是动态的,所以有些开发人员,不知道获取,就将这种操作日 ...
- 20个最佳实践提升Terraform工作流程|Part 2
在上一部分,我们一同探讨了构建 Terraform 项目的一些策略,以及使用 Terraform 管理 IaC 的部分最佳实践.今天,我们将继续深入研究将 Terraform 代码提升到新水平的具体要 ...
- Vue2系列(lqz)——slot插槽 (内容分发)、2 transition过渡、3 生命周期、4 swiper学习、5 自定义组件的封装、6 自定义指令、7 过滤器
文章目录 1 slot插槽 (内容分发) 1.1 基本使用 1.2 插槽应用场景1 1.3 插槽应用场景2 1.4 具名插槽 2 transition过渡 3 生命周期 4 swiper学习 5 自定 ...
- CMake中添加 -lpthread 编译参数
问题:当在linux命令行中编译关于进程/线程的源文件时,需要加上 -lpthread 参数动态链接线程库而在CMake中如何加入呢? 方法:只需在 add_executable() 命令前面加上以下 ...
- 一次考试的dp题
很明显是dp 看题目的时候我们先进行初步的思考,发现一个性质 一个点时不可能被重复覆盖三次的很显然,如果一个点被覆盖了3次,这3个覆盖他的区间一定是有一个区间被完全包含的,因为有贡献的左右端点只有两个 ...
- 它让你1小时精通RabbitMQ消息队列、且能扛高并发
支持.Net Core(2.0及以上)与.Net Framework(4.5及以上) 本文所述方案近期被江苏省某亿级数据量+高并发的政府"物联网"项目采用,获得圆满成功!! [目录 ...
- RL 基础 | Value Iteration 的收敛性证明
(其实是专业课作业 感觉算法岗面试可能会问,来存一下档) 目录 问题:证明 Value Iteration 收敛性 0 Definitions - 定义 1 Bellman operator is a ...
- POSIX 真的不适合对象存储吗?
最近,留意到 MinIO 官方博客的一篇题为"在对象存储上实现 POSIX 访问接口是坏主意"的文章,作者以 S3FS-FUSE 为例分享了通过 POSIX 方式访问 MinIO ...