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. 使用“文心一言”编写技术博文《搭建企业知识库:基于 Wiki.js 的实践指南》

    百度于8月31日零点宣布,文心一言率先向全社会全面开放.我也是立即体验了下,感觉还不错.下面分享一下,如何使用"文心一言"写一篇技术博客. Step 01 生成文案主体 可以对文心 ...

  2. 如何实现一个数据库的 UDF?图数据库 NebulaGraph UDF 功能背后的设计与思考

    大家好,我是来自 BOSS直聘的赵俊南,主要负责安全方面的图存储相关工作.作为一个从 v1.x 用到 v3.x 版本的忠实用户,在见证 NebulaGraph 发展的同时,也和它一起成长. BOSS直 ...

  3. 【火坑】一切从TimeSpan说起

    小编在编写WPF程序时,需要做一个判断:定时使用Modbus协议使用Quartz.net 定时任务读取设备中的数据,同时也使用定时任务判断是否长时间获取不到数据的情况,如果程序中超过一分钟没有获取到数 ...

  4. 【RocketMQ】Rebalance负载均衡总结

    消费者负载均衡,是指为消费组下的每个消费者分配订阅主题下的消费队列,分配了消费队列消费者就可以知道去消费哪个消费队列上面的消息,这里针对集群模式,因为广播模式,所有的消息队列可以被消费组下的每个消费者 ...

  5. java_方法使用细节

    java_方法使用细节 1.一个方法想要返回多个值 思考?一个方法如何返回多个值 返回数组 class AA{ public int[] getSumAndSub(int n1, int n2){ / ...

  6. OpenSSL 生成 RootCA (根证书)并自签署证书(支持 IP 地址)

    背景 某机房内部访问需要配置 HTTPS,网上找的一些证书教程都不是特别好,有些直接生成证书,没有根 CA 的证书导致信任不了 Ubuntu 机器,有些教程只有域名生成,没有 IP 生成,有些甚至报错 ...

  7. [GKCTF 2020]cve版签到

    通过题目的提示可知,这是一个CVE(cve-2020-7066)的复现 点击进之后也无回显 看了这个cve之后,知道这个cve就是这个get_headers()会截断URL中空字符后的内容 就根据cv ...

  8. 关于AI时代的程序架构的变化

    以ChatGPT为代表的AI出现,表示着AI的零点时刻已经突破.现在AI的使用已经不用再多说了,实际上是已经侵入到各行各业.所有人都在疯狂寻找本行业AI的使用场景,这样的盛景只在互联网刚出现的时候能感 ...

  9. U盘插入过手机后再拔出来,windows无法识别的解决办法

    win键+X,设备管理器. 找到"通用串行总线控制器",大容量USB设备,右键,卸载设备. 拔出U盘,再插入U盘. 就好了. 很明显,U盘插入手机,然后设置里点弹出后再拔,这是很规 ...

  10. pta乙级1033(C语言)散列表解法

    #include"stdio.h" #include"string.h" int main() { int flag=1; char w[100010],ch[ ...