如何在数据库列表与用户文件列表中查找最大相似字符串?
大列表间相似字符串匹配的解决方案
问题背景
现有两个列表:
- 数据库列表(约30万条):存储公司名称类数据
- 用户文件列表(约1000条):包含混合词汇,需从中找出与数据库列表中相似/相同的条目
示例数据:
list_with_name_in_BD = [ 'LOPEZ TRANSPORT', 'LOPEZ TRANSPORTATION', 'Lopez Transport', 'napora inc', 'Narain Transport Ltd' ]
list_with_words_in_file = [ 'Description', 'llc', 'Load', 'Rate', 'Amount', '$1950.00', 'Please', 'BBE', 'note', 'Lopez transport', 'LLC' ]
期望输出数据库中与用户文件里"Lopez transport"相似的所有条目:
output = [ 'Lopez Transport', 'LOPEZ TRANSPORT', 'LOPEZ TRANSPORTATION' ]
核心思路
- 预处理字符串:统一格式(如转小写、去空格),过滤无关条目,减少无效匹配
- 选择高效相似度算法:优先使用基于词集合的匹配算法(如Token Set Ratio),兼顾准确性与性能
- 优化匹配效率:利用用户列表规模小的特点,遍历用户有效词汇去匹配数据库列表,而非反向遍历
- 设置相似度阈值:通过阈值筛选符合要求的相似条目,避免误匹配
代码实现
使用rapidfuzz库(比传统fuzzywuzzy性能提升数倍,适合大列表):
首先安装依赖:
pip install rapidfuzz
实现代码:
from rapidfuzz import process, fuzz # 原始数据 db_list = [ 'LOPEZ TRANSPORT', 'LOPEZ TRANSPORTATION', 'Lopez Transport', 'napora inc', 'Narain Transport Ltd' ] file_list = [ 'Description', 'llc', 'Load', 'Rate', 'Amount', '$1950.00', 'Please', 'BBE', 'note', 'Lopez transport', 'LLC' ] # 过滤用户列表中的无关条目 def is_target_word(s): exclude = {'Description', 'Load', 'Rate', 'Amount', 'Please', 'note', 'BBE'} if s in exclude: return False stripped = s.strip() return len(stripped) >= 3 and not stripped.startswith('$') # 预处理:转小写,保留原始映射 db_lower_map = {item.lower(): item for item in db_list} db_lower_items = list(db_lower_map.keys()) filtered_file_words = [word.strip().lower() for word in file_list if is_target_word(word)] # 设置相似度阈值(满分100,可根据需求调整) SIMILARITY_THRESHOLD = 80 matched_results = set() # 遍历有效用户词汇,匹配数据库条目 for word in filtered_file_words: # 使用Token Set Ratio:忽略词序、大小写,基于词集合计算相似度 matches = process.extract( word, db_lower_items, scorer=fuzz.token_set_ratio, score_cutoff=SIMILARITY_THRESHOLD ) # 恢复原始格式并加入结果 for match_item, _ in matches: matched_results.add(db_lower_map[match_item]) # 输出结果 output = list(matched_results) print(output)
优化建议
- 后缀归一化:针对公司名,可提前去除常见后缀(如LLC、Ltd、Inc),例如将"Lopez transport llc"处理为"lopez transport",提升匹配准确率
- 倒排索引优化:对于30万条的数据库列表,可构建词-公司名的倒排索引,先通过用户词汇的分词快速缩小匹配范围,再计算相似度,进一步提升性能
- 阈值调整:根据实际业务需求调整相似度阈值,严格匹配可设为90+,宽松匹配可设为70-80
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

