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(序列相似度得分)最大值的逻辑。
实现方法
核心逻辑是单次遍历过程中实时更新最大值,不需要预先知道总行数,内存占用低,适配任意长度的文本文件:
- 进入行遍历循环前,初始化最大值存储变量,初始值设为相似度的最小可能值0;如果需要定位最大值对应的行,可以额外增加变量存储对应行号、行内容
- 每计算完一行的相似度得分,就和当前存储的最大值做对比,如果当前得分更高,就更新最大值及关联的行信息
- 所有行遍历完成后,即可输出最终的最大相似度结果
修改后完整代码
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
相关产品推荐
相关产品推荐

