You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python逐行计算文本文件字符串相似度时如何获取最大序列得分

Python实现文本文件目标字符串校验及动态相似度最大值统计

需求说明

  • 逐行读取目标文本文件,校验指定目标字符串是否存在于文件中
  • 逐行计算每行文本与待匹配字符串的相似度,逐行打印行号、行内容、对应相似度结果
  • 适配任意行数的文本文件,无需预设行数,自动统计所有行的相似度得分并输出最大值

本次测试待匹配目标字符串为apple

测试用文本文件内容

Apple
rose
mango

初始实现代码

from difflib import SequenceMatcher
def search_str(file_path, word):
    with open(file_path, 'r') as file:
        content = file.readlines()
        count=0
        for line in content:
            count += 1
            print("Line{}: {}".format(count, line.strip()))
            sequenceScore = SequenceMatcher(None, line.strip(), word).ratio()
            print(f"Both are {sequenceScore * 100} % similar")
            print('DP{}:{}'.format(count,sequenceScore))
           
search_str(r'C:\Users\mine\Desktop\hackrf.txt', 'apple')

初始代码运行输出

Line1: apple
Both are 100.0 % similar
DP1:1.0
Line2: rose
Both are 22.22222222222222 % similar
DP2:0.2222222222222222
Line3: mango
Both are 20.0 % similar
DP3:0.2

存在的问题

实际使用场景中文本文件行数不固定,对应DP编号动态变化,无法提前固定统计数量,需要实现动态获取所有sequenceScore(序列相似度得分)最大值的逻辑。

实现方法

核心逻辑是单次遍历过程中实时更新最大值,不需要预先知道总行数,内存占用低,适配任意长度的文本文件:

  1. 进入行遍历循环前,初始化最大值存储变量,初始值设为相似度的最小可能值0;如果需要定位最大值对应的行,可以额外增加变量存储对应行号、行内容
  2. 每计算完一行的相似度得分,就和当前存储的最大值做对比,如果当前得分更高,就更新最大值及关联的行信息
  3. 所有行遍历完成后,即可输出最终的最大相似度结果

修改后完整代码

from difflib import SequenceMatcher
def search_str(file_path, word):
    with open(file_path, 'r') as file:
        content = file.readlines()
        count = 0
        # 初始化最大值相关变量
        max_score = 0
        max_line_num = 0
        max_line_content = ""
        for line in content:
            count += 1
            current_line = line.strip()
            print(f"Line{count}: {current_line}")
            # 如需不区分大小写匹配,可将两个对比字符串统一转小写,即current_line.lower(), word.lower()
            sequenceScore = SequenceMatcher(None, current_line, word).ratio()
            print(f"Both are {sequenceScore * 100} % similar")
            print(f'DP{count}:{sequenceScore}')
            # 实时对比更新最大值
            if sequenceScore > max_score:
                max_score = sequenceScore
                max_line_num = count
                max_line_content = current_line
        # 遍历结束后打印统计结果
        print("\n=== 相似度统计结果 ===")
        print(f"全局最大相似度值:{max_score}")
        print(f"最大相似度对应行号:Line{max_line_num},对应行内容:{max_line_content}")
        # 可根据业务需求设置存在性判定阈值,例如此处设置相似度≥0.9即判定目标字符串存在
        if max_score >= 0.9:
            print(f"判定结论:目标字符串「{word}」存在于当前文件中")
        else:
            print(f"判定结论:目标字符串「{word}」不存在于当前文件中")
           
search_str(r'C:\Users\mine\Desktop\hackrf.txt', 'apple')

补充说明

如果需要做不区分大小写的匹配,只需要在计算相似度时将两个对比字符串统一转为小写/大写即可,例如把SequenceMatcher的传参改为current_line.lower(), word.lower(),这样测试文件中首字母大写的Apple和待匹配词apple的相似度也会计算为100%,符合常规文本匹配的使用需求。


内容的提问来源于stack exchange,提问作者Madhushika Niroshanee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:36:18