如何从包含复杂重复变体的列表中提取各分类最短有效名称
原始数据分类提取最短有效名称解决方案
实现思路
- 先过滤原始数据中的nan空值,仅保留有效字符串
- 用正则将所有有效字符串按非字母字符拆分,提取出所有独立的单词片段,统计每个片段的出现频次
- 按长度从小到大遍历所有单词片段,排除被更短有效词包含的重复片段,同时过滤仅出现1次的杂音片段,最终得到各分类的最短有效名称
完整代码
import re import math from collections import defaultdict # 示例数据 data = [ 'apple', 'apple;apple(big)', 'apple(apple),apple', 'banana(banana)', 'banana', math.nan, 'cookie;cookie(cookie)', 'cookie(choco)' ] # 1. 过滤nan空值 valid_strs = [s for s in data if not (isinstance(s, float) and math.isnan(s))] # 2. 拆分单词片段并统计频次 word_count = defaultdict(int) for s in valid_strs: # 按所有非字母字符拆分,提取纯字母片段 words = re.split(r'[^a-zA-Z]+', s) # 过滤拆分产生的空串 words = [w for w in words if w] for w in words: word_count[w] += 1 # 3. 筛选最短有效名称 # 按单词长度从小到大排序 sorted_words = sorted(word_count.keys(), key=lambda x: len(x)) result = [] for word in sorted_words: # 检查当前词是否未被已选的更短有效词包含 is_valid = True for existed in result: if existed in word: is_valid = False break # 过滤仅出现1次的杂音片段,阈值可根据实际数据调整 if is_valid and word_count[word] >= 2: result.append(word) print(result) # 输出 ['apple', 'banana', 'cookie']
调整说明
如果你的有效名称包含数字、下划线等特殊字符,修改正则拆分规则即可,比如允许数字就把拆分语句改为:words = re.split(r'[^a-zA-Z0-9]+', s)
如果单分类的变体数量较多,可以调高频次阈值,比如把word_count[word] >= 2改为>=3即可。
内容的提问来源于stack exchange,提问作者Cookie
相关产品推荐
相关产品推荐

