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

如何在数据库列表与用户文件列表中查找最大相似字符串?

大列表间相似字符串匹配的解决方案

问题背景

现有两个列表:

  • 数据库列表(约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'
]

核心思路

  1. 预处理字符串:统一格式(如转小写、去空格),过滤无关条目,减少无效匹配
  2. 选择高效相似度算法:优先使用基于词集合的匹配算法(如Token Set Ratio),兼顾准确性与性能
  3. 优化匹配效率:利用用户列表规模小的特点,遍历用户有效词汇去匹配数据库列表,而非反向遍历
  4. 设置相似度阈值:通过阈值筛选符合要求的相似条目,避免误匹配

代码实现

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 19:17:43