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

这篇具有很好参考价值的文章主要介绍了Python案例分析|文本相似度比较分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python案例分析|文本相似度比较分析,Python,python,开发语言,文本对比,相似度,原力计划

 本案例通过设计和实现有关文本相似度比较的类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 = 0
        for i in range(self._n):
            result += self._coords[i] * other._coords[i]
        return result
    def __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()

 文章来源地址https://www.toymoban.com/news/detail-573726.html

程序运行结果如下。

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,其欧几里得距离定义为:

Python案例分析|文本相似度比较分析,Python,python,开发语言,文本对比,相似度,原力计划

 余弦相似性度定义为:

Python案例分析|文本相似度比较分析,Python,python,开发语言,文本对比,相似度,原力计划

 

基于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的列表,初始值0
        for i in range(len(text) - k): #循环抽取k-grams,计算频率
            kgram = text[i:i+k]
            freq[hash(kgram) % d] += 1
        vector = 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()

 程序运行结果如下:

Python案例分析|文本相似度比较分析,Python,python,开发语言,文本对比,相似度,原力计划

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

 

到了这里,关于Python案例分析|文本相似度比较分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python实现因子分析(附案例实战)

            因子分析(Factor Analysis)是一种数据简化的技术。它通过研究众多变量之间的内部依赖关系探求观测数据中的基本结构,并用少数几个假想变量来表示其基本的数据结构。这几个假想变量能够反映原来众多变量的主要信息。原始的变量是可观测的显在变量,而假想

    2024年02月02日
    浏览(36)
  • Python数据分析案例20——我国家庭资产影响因素分析

    本次案例较为简单,符合人文社科、经济学管理学等专业本科生适用。 本文的数据来源于 中国家庭金融调查( China Household Finance Survey , CHFS )是西南财经大学中国家庭金融调查与研究中心(下称中心)在全国范围内开展的抽样调查项目,由甘犁教授于 2009 年发起并领导,收

    2024年02月09日
    浏览(44)
  • python统计分析——操作案例(模拟抽样)

    参考资料:用python动手学统计学 1、抽样         为了保证数据分析的可复现性,使用了随机种子。         np.random.choice()的用法参考:https://blog.csdn.net/maizeman126/article/details/135572042 2、计算样本均值  3、计算总体统计量          相关函数用法参照:python统计分析——单变

    2024年01月17日
    浏览(39)
  • Python案例分析|使用Python图像处理库Pillow处理图像文件

    本案例通过使用Python图像处理库Pillow,帮助大家进一步了解Python的基本概念:模块、对象、方法和函数的使用 使用Python语言解决实际问题时,往往需要使用由第三方开发的开源Python软件库。 本案例使用图像处理库Pillow中的模块、对象来处理图像:实现读取图像、获取图像信

    2024年02月16日
    浏览(48)
  • 【Python案例实战】水质安全分析及建模预测

    1.水资源的重要性 水是生命之源,是人类生存和发展的基础。它是生态系统中不可或缺的组成部分,对于维系地球上的生命、农业、工业、城市发展等方面都具有至关重要的作用。 2.水质安全与人类健康的关系 水质安全直接关系到人类的健康和生存。水中的污染物和有害物质

    2024年02月03日
    浏览(72)
  • chatgpt赋能python:Python关联性分析:介绍及应用案例

    在数据分析和机器学习领域中,关联性分析是一种经常被使用的工具。通过分析不同特征之间的相关性,可以获取大量有价值的信息,如客户行为模式、产品关联性等等。Python作为一种高效而简洁的编程语言也为开发者提供了很多关联性分析的工具。 关联性分析是一种模式挖

    2024年02月07日
    浏览(47)
  • Python数据分析案例15——超市零售购物篮关联分析(apriori)

    啤酒和纸尿裤的故事大多数人都听说过,纸尿裤的售卖提升了啤酒的销售额。 关联分析就是这样的作用,可以研究某种商品的售卖对另外的商品的销售起促进还是抑制的作用。 案例背景 本次案例背景是超市的零售数据,研究商品之间的关联规则。使用的自然是最经典的apr

    2023年04月15日
    浏览(43)
  • Python数据分析处理报告--实训小案例

    目录 1、实验一 1.1、题目总览 1.2、代码解析 2、实现二 2.1、题目总览 2.2、代码解析 3、实验三 3.1、题目总览 3.2、代码解析 4、实验四 3.1、题目总览 3.2、代码解析 哈喽~ 今天学习记录的是数据分析实训小案例。 就用这个案例来好好巩固一下 python 数据分析三剑客。 前期准备

    2024年02月10日
    浏览(48)
  • 数学建模(层次分析法 python代码 案例)

    目录 介绍:  模板: 例题:从景色、花费、饮食,男女比例四个方面去选取目的地  准则重要性矩阵:  每个准则的方案矩阵:​  一致性检验:  特征值法求权值: 完整代码: 运行结果:

    2024年04月29日
    浏览(40)
  • Python时间序列分析--ARIMA模型实战案例

    **本文将介绍使用Python来完成时间序列分析ARIMA模型的完整步骤与流程,绘制时序图,平稳性检验,单位根检验,白噪声检验,模型定阶,参数估计,模型检验等完整步骤。Python建立时间序列分析–ARIMA模型实战案例 时间序列指的是将带有同一指标单位的数值按照产生时间的先

    2024年01月17日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包