首页 > 编程语言 >python 计算两个字符串最长子串超级加速版

python 计算两个字符串最长子串超级加速版

时间:2024-03-21 09:02:03浏览次数:38  
标签:子串 python str2 str1 list dataset max 字符串 data

import json
import time
from multiprocessing import Pool, Manager, freeze_support
from numba import jit


import pandas as pd
from tqdm import tqdm


def data_set(dataset):
    for i, one_data in enumerate(tqdm(dataset)):
        one = one_data[4].replace('\n', '')
        yield i, one



def get_text(i, one, dataset_dict, dataset_list):
    max_length = 0
    two_text = ""
    max_seq = ""
    for j, two_data in enumerate(tqdm(dataset_dict["data"])):
        if i == j :
            continue
        two = two_data[4].replace('\n', '')
        if one == two:
            continue

        temp = longest_common_substring_difflib(one, two)

        if len(temp) > max_length:
            max_length = len(temp)
            two_text = two
            max_seq = temp
    dataset_list.append([one, two_text, max_length, max_seq])

import difflib


def longest_common_substring_difflib(str1, str2):
    # 创建一个SequenceMatcher对象
    sm = difflib.SequenceMatcher(None, str1, str2)

    # 找到最大的匹配部分
    match = sm.find_longest_match(0, len(str1), 0, len(str2))

    # 如果找到匹配,返回最长公共子串
    if match.size:
        return str1[match.a: match.a + match.size]
    else:
        return ""
@jit(nopython=True)
def longest_common_substring(str1, str2):
    if len(str1) < len(str2):
        str1, str2 = str2, str1
    dp = [0] * (len(str2) + 1)
    max_length = 0
    end_pos = 0

    for i in range(1, len(str1) + 1):
        prev = 0
        for j in range(1, len(str2) + 1):
            temp = dp[j]
            if str1[i - 1] == str2[j - 1]:
                dp[j] = prev + 1
                if dp[j] > max_length:
                    max_length = dp[j]
                    end_pos = i
            else:
                dp[j] = 0
            prev = temp

    longest_substring = str1[end_pos - max_length: end_pos]
    return longest_substring


if __name__ == '__main__':
    freeze_support()

    # 示例
    str1 = "ABCDEF"
    str2 = "BABCDF"
    print("最长公共子串是:", longest_common_substring(str1, str2))
    start_time=time.time()

    with open('唐诗.json', 'r', encoding='utf-8') as f:
        dataset = json.load(f)
    dataset_list = Manager().list()
    dataset_dict = Manager().dict()
    dataset_dict["data"] = dataset
    p_list = []
    datasetiter = data_set(dataset)
    pool = Pool(processes=7)
    for i, one in datasetiter:
        pool.apply_async(get_text, args=(i, one, dataset_dict, dataset_list))
    pool.close()
    pool.join()
    pd.to_pickle(list(dataset_list), "dataset_list.pkl")
    print(time.time()-start_time)
# import pandas as pd
# data=pd.read_pickle("dataset_list.pkl")
# data=[[iiii,i.split(iiii)[0],i.split(iiii)[1:],ii.split(iiii)[0],ii.split(iiii)[1:]] for i,ii,iii,iiii in data]
# # 计算data[0,1,3]  任何相似都可找到 一个下文 计算 data[2,4]相似都可以找到一个上文

这段代码的功能是找出数据集中每个文本与其他文本中最长的公共子串,保存在一个列表中。代码主要使用了difflib库和numba库。

  • difflib库是用来处理文本之间的差异或相似性的库。在代码中,使用了difflib库的SequenceMatcher类和find_longest_match方法来计算最长的公共子串。

  • numba库是用来加速Python代码的库。在代码中,使用了numba库的jit装饰器来对longest_common_substring函数进行即时编译,以提高运行速度。

代码流程如下:

  1. 导入所需的库。
  2. 定义一个函数data_set,用于生成数据集中的文本。
  3. 定义一个函数get_text,用于计算每个文本与其他文本中的最长公共子串,并将结果保存在一个列表中。
  4. 导入数据集。
  5. 创建一个管理器,用于共享数据。
  6. 创建进程池。
  7. 对数据集中的每个文本,调用get_text函数进行计算。
  8. 关闭进程池,并等待所有进程完成。
  9. 将结果保存为pkl文件。
  10. 打印运行时间。

代码中还有一段被注释掉的代码,是用来读取保存的结果文件并进行进一步处理的。

标签:子串,python,str2,str1,list,dataset,max,字符串,data
From: https://blog.csdn.net/weixin_32759777/article/details/136727683

相关文章

  • python中出现Microsoft Visual C++ 14.0 or greater is required
    我尝试下载了Microsoftvisualc++14.0,但是依然不管用,而且它是真的很大…… 直接安装相应依赖也不管用(可能其他人管用?)——condainstalllibpythonm2w64-toolchain-cmsys2链接:https://blog.csdn.net/qzzzxiaosheng/article/details/125119006 然后我有找到一个,看着描......
  • Python 深度学习第二版(GPT 重译)(三)
    七、使用Keras:深入探讨本章涵盖使用Sequential类、功能API和模型子类创建Keras模型使用内置的Keras训练和评估循环使用Keras回调函数自定义训练使用TensorBoard监控训练和评估指标从头开始编写训练和评估循环您现在对Keras有了一些经验——您熟......
  • Python 深度学习第二版(GPT 重译)(四)
    九、高级计算机视觉深度学习本章涵盖计算机视觉的不同分支:图像分类、图像分割、目标检测现代卷积神经网络架构模式:残差连接、批量归一化、深度可分离卷积可视化和解释卷积神经网络学习的技术上一章通过简单模型(一堆Conv2D和MaxPooling2D层)和一个简单的用例(二进制图像......
  • golang vs python 应用项目语言选择
    目录1.语言选择2.python语言特点及应用场景2.1语言特点1.简单2.易于学习3.自由且开放4.丰富的库5.互动模式6.跨平台性7.可扩展8.数据库9.可嵌入10.高级语言2.2应用场景Python在系统编程中的应用Python在网络爬虫方面的应用Python在人工智能、科学计算中的应用Python在WEB开发中......
  • Python 深度学习第二版(GPT 重译)(一)
    前言序言如果你拿起这本书,你可能已经意识到深度学习在最近对人工智能领域所代表的非凡进步。我们从几乎无法使用的计算机视觉和自然语言处理发展到了在你每天使用的产品中大规模部署的高性能系统。这一突然进步的后果几乎影响到了每一个行业。我们已经将深度学习应用于几乎每个......
  • Python 深度学习第二版(GPT 重译)(二)
    四、入门神经网络:分类和回归本章涵盖您的第一个真实世界机器学习工作流示例处理矢量数据上的分类问题处理矢量数据上的连续回归问题本章旨在帮助您开始使用神经网络解决实际问题。您将巩固从第二章和第三章中获得的知识,并将所学应用于三个新任务,涵盖神经网络的三种最......
  • 字符串常用函数简易模拟
    strlensize_tMy_strlen(char*str){intcount=0;while(*str){count++;str++;}returncount;}strcpychar*my_strcpy(char*dest,constchar*src){char*ret=dest;//拷贝src指向的字符串到dest指向的空间,......
  • 【python】(02)初识迭代器Iterator
    系列文章回顾【python】(01)初识装饰器Decorator【python】(02)初识迭代器Iterator文章目录一.迭代器的定义二.迭代器的作用三.实际代码示例四.使用注意事项五.常见问题迭代器是Python中非常重要的概念,通过灵活运用迭代器可以实现高效的数据遍历和处......
  • 【Python从入门到精通】字符串详解
    Python不难学只要肯用心。  【Python从入门到精通】专栏课程:1、【Python从入门到精通】认识Python2、【Python从入门到精通】变量&数据类型3、【Python从入门到精通】列表&元组&字典&集合4、【Python从入门到精通】运算符&控制语句5、【Python从入门到精通】异常详......
  • 基于python+django+Spark的动漫推荐可视化分析系统
    摘 要近年来,随着互联网的蓬勃发展,企事业单位对信息的管理提出了更高的要求。以传统的管理方式已无法满足现代人们的需求。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,随着各行业的不断发展,基于Spark的国漫推荐系统的建设也逐渐进入了信息化的进程。这个系统......