|
|
@@ -25,6 +25,7 @@ TREES = ROOT / "scope_trees" / "trees_index.json"
|
|
|
FILTER_PROMPT = ROOT / "acquisition" / "query_filter.txt" # 筛选词在 acquisition/
|
|
|
OUT = ROOT / "data" / "queries" / "creation_demo.json"
|
|
|
PER = 20
|
|
|
+BATCH_N = 16 # 全 demo 统一抽这么多个「实质 / 形式」,各族共用同一批,方便切页签比较
|
|
|
KTYPE = ["怎么做", "有哪些", "为什么"]
|
|
|
MODALITY = ["视频", "图片"] # 被创作内容的形态(与教学帖本身格式无关),正交进所有家族
|
|
|
# 创作阶段意图轴(脊柱):灵感/选题/脚本 展开成创作者真会搜的词(query构造.md)。真实数据里
|
|
|
@@ -111,22 +112,33 @@ def main():
|
|
|
POOL = _leaves(idx, "作用") + _leaves(idx, "感受") + _leaves(idx, "意图")
|
|
|
print(f"实质 {len(SHI)} / 形式 {len(XING)} / 目的池 {len(POOL)} / 业务阶段 {len(INTENT)}")
|
|
|
|
|
|
+ # 全 demo 统一「一批实质 / 一批形式」——各家族都取同一批、且顺序一致,方便切页签横向比较
|
|
|
+ SHI_BATCH = rng.sample(SHI, min(BATCH_N, len(SHI)))
|
|
|
+ XING_BATCH = rng.sample(XING, min(BATCH_N, len(XING)))
|
|
|
+ print(f"统一批: 实质×{len(SHI_BATCH)} 形式×{len(XING_BATCH)}")
|
|
|
+
|
|
|
def pick(seq):
|
|
|
return rng.choice(seq)
|
|
|
|
|
|
+ def shi(i): # 按 query 序号轮转,保证每族都覆盖整批、首次出现顺序一致
|
|
|
+ return SHI_BATCH[i % len(SHI_BATCH)]
|
|
|
+
|
|
|
+ def xing(i):
|
|
|
+ return XING_BATCH[i % len(XING_BATCH)]
|
|
|
+
|
|
|
# 每家族:生成器 + 用到的轴(给前端标列)
|
|
|
# 业务阶段=脊柱,每族必带;模态+知识类型固定收尾;前面配 实质/形式/目的 之一或组合
|
|
|
families = [
|
|
|
{"key": "f1", "name": "实质 × 业务阶段", "axes": ["实质", "模态", "业务阶段", "知识类型"],
|
|
|
- "gen": lambda: {"parts": {"实质": pick(SHI), "业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
|
|
|
+ "gen": lambda i: {"parts": {"实质": shi(i), "业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
|
|
|
{"key": "f2", "name": "形式 × 业务阶段", "axes": ["形式", "模态", "业务阶段", "知识类型"],
|
|
|
- "gen": lambda: {"parts": {"形式": pick(XING), "业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
|
|
|
+ "gen": lambda i: {"parts": {"形式": xing(i), "业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
|
|
|
{"key": "f3", "name": "实质 × 形式 × 业务阶段", "axes": ["实质", "形式", "模态", "业务阶段", "知识类型"],
|
|
|
- "gen": lambda: {"parts": {"实质": pick(SHI), "形式": pick(XING), "业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
|
|
|
+ "gen": lambda i: {"parts": {"实质": shi(i), "形式": xing(i), "业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
|
|
|
{"key": "f4", "name": "(作用/感受/意图) × 业务阶段", "axes": ["作用/感受/意图", "模态", "业务阶段", "知识类型"],
|
|
|
- "gen": lambda: {"parts": {"目的": pick(POOL), "业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
|
|
|
+ "gen": lambda i: {"parts": {"目的": pick(POOL), "业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
|
|
|
{"key": "f5", "name": "纯业务阶段", "axes": ["模态", "业务阶段", "知识类型"],
|
|
|
- "gen": lambda: {"parts": {"业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
|
|
|
+ "gen": lambda i: {"parts": {"业务阶段": pick(INTENT), "模态": pick(MODALITY), "知识类型": pick(KTYPE)}}},
|
|
|
]
|
|
|
# 各部件按固定顺序拼成原串(内容维度在前,模态贴题材后,业务阶段+知识类型收尾)
|
|
|
order = ["实质", "形式", "目的", "模态", "业务阶段", "知识类型"]
|
|
|
@@ -137,7 +149,7 @@ def main():
|
|
|
for fam in families:
|
|
|
seen, items = set(), []
|
|
|
while len(items) < PER and len(seen) < PER * 40:
|
|
|
- parts = fam["gen"]()["parts"]
|
|
|
+ parts = fam["gen"](len(items))["parts"] # 序号轮转实质/形式批
|
|
|
q = " ".join(parts[k] for k in order if k in parts)
|
|
|
if q in seen:
|
|
|
continue
|