Python案例分析|文本相似度比较分析

article/2025/5/17 0:00:58

图片

 本案例通过设计和实现有关文本相似度比较的类Vector和Sketch,帮助大家进一步掌握设计Python类来解决实际问题的能力。

01、文本相似度比较概述

通过计算并比较文档的摘要可实现文本的相似度比较。

文档摘要的最简单形式可以使用文档中的k-grams(k个连续字符)的相对频率的向量来表示。假设字符的取值可能有128种不同的值(ASCII码),则向量的维度d为128k,对于Unicode编码,这更是天文数字。因此,一般使用哈希函数hash(s) % d把k-grams字符串s映射到0到d-1之间的整数,从而使得文档摘要向量的维度为d。

创建文档摘要向量之后,可通过比较两个文档摘要向量的距离的方法来判断两个文档的相似度。

下面先阐述向量类(Vector)和文档摘要类(Sketch)的设计与实现,然后使用文档摘要类来比较文档的相似度。

02、向量(Vector)类设计和实现

向量是一种数学抽象,n维向量可以使用一个n个实数的有序列表(x0, x1, …, xn-1)。向量支持基本的四则算数运算,故可通过运算符重载来实现。

向量的基本运算包括:两个向量的加法、一个向量乘以一个标量(一个实数)、计算两个向量的点积、计算向量大小和方向。

(1)加法:x + y = ( x0 + y0, x1 + y1, . . ., xn-1 + yn-1 )

(2)减法:x - y = ( x0 - y0, x1 - y1, . . ., xn-1 - yn-1 )

(3)标量积:αx = (αx0, αx1, . . ., αxn-1)

(4)点积:x·y = x0y0 + x1y1 + . . . + xn-1yn-1

(5)大小:|x| = (x02 + x12 + . . . + xn-12)1/2

(6)方向:x / |x| = ( x0/|x|, x1/|x|, . . ., xn-1/|x|)

基本的向量(Vector)类设计思路如下。

(1)定义带一个列表参数(向量的坐标,可以是任意维度)的构造函数,用于初始化对应向量的实例对象属性_coords。

(2)重载方法__getitem__(),返回第i个元素,即第i维坐标。

(3)重载方法__add__()、__sub__()、__abs__(),实现向量的运算,即加法、减法、大小(模)。

(4)定义方法scale()、dot()、direction(),实现向量的运算,即标量积、点积、方向。

(5)重载方法__len__(),返回向量的维度。

(6)重载方法__str__(),返回向量的字符串表示。

基于上述设计思想,向量(Vector)的实现和测试代码如下所示。

【例1】向量类(Vector)的实现和测试(vector.py)。

import math
class Vector:"""笛卡尔坐标系向量"""def __init__(self, a):"""构造函数:切片拷贝列表参数a到对象实例变量_coords"""self._coords = a[:] # 坐标列表self._n = len(a) # 维度def __getitem__(self, i):"""返回第i个元素,即第i维坐标"""return self._coords[i]def __add__(self, other):"""返回2个向量之和"""result = []for i in range(self._n):result.append(self._coords[i] + other._coords[i])return Vector(result)def __sub__(self, other):"""返回2个向量之差"""result = []for i in range(self._n):result.append(self._coords[i] - other._coords[i])return Vector(result)def scale(self, n):"""返回向量与数值的乘积差"""result = []for i in range(self._n):result.append(self._coords[i] * n)return Vector(result)def dot(self, other):"""返回2向量的内积"""result = 0for i in range(self._n):result += self._coords[i] * other._coords[i]return resultdef __abs__(self):"""返回向量的模"""return math.sqrt(self.dot(self))def direction(self):"""返回向量的单位向量"""return self.scale(1.0 / abs(self))def __str__(self):"""返回向量的字符串表示"""return str(self._coords)def __len__(self):"""返回向量的维度"""return self._n
#测试代码
def main():xCoords = [2.0, 2.0, 2.0]yCoords = [5.0, 5.0, 0.0]x = Vector(xCoords)y = Vector(yCoords)print('x = {}, y = {}'.format(x, y))print('x + y = {}'.format(x + y))print('10x = {}'.format(x.scale(10.0)))print('|x| = {}'.format(abs(x)))print(' = {}'.format(x.dot(y)))print('|x-y| = {}'.format(abs(x-y)))
if __name__ == '__main__': main()

 

程序运行结果如下。

x = [2.0, 2.0, 2.0], y = [5.0, 5.0, 0.0]

x + y = [7.0, 7.0, 2.0]

10x = [20.0, 20.0, 20.0]

|x| = 3.4641016151377544

 = 20.0

|x-y| = 4.69041575982343

03、文档摘要类(Sketch)的设计和实现

文档摘要类(Sketch)用于封装文档的摘要信息。设计思路如下。

(1)定义带3个列表参数(text(文本)、k(k-grams)、d(文档摘要向量的维度))的构造函数。使用列表解析创建一个包含d个元素的列表freq(初始值为0),用于存储k-grams的频率。循环抽取文本的所有k-grams,并使用hash函数映射到0-d之间的整数,从而更新对应的列表freq的元素值(递增)。然后使用freq创建Vector对象vector,并调用向量对象的direction()方法进行归一化。最后把文档摘要向量vector并保存到实例对象属性_sketch。

(2)定义方法similarTo(),计算两个文档摘要向量的余弦相似度。

比较两个向量的常用方法包括欧几里得距离和余弦相似性度。给定向量x和y,其欧几里得距离定义为:

图片

 余弦相似性度定义为:

图片

 

基于Vector对象,给定向量x和y,其欧几里得距离为abs(x – y),余弦相似性度的计算方法为x.dot(y)。

(3)重载方法__str__(),返回向量的字符串表示。

基于上述设计思想,向量(Sketch)的实现和测试代码如下所示。

【例2】文档摘要类(Sketch)的实现和测试(sketch.py)。

import sys
from vector import Vector
class Sketch:"""计算文本text的k-grams的文档摘要向量(d维)"""def __init__(self, text, k, d):"""初始化函数:计算文本text的文档摘要向量"""freq = [0 for i in range(d)] #创建长度为d的列表,初始值0for i in range(len(text) - k): #循环抽取k-grams,计算频率kgram = text[i:i+k]freq[hash(kgram) % d] += 1vector = Vector(freq) #创建文档摘要向量self._sketch = vector.direction() #归一化并赋值给对象实例变量def similarTo(self, other):"""比较两个文档摘要对象Sketch的余弦相似度"""return self._sketch.dot(other._sketch)def __str__(self):return str(self._sketch)
#测试代码
def main():with open("tomsawyer.txt","r") as f:text = f.read()sketch = Sketch(text, 5, 100)print(sketch)
if __name__ == '__main__': main()

 

程序的运行结果如下。

[0.09151094195152963, …, 0.08903767325013694]

说明 /

哈希函数基于一个数值“种子”计算,在Python 3中,哈希种子会改变(缺省情况下),即给定对象的哈希值可能每次运行结果都不一样。因而,程序输出结果可能不同。

 

04、通过比较文档摘要确定文档的相似度

使用前文设计和实现的类Sketch,可以比较文档的相似度。

【例3】使用Sketch类比较文档的相似度(document_compare.py)。

import sys
from vector import Vector
from sketch import Sketch
#测试文档列表
filenames = [ 'gene.txt', 'pride.txt', 'tomsawyer.txt']
k = 5    #k-grams
d = 100000 #文档摘要向量维度
sketches = [0 for i in filenames]
for i in range(len(filenames)):with open(filenames[i], 'r') as f:text = f.read()sketches[i] = Sketch(text, k, d)
#输出结果标题
print(' '*15, end='')
for filename in filenames:print('{:>22}'.format(filename), end='')
print()
#输出结果比较明细
for i in range(len(filenames)):print('{:15}'.format(filenames[i]), end='')for j in range(len(filenames)):print('{:22}'.format(sketches[i].similarTo(sketches[j])), end='')print()

 程序运行结果如下:

图片

结果表明,相同文档的相似度为1,相同类型的文档(pride.txt和tomsawyer.txt)相似度比较大,而不同类型的文档(gene.txt和pride.txt)的相似度则比较低。 

 


http://chatgpt.dhexx.cn/article/iAZ1yORJ.shtml

相关文章

计算机如何判断两篇文章相似性

这个仍然是极客时间上,关于《索引技术核心20讲》的一篇笔记同时结合自己的理解加了点料,这个专栏虽然只有20讲,但是真不错,老师解答问题还是很积极,回答字数经常比问题字数多。有兴趣的朋友可以到我星球(在…

ai写文章检测原理(文章相似度检测)

小编来了!今天要和大家聊一聊关于ai写文章检测原理的评测对比。究竟哪种方法更加高效准确呢?让我们一起来看看吧! 概括:本文将从多个角度对ai写文章检测原理进行评测对比,包括算法准确性、速度、自动化程度、用户体验…

【跨语言剽窃检测】文本相似度分析之一

对比文件1: 2010年的跨语言剽窃检测新方法 作者RaFael Corezola Pereira instituion : UFRGS 摘要: 作者提出一个跨语言剽窃检测新方法,分为5个主要阶段: languange normalization、retrieval of candidate documents、classfier …

文本相似度综述

本文目录 文本相似度的定义文本相似度计算方法基于字符串的方法基于语料库的方法基于词袋VSMLSA、PLSALDA(需要进一步了解) 基于神经网络基于搜索引擎 基于世界知识基于本体基于网络知识 其他方法句法分析混合方法 文本相似度的定义 其中, common&#x…

JAVA-计算两篇文章的相似度

1.场景: 在很多公司的文件管理系统中,都有类似于对比多篇文章的相似度,例如在写公众号推文时,如果标记了原创,就会对比当前文章和库里已存在文章的相似程度,如果相似度过于高,则标记为原创的文章…

免费好用的文章相似度检测软件推荐

相信很多人在写作的时候都会遇到这样的问题,就是怕自己写出的文章被抄袭。为了保证自己的原创性,我们需要使用一些文章相似度检测软件来帮助我们检测文章是否被抄袭。那么,有哪些免费好用的文章相似度检测软件呢?下面就为大家介绍…

判断两篇文章的相似度

判断相似度 基于jieba 关键字提取的方法textrank关键字的提取代码:tf-idf关键字的提取代码:统计数据统计数据的代码:完整代码: 基于jieba 关键字提取的方法 textrank 1,将待抽取关键词的文本进行分词 2,以…

检测文章相似度的方法?文章原创度检测工具免费

免费检测文章相似度的软件,什么是检测文章相似度的软件,简单来说就是原创检测工具,相信不少的朋友都在利用这个功能来检测自己文章的原创度是多少?要做好一篇文章真的只需要检测文章的相似度吗?答案:肯定是…

[将小白进行到底] 如何比较两篇文章的相似度

其实这个题目已经有很多人写过了,数学之美里就有,最近阮一峰的博客里也写了,本文基本上遵循的就是他的思路,只是让其看起来再小白一点点。其实说白了就是用自己的话,再把同样一件事描述一下,顺便扩扩句&…

文本相似度的检测

项目原理 基于词频:统计文章中词频,构建词频特征向量,利用特征向量夹角的余弦值表示文本的相似度。两篇文章最大相似度为1,特征向量夹角为0。 基于词频的文本相似度检测步骤: 文本1和文本2分词—去停用词统计两篇文章的词频词频向量1和词频向量2相似度的计算分词:例:“…

网页抓取:PHP实现网页爬虫方式小结

抓取某一个网页中的内容,需要对DOM树进行解析,找到指定节点后,再抓取我们需要的内容,过程有点繁琐。LZ总结了几种常用的、易于实现的网页抓取方式,如果熟悉JQuery选择器,这几种框架会相当简单。 一、Ganon …

php中取页面的值_php如何抓取网页上的数据

php中抓取网页内容的实例详解 方法一:使用file_get_contents方法实现$url "http://news.sina.com.cn/c/nd/2016-10-23/doc-ifxwztru6951143.shtml"; $html file_get_contents($url); //如果出现中文乱码使用下面代码 //$getcontent iconv("gb2312…

关于如何使用PHP抓取网页数据并进行处理的经验

在网络时代,数据是无处不在的。很多时候,我们需要从网页上获取特定的数据,以便进行进一步的处理和分析。而PHP作为一种强大的编程语言,提供了丰富的函数和库来帮助我们实现这个目标。本文将分享一些关于如何使用PHP抓取网页数据并…

php根据URL获得网页内容

php 中根据url来获得网页内容非常的方便&#xff0c;可以通过系统内置函数file_get_contents(),传入url,即可返回网页的内容&#xff0c;比如获得百度首页的内容代码为&#xff1a; <?php $html file_get_contents(http://www.baidu.com/);echo $html; 就可以显示出百度首…

php抓取网页内容,获取网页数据

php通过simple_html_dom实现抓取网页内容&#xff0c;获取核心网页数据&#xff0c;将网页数据写入本地 xxx.json 文件 其代码实现逻辑&#xff1a; 1. 引入simple_html_dom.php文件 require_once simple_html_dom-master/simple_html_dom.php; 2. 获取远程或者本地html文件…

PS Adobe软件使用 快捷键

两年前学的&#xff0c;为了考一个高新 怕自己忘了 仅为防止以后自己忘记而做的备忘笔记&#xff0c;请勿吐槽 图片类型 JPEG 有损压缩格式(能够将图像压缩在很小的储存空间&#xff0c;图像中重复或不重要的资料会被丢失&#xff0c;因此容易造成图像数据的损伤。尤其是…

html选区控制怎么用,ps载入选区的快捷键是什么?

ps载入选区的快捷键是&#xff1a;ALTSO。在ps中&#xff0c;使用“ALTSO”快捷键&#xff0c;会弹出“载入选区”对话框&#xff0c;然后选择相应的通道&#xff0c;点击“确定”&#xff0c;即可载入选区。 ps载入选区有三种方法&#xff1a;右键菜单、ps载入选区快捷键、以及…

计算机中的PS颜色填充快捷键,ps颜色填充快捷键【设置办法】

喜欢使用电脑的小伙伴们一般都会遇到win7系统ps颜色填充快捷键的问题&#xff0c;突然遇到win7系统ps颜色填充快捷键的问题就不知道该怎么办了&#xff0c;其实win7系统ps颜色填充快捷键的解决方法非常简单&#xff0c;按照 1&#xff1a;首先我们先打开打开ps软件&#xff0c;…

html自由变换图形,ps自由变换的快捷键是什么?

在当前图层中&#xff0c;执行“编辑”——“自由变换”&#xff0c;或者使用ps自由变换快捷键ctrlT&#xff0c;周围会出现变换控件定界框。 当我们使用ps自由变换快捷键ctrlT&#xff0c;开启自由变换之后&#xff0c;然后再配合Ctrl、Shift、Alt&#xff0c;可以对图像进行缩…

计算机中的PS颜色填充快捷键,ps颜色填充快捷键【解决技巧】

很多小伙伴都遇到过ps颜色填充快捷键的困惑吧&#xff0c;一些朋友看过网上零散的ps颜色填充快捷键的处理方法&#xff0c;并没有完完全全明白ps颜色填充快捷键是如何解决的&#xff0c;今天小编准备了简单的解决办法&#xff0c;只需要按照 1&#xff1a;首先我们先打开打开ps…