Knime中Subset Matcher节点返回排序列表,如何获取未排序的AntecedentsItems?
解决Knime Subset Matcher节点返回排序项集的问题
我之前也踩过这个Subset Matcher节点自动排序的坑!确实,这个节点默认会对匹配到的AntecedentsItems做升序排序,而关联规则数据库里的原始项集往往保留着生成时的顺序,这就导致没法直接对应上目标规则。下面给你几个可行的解决思路:
方法1:提前保存原始项集的顺序
这是最稳妥的方案,在生成或存储关联规则的时候,就把未排序的原始项集以字符串形式单独存为一列:
- 用
Collection Column to String节点,把原始的AntecedentsItems列转换为带固定分隔符的字符串(比如用逗号分隔,得到"21,12,15"),命名为Original_Antecedents。 - 当你用Subset Matcher匹配到排序后的项集后,再通过关联规则数据库中的
Original_Antecedents列反向查找对应的原始规则——或者干脆在匹配时直接用这个字符串列做辅助匹配(比如先把用户输入的项集也转成排序后的字符串,找到匹配的规则后再提取原始顺序的列)。
方法2:用自定义脚本替代Subset Matcher
如果不想依赖节点的默认排序逻辑,可以自己写匹配逻辑,完全控制项集的顺序:
比如用Python Script节点来实现自定义子集匹配,示例代码如下:
import pandas as pd # 读取输入的关联规则表(包含未排序的AntecedentsItems列) rules_df = knime_io.input_tables[0].to_pandas() # 读取用户要查询的产品项集 query_items = set(knime_io.input_tables[1].to_pandas().values.flatten()) # 筛选出原始项集包含查询项集的规则 rules_df['matches'] = rules_df['AntecedentsItems'].apply(lambda x: query_items.issubset(set(x))) matched_rules = rules_df[rules_df['matches']] # 输出匹配结果,保留原始AntecedentsItems的顺序 knime_io.output_tables[0] = knime_io.Table.from_pandas(matched_rules)
这个脚本会直接检查原始项集是否包含你的查询子集,完全不会改变原始项集的顺序,返回的就是数据库里原本的AntecedentsItems列表。
小提示
关联规则算法(比如Apriori、FP-Growth)本身在生成规则时通常会对项集做排序,所以如果你的原始规则是这些节点生成的,一定要在生成后立刻保存原始顺序的列,避免后续节点处理时丢失顺序。
内容的提问来源于stack exchange,提问作者José Antonio Blanco
相关产品推荐
相关产品推荐

