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值以及进行文档相似度匹配(实战)的更多相关文章

  1. 配置允许匿名用户登录访问vsftpd服务,进行文档的上传下载、文档的新建删除等操作

    centos7环境下 临时关闭防火墙 #systemctl stop firewalld 临时关闭selinux #setenforce 0 安装ftp服务 #yum install vsftpd - ...

  2. 怎样在Linux下使用Markdown进行文档工作

    怎样在Linux下使用Markdown进行文档工作 在Linux系统中,编辑markdown能够用retext工具: sudo apt-get install retext retext Releas ...

  3. Linux系统通过FTP进行文档基本操作【华为云分享】

    [摘要] Linux系统里通过FTP可以对文档进行上传,更改权限和基本的文档管理. 获得Linux系统后,不熟悉命令操作的情况下,可以通过FTP工具进行文档操作,下面以WinSCP工具为例进行讲解: ...

  4. 机器学习实战之朴素贝叶斯进行文档分类(Python 代码版)

    贝叶斯是搞概率论的.学术圈上有个贝叶斯学派.看起来吊吊的.关于贝叶斯是个啥网上有很多资料.想必读者基本都明了.我这里只简单概括下:贝叶斯分类其实就是基于先验概率的基础上的一种分类法,核心公式就是条件概 ...

  5. Linux 计算某文件夹下的所有文件的md5值

    使用find 命令 find /root -type f -print0 |xargs -0 md5sum >a.md5 校验的话 md5sum -c a.md5

  6. SharePoint2016如何使用策略进行文档归档

    前言 最近项目用户需要提供文档按照日期或标题关键字进行对应的文档归档操作,为了实施这个操作,需要准备2个文档库,我这里准备了如下文档库: 1. 测试文档库:在测试文档中上传几篇文档,如下图: 2. 我 ...

  7. 利用kibana插件对Elasticsearch进行文档和索引的CRUD操作

    #添加索引PUT lagou { "settings": { "index": { , } } }#查看 索引设置 GET lagou/_settings GE ...

  8. 使用Word进行文档修订版本的比较

    项目经理在实际的工作过程中,比如要写文档方案,就需要对文档的修订版本进行管理和控制.在以前的工作中,笔者使用的是UltraEdit这个软件工具中的Ultra Compare这个子工具来进行的文档版本的 ...

  9. sharepoint2013用场管理员进行文档库的爬网提示"没有权限,拒绝"的解决方法

    爬网提示被拒绝,场管理员明明可以打开那个站点的,我初步怀疑是:环回请求(LoopbackRequest)导致的 解决方法就是修改环回问题.修改注册表 具体操作方法: http://www.c-shar ...

  10. Python TF-IDF计算100份文档关键词权重

    上一篇博文中,我们使用结巴分词对文档进行分词处理,但分词所得结果并不是每个词语都是有意义的(即该词对文档的内容贡献少),那么如何来判断词语对文档的重要度呢,这里介绍一种方法:TF-IDF. 一,TF- ...

随机推荐

  1. Leetcode刷题笔记——二分法

    二分法是搜索算法中极其典型的方法,其要求输入序列有序并可随机访问.算法思想为 输入:有序数组nums,目的数值target 要求输出:如果target存在在数组中,则输出其index,否则输出-1 将 ...

  2. 当你使用Taro时,你需要了解的一些事儿

    2017 年 1 月 9 日凌晨,万众期待的微信小程序正式上线,前有跳一跳等爆圈小游戏的带动,后有特殊时期下各类健康码小程序的加持,小程序成为了国内技术圈独树一帜的存在.但随着小程序的迅猛发展,其实在 ...

  3. 用Rust手把手编写一个Proxy(代理), 动工

    用Rust手把手编写一个Proxy(代理), 动工 项目 ++wmproxy++ gitee 传送门 github 传送门 设计流程图 flowchart LR A[客户端] -->|Http| ...

  4. 在 Net7.0环境下测试了 Assembly.Load、Assmebly.LoadFile和Assembly.LoadFrom的区别

    一.简介 很长时间没有关注一些C#技术细节了,主要在研究微服务.容器.云原生.编批等高大上的主题了,最近在写一些框架的时候,遇到了一些和在 Net Framework 框架下不一样的情况,当然了,我今 ...

  5. 解决WordPress修改固定链接结构后出现“404 Not Found”的情况

    解决办法 在宝塔面板找到部署的站点设置 点击进入配置文件,复制下方这段代码粘贴进入配置文件,操作完这步,去刷新下我们的网站,再打开文章链接就可以正常打开.访问了. location / { try_f ...

  6. Netty集成HTTP的GET和POST通讯

    核心就是ChannelInitializer的实现使用http 消息解码器 package com.coremain.handler; import io.netty.channel.ChannelI ...

  7. ERP 财务管理的应付帐款流程

    导读:应付帐款流程与应收帐款流程是财务管理的开端,也是财务工作的主要流程.若能够这两大流程控制好了,ERP系统的财务模块也就成功了一大半了.我先讲一下财务管理的应付帐款流程. 企业的应付帐款有很多种类 ...

  8. MySQL低配数据库被大量数据导入时KO

    在一个低配MySQL数据库(笔记本电脑虚机环境,虚机配置2CPU/3G内存),在3000万级别的大量数据LOAD DATA方式导入时,坚持一小时后,终于被KO了,甚至没写下任何有用的日志,只是在操作界 ...

  9. DRTREE - Dynamically-Rooted Tree 题解

    DRTREE - Dynamically-Rooted Tree 本题建议评蓝. 思路: 题目就是要对一颗不定根树求子树权值和. 这题不带修,如果带修难度会增加一点,就跟 遥远的国度 差不多. 首先分 ...

  10. js数据结构--集合

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...