python 文本相似度_python实现余弦相似度文本比较

向量空间模型VSM:

VSM的介绍:

一个文档可以由文档中的一系列关键词组成,而VSM则是用这些关键词的向量组成一篇文档,其中的每个分量代表词项在文档中的相对重要性。

VSM的例子:

比如说,一个文档有分词和去停用词之后,有N个关键词(或许去重后就有M个关键词),文档关键词相应的表示为(d1,d2,d3,...,dn),而每个关键词都有一个对应的权重(w1,w1,...,wn)。对于一篇文档来说,或许所含的关键词项比较少,文档向量化后的向量维度可能不是很大。而对于多个文档(2篇文档或两篇文档以上),则需要合并所有文档的关键词(关键词不能重复),形成一个不重复的关键词集合,这个关键词集合的个数就是每个文档向量化后的向量的维度。打个比方说,总共有2篇文档A和B,其中A有5个不重复的关键词(a1,a2,a3,a4,a5),B有6个关键词(b1,b2,b3,b4,b5,b6),而且假设b1和a3重复,则可以形成一个简单的关键词集(a1,a2,a3,a4,a5,,b2,b3,b4,b5,b6),则A文档的向量可以表示为(ta1,ta2,ta3,ta4,ta5,0,0,0,0,0),B文档可以表示为(0,0,tb1,0,0,tb2,tb3,tb4,tb5,tb6),其中的tb表示的对应的词汇的权重。

最后,关键词的权重一般都是有TF-IDF来表示,这样的表示更加科学,更能反映出关键词在文档中的重要性,而如果仅仅是为数不大的文档进行比较并且关键词集也不是特别大,则可以采用词项的词频来表示其权重(这种表示方法其实不怎么科学)。

TF-IDF权重计算:

TF的由来:

以前在文档搜索的时候,我们只考虑词项在不在文档中,在就是1,不在就是0。其实这并不科学,因为那些出现了很多次的词项和只出现了一次的词项会处于等同的地位,就是大家都是1.按照常理来说,文档中词项出现的频率越高,那么就意味着这个词项在文档中的地位就越高,相应的权重就越大。而这个权重就是词项出现的次数,这样的权重计算结果被称为词频(term frequency),用TF来表示。

IDF的出现:

在用TF来表示权重的时候,会出现一个严重的问题:就是所有 的词项都被认为是一样重要的。但在实际中,某些词项对文本相关性的计算来说毫无意义,举个例子,所有的文档都含有汽车这个词汇,那么这个词汇就没有区分能力。解决这个问题的直接办法就是让那些在文档集合中出现频率较高的词项获得一个比较低的权重,而那些文档出现频率较低的词项应该获得一个较高的权重。

为了获得出现词项T的所有的文档的数目,我们需要引进一个文档频率df。由于df一般都比较大,为了便于计算,需要把它映射成一个较小的范围。我们假设一个文档集里的所有的文档的数目是N,而词项的逆文档频率(IDF)。计算的表达式如下所示:

1169804-20180621135958817-693673985.png

通过这个idf,我们就可以实现罕见词的idf比较高,高频词的idf比较低。

TF-IDF的计算:

TF-IDF = TF * IDF

有了这个公式,我们就可以对文档向量化后的每个词给予一个权重,若不含这个词,则权重为0。

余弦相似度的计算:

有了上面的基础知识,我们可以将每个分好词和去停用词的文档进行文档向量化,并计算出每一个词项的权重,而且每个文档的向量的维度都是一样的,我们比较两篇文档的相似性就可以通过计算这两个向量之间的cos夹角来得出。下面给出cos的计算公式:

20150920053035356

分母是每篇文档向量的模的乘积,分子是两个向量的乘积,cos值越趋向于1,则说明两篇文档越相似,反之越不相似。

文本比较实例:

对文本进行去停用词和分词:

文本未分词前,如下图所示:

1169804-20180621140625181-1538455335.png

文本分词和去停用词后,如下图所示:

1169804-20180621140931495-358024372.png

词频统计和文档向量化

对经过上一步处理过的文档,我们可以统计每个文档中的词项的词频,并且将其向量化,下面我直接给出文档向量化之后的结果。注意:在这里由于只是比较两篇文档的相似性,所以我只用了tf来作为词项的权重,并未使用tf-idf:

1169804-20180621142011282-478523801.png

向量化后的结果是:

[1,1,1,1,1,1,1,1,1,1,1,1,1,1]

两篇文档进行相似度的计算,我会给出两篇文档的原文和最终计算的相似度:

文档原文如下所示:

1169804-20180621143536704-1877279904.png

文档A的内容

1169804-20180621143653511-81509630.png

文档B的内容

1169804-20180621144616313-1490189173.png

余弦相似度代码实现:

1 importmath2 #两篇待比较的文档的路径

3 sourcefile = '1.txt'

4 s2 = '2.txt'

5

6 #关键词统计和词频统计,以列表形式返回

7 defCount(resfile):8 t ={}9 infile = open(resfile, 'r', encoding='utf-8')10 f =infile.readlines()11 count =len(f)12 #print(count)

13 infile.close()14

15 s = open(resfile, 'r', encoding='utf-8')16 i =017 while i

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501465.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python环境配置opencv_Python 3.5.1和Opencv 3.1的环境配置

1 在以下网站下载Python程序: https://www.python.org/ftp/python/3.5.1/python-3.5.1-amd64.exe 这里选择3.5.1版本2 下载后按照默认安装。 然后安装Numpy模块。 按WinR输入CMD,进入安装目录下的Lib\site-packages子目录,在联网状态下输入pi…

毕业C语言专业专业现状,C语言程序设计教学现状与课程优化及改革措施论文

C语言程序设计教学现状与课程优化及改革措施论文随着计算机技术的飞速发展和不断普及,计算机已经走进各行各业,与人们的生活息息相关,对计算机知识的掌握成为当前高校的教学目标。C语言兼有汇编语言和高级语言的双重优点,运用它既…

C 怎么读取Cpp文件_从PCD文件写入和读取点云数据

(1)学习向PCD文件写入点云数据建立工程文件ch2,然后新建write_pcd.cpp CMakeLists.txt两个文件write_pcd.cpp : #include <iostream> //标准C库中的输入输出的头文件 #include <pcl/io/pcd_io.h> //PCD读写类相关的头文件 #include <pcl…

JAVA入门级教学之(类之间究竟有哪几种关系呢)

关于计算机的一些专业名词的解释 1.泛化关系&#xff1a; 什么是泛化关系呢&#xff1f;简单来说就是一个子类继承父类&#xff0c;这就是一个泛化关系图例&#xff1a;或者说一个子接口继承父接口&#xff0c;这也是一个泛化关系图例&#xff1a;2.实现关系&#xff1a; 实…

c 字符串数组_在C++中将字符串转换为char数组

我们许多人遇到了错误‘cannot convert std::string to char[] or char* data type’。例如&#xff1a;Input : string s "geeksforgeeks" ;Output : char s[] { g, e, e, k, s, f, o, r, g, e, e, k, s } ;Input : string s "coding&q…

51C语言编译后执行到一半,“C语言” 读书札记之[再续编译执行]

介绍上一篇a.out(hello&#xff0c;world程序)执行之后发生了什么&#xff1f;这次通过系统硬件和操作做粗略的描述&#xff0c;这样对我们也是有一些帮助的。如果中间若有误&#xff0c;请不吝赐教。从键盘上读取a.out命令当我们打开我们的终端的时候&#xff0c;shell程序会执…

linux 安装mysql8_MySQL 8.0与MariaDB 10.4,谁更易于填坑补锅?

作者介绍贺春旸&#xff0c;凡普金科DBA团队负责人&#xff0c;《MySQL管理之道&#xff1a;性能调优、高可用与监控》第一、二版作者&#xff0c;曾任职于中国移动飞信、安卓机锋网。致力于MariaDB、MongoDB等开源技术的研究&#xff0c;主要负责数据库性能调优、监控和架构设…

JAVA入门级教学之(文档里的is-a、is-like-a、has-a到底是什么意思)

1.is-a&#xff1a;【什么什么是】 描述的是一个继承关系 2.is-like-a&#xff1a;【什么什么像】 描述的是一个接口关系 3.has-a&#xff1a;【什么什么包含】 描述的是一个关联关系

python 字符转义_2500字 字符串专题总结

我的完整施工计划已完成专题&#xff1a;1.我的施工计划2.数值专题这篇是字符串专题总结除了常见的数值型&#xff0c;字符串是另一种常遇到的类型。一般使用一对单引号或一对双引号表示一个字符串。字符串中如果遇到 \ 字符&#xff0c;可能是在做字符转义&#xff0c;所谓的转…

JAVA入门级教学之(异常机制的原理到底是什么)

* 1.异常是什么&#xff1f; * * 第一&#xff1a;异常模拟的是现实世界中"不正常的"事件 * * 第二&#xff1a;java中采用"类"的形式去模拟异常 * * 第三&#xff1a;类是可以创建对象的 * * 例如&#xff1…

python修改列表指定位置的_Python 基础教程—列表(1)

Python内置了多种序列&#xff0c;本次讨论&#xff1a;列表。列表是Python提供的容器型数据类型。可变并且有序。可变 - 列表中的每个元素的值可变&#xff0c;列表的长度可变&#xff0c;列表中的顺序可变。(支持增、删、改)有序 - 每个元素可以通过下标来确定位置1、 列表的…

操作系统之(一篇文章让你简单搞定:什么是进程和线程)

文章目录1.为什么引入进程2.进程究竟是什么&#xff1f;进程的定义和属性&#xff1a;3.进程的状态和转换4.什么是进程上下文5.进程的控制和管理6.为什么要引入线程7.线程的概念8.引入线程的好处9.进程和线程的区别1.为什么引入进程 1、我们知道&#xff0c;最早出现的OS系统是…

冒泡和快速排序的时间复杂度_八大排序算法性能分析及总结

一、排序算法说明排序的定义&#xff1a;对一个无序的序列进行排序的过程。输入&#xff1a;n个数&#xff1a;a1,a2,a3,…,an。输出&#xff1a;n个数的排列:a1,a2,a3,…,an&#xff0c;使得a1<a2<a3<…<an。排序的稳定性&#xff1a;相同值的节点相对位置是否会发…

docker 挂载目录_Docker容器数据管理

在Docker容器内部创建的文件默认存储在可写的容器层&#xff0c;容易产生几个问题:当容器不存在时&#xff0c;数据文件不能持久化&#xff0c;同时这些数据文件不方便在容器之外被其他进程使用。当容器运行的时候容器可写层严重依赖宿主机&#xff0c;不能轻易移动这些数据文件…

IndexNotReadyException: Please change caller according to com.intellij.openapi.project.IndexNotReady

打开AS有时会报这个错&#xff0c;之前没怎么在意&#xff0c;因为完全没影响&#xff0c;但是看起来标红就很难受&#xff0c;总觉得认真有强迫症的程序员才是好的程序员&#xff0c;所以特意查了解决办法&#xff0c;也很简单&#xff0c;就点击Files----->Invalidate and…

java数组有跨类建立对象_必会的 55 个 Java 性能优化细节!一网打尽!

程序员的成长之路互联网/程序员/成长/职场 关注阅读本文大概需要 10 分钟。来源&#xff1a;https://yq.aliyun.com/articles/662001在 Java 程序中&#xff0c;性能问题的大部分原因并不在于 Java 语言&#xff0c;而是程序本身。养成良好的编码习惯非常重要&#xff0c;能够显…

android平板截屏方法,Android 各种截屏方法

1 应用内截屏(无SurfaceView, TextureView)boolean cacheEnable captureView.isDrawingCacheEnabled();captureView.setDrawingCacheEnabled(true);captureView.buildDrawingCache();Bitmap bitmap captureView.getDrawingCache();cache[0] Bitmap.createBitmap(bitmap);cap…

新手操作HTML

一、 首先得学会使用HTML5-API手册&#xff0c;因为HTML的属性有很多很多&#xff0c;如果将这些属性全部记下来的话得不偿失&#xff0c;需要花费大量的时间和经历&#xff0c;因此我们需要学会使用这个帮主文档才能全面而深入的了解HTML&#xff1b; 就像你去找对象一样&am…

nginx 判断手机端跳转_nginx基本功能和工作原理

nginx能做什么反向代理正向代理负载均衡HTTP服务器(包含动静分离)反向代理和正向代理1.正向代理简单的说,我是一个用户,我无法直接访问一个网站,但是我能访问一个代理服务器,这个代理服务器能访问那个我不能访问的网站,于是我先连上代理服务器,告诉它我需要那个无法访问网站的内…

Node.js教程-express框架

概述 Express是基于Node.js平台(建立在Node.js内置的http模块上)&#xff0c;快速、开放、极简的Web开发框架。 中文官网 http://www.expressjs.com.cn/。 Github地址&#xff1a;https://github.com/orgs/expressjs。 Express核心特性&#xff1a; 可设置中间件来响应 HTTP…