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

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万+。

正确的逻辑思路

我们需要给每个文本做一次全局判定:

  1. 对单个文本,遍历所有规则,检查是否满足任意一条规则的要求
  2. 只要满足一条,就把它归到research,并且停止继续检查其他规则
  3. 如果所有规则都不满足,才归到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:23:29