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- ...
随机推荐
- 数据可视化【原创】vue+arcgis+threejs 实现流光立体墙效果
本文适合对vue,arcgis4.x,threejs,ES6较熟悉的人群食用. 效果图: 素材: 主要思路: 先用arcgis externalRenderers封装了一个ExternalRender ...
- Node.js 使用 officecrypto-tool 读取加密的 Excel (xls, xlsx) 和 Word( docx)文档
Node.js 使用 officecrypto-tool 读取加密的 Excel (xls, xlsx) 和 Word( docx)文档, 还支持 xlsx 和 docx 文件的加密(具体使用看文档) ...
- 解决Eclipse中启动Tomcat报unable to start within 45 seconds问题
启动项目的时候报Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the server ...
- 拯救“消失的她”——双系统grub完美恢复方案
双系统grub意外消失怎么办? 不用重装系统.不用去维修店.不会丢数据,教你一招,完美恢复grub! 背景 我的电脑是windows和linux双系统,启动项使用的grub.某天准备切换linux时突 ...
- Java实践项目 - 商品分类
Smiling & Weeping ---- 好想回到那个拉钩许诺的年代 1.1商品分类的思路:一次性查询三级分类 (一级为美味麒麟榜,二级为闭眼入,第三级为商品) 优点:只需要一次查询,根据 ...
- 如何解决IOS 15提示“此App的开发者需要更新APP以在此IOS版本上正常工作”, 无法打开安装的APP的问题
在苹果手机最新的IOS 15 beta的系统上安装自签名或者企业签名的APP时,可能会遇到如下的错误提示: 此App的开发者需要更新APP以在此IOS版本上正常工作 The developer of ...
- 使用docker搭建seafile服务器
工作需要在单位和家里的不同电脑上同步指定文件夹及其内容.对比了一些解决方案,最终还是选择熟悉的seafile来做. 需要按照官方文档进行seafile的安装,选择官方推荐的docker方式快速部署. ...
- CF1676G
题目简化和分析: 求一颗子树的黑白两数是否相等. 我们设黑 \(1\),白 \(-1\),若某一棵子树的权值为 \(0\),说明此刻的黑白个数相等,贡献加一. 从根搜索,每次将值传递给父亲,判断父亲此 ...
- Vue源码学习(十三):实现watch(一):方法,对象
好家伙, 代码出了点bug,暂时只能实现这两种形式 完整代码已开源https://github.com/Fattiger4399/analytic-vue.git Vue:watch的多种使用方法 ...
- windows上时间项目时间正常,Ubuntu16.04上时间错误
项目本次测试时间正常,放到服务器上时间差8个小时 1.查看Ubuntu系统时间,发现时间设置错误 date -R 该命令会把我们系统的时间还有时区显示出来,我们是属于东八区,如下图: 如果不是 +08 ...