Python 3.x中如何将字符串变体归为同一类别进行计数?
如何在Python 3.x中将公司名称变体归为一类计数
你当前的代码仅能统计完全一致的名称,无法识别同一公司的不同变体。针对给出的案例,这里提供两种可行的解决方案:
一、基于规则提取核心名称(适合变体规律明确的场景)
你的案例中,公司名称变体均为「核心名称+后缀」形式(比如.uk、ltd、Ltd.),可通过简单的字符串分割提取核心名称后统计计数:
my_list = ['Telecom.uk', 'Telecom ltd', 'Telecom Ltd.', 'Vodafone Ltd.', 'Vodafone Ltd'] results = {} for name in my_list: # 先按点分割取第一部分,再按空格分割取第一部分,得到核心名称 core_name = name.split('.')[0].split()[0] # 可选:统一大小写避免因大小写差异导致的分组错误 # core_name = core_name.lower().capitalize() if core_name in results: results[core_name] += 1 else: results[core_name] = 1 print(results)
执行后输出:
{'Telecom': 3, 'Vodafone': 2}
若遇到更复杂的后缀(比如plc、Corp.、Inc等),可扩展规则,先列出常见后缀再从名称中剔除:
common_suffixes = {'ltd', 'Ltd', 'Ltd.', 'plc', 'Corp.', 'Inc', '.uk', '.com'} def get_core_name(name): parts = name.split() # 移除末尾的后缀词 while parts and parts[-1] in common_suffixes: parts.pop() # 移除包含后缀的域名部分 core = ' '.join(parts).split('.')[0] return core # 后续计数逻辑与之前一致
二、模糊匹配分组(适合变体无规律的场景)
如果公司名称变体存在拼写差异、缩写等无规律情况,可使用fuzzywuzzy库识别相似名称:
- 先安装依赖:
pip install fuzzywuzzy python-Levenshtein
- 实现代码:
from fuzzywuzzy import process from collections import defaultdict my_list = ['Telecom.uk', 'Telecom ltd', 'Telecom Ltd.', 'Vodafone Ltd.', 'Vodafone Ltd'] results = defaultdict(int) unique_names = list(set(my_list)) for name in my_list: # 找到相似度最高的名称(阈值设为80,可按需调整) match, score = process.extractOne(name, unique_names, score_cutoff=80) # 提取匹配项的核心名称 core_match = match.split('.')[0].split()[0] results[core_match] += 1 print(dict(results))
这种方法能处理更复杂的变体场景,但需根据实际情况调整相似度阈值,避免误分组。
内容的提问来源于stack exchange,提问作者JoeFrank
相关产品推荐
相关产品推荐

