Python规则匹配后分类结果总数与原数据集不符问题求助
问题分析与修复方案
我一眼就看出问题出在哪了——你的代码把每个文本和每条规则的匹配结果都单独记录了,导致同一个文本被反复添加到research或non_research里,这才会让两个列表的总长度远超过clean_data的实际数量。
具体问题拆解
举个简单例子:假设你有1条文本和3条规则,这条文本只匹配第2条规则。那你的代码会:
- 第1条规则不匹配 → 往
non_research加1次 - 第2条规则匹配 → 往
research加1次 - 第3条规则不匹配 → 往
non_research加1次
最终两个列表总长度是3,而实际应该是1。对应到你的场景,500+条规则,每个文本最多会被添加500多次,总长度自然会飙到11万+。
正确的逻辑思路
我们需要给每个文本做一次全局判定:
- 对单个文本,遍历所有规则,检查是否满足任意一条规则的要求
- 只要满足一条,就把它归到
research,并且停止继续检查其他规则 - 如果所有规则都不满足,才归到
non_research
这样每个文本只会被添加到其中一个列表一次,总长度就会和clean_data完全一致。
修复后的代码
research = [] non_research = [] for text in clean_data: is_research = False for rule in rules: # 先确认两个关键词都存在于文本中 if rule['kwd_root'] in text and rule['kwd_sub'] in text: # 计算两个关键词的位置差 root_pos = text.index(rule['kwd_root']) sub_pos = text.index(rule['kwd_sub']) if abs(root_pos - sub_pos) <= rule['word_count']: is_research = True break # 匹配到规则就提前退出循环,提升效率 # 根据全局判定结果归类 if is_research: research.append(text) else: non_research.append(text)
额外小提示
- 如果你担心
text.index()会因为关键词不存在报错(虽然我们已经用in做了前置判断,但极端情况可能有问题),可以换成text.find(),它找不到关键词会返回-1,更稳妥。 - 500+条规则的遍历可能有点慢,你可以把每个规则转换成带距离限制的正则表达式,用
re.search()来匹配,能提升不少效率。比如针对规则里的kwd_root和kwd_sub,生成类似f"{kwd_root}.{{0,{word_count}}}{kwd_sub}|{kwd_sub}.{{0,{word_count}}}{kwd_root}"的正则,这样可以一次性匹配两个关键词的位置关系。
内容的提问来源于stack exchange,提问作者kabilan karunakaran
相关产品推荐
相关产品推荐

