触发条件

  • 分类判据把多个字段拼成一个 haystack 一起做关键词匹配,例如 name + type + tags。
  • 上游 POI 数据是抓取的(高德 / 百度抓取),而非人工录入。
  • 上游会把 POI 所在的建筑自动挂进 tags 字段。
  • 判据里有关键词属于「场所名 / 建筑名」而不是「业态名」——例如「食堂」「广场」「图书馆」。

症状

  • 判据在数据的一部分上表现正常、另一部分反常,规则本身没有明显漏洞。
  • 具体表现:食堂里的每一家小铺都被判定成「大地点」,抢走了商业广场的落点。
    实测反例——「超超水果店」的 tags 是 美食;水果生鲜;便民服务;三食堂,
    与「食堂本身」的判据结果一致。
  • 单纯看 category 字段看不出任何异常:它们确实都正确地标着「美食」。
  • 不同校区表现不一致:某个校区的整批 tags 是错的(例如统一为 教育培训;校内设施),
    在该校区判据表现与其它校区不同。

容易误判的方向

  • 加更多业态关键词。 治不了——问题不是词表不全,而是命中的那个词本来就不该被当成业态证据。
  • 只检查 category 字段。 这个坑恰恰在 category 之外的字段里。
  • 认为是数据标注错误,去改正上游数据。 位置标签是上游自动挂的,不是标注员手误;
    即使这次改对了,下次同步又会覆盖回去。
  • 降低关键词权重 / 加打分排序。 会让判据从确定性变成概率性,反而更难解释和调参。

根因

tags 是一个混合语义字段:它同时装两种东西。

tags 里的词实际语义例子
业态词这个 POI 是什么便利店、小吃快餐、图书馆
位置词这个 POI 在哪里三食堂、校内设施、教学楼A

下游把 tags 当纯业态字段用,于是位置信息被当成了业态证据。

关键分辨点在于:同一个词出现在不同字段里,证据强度完全不同。

「食堂」出现在 name 里 → 这个 POI 就是食堂     (业态证据,强)
「食堂」出现在 tags 里 → 这个 POI 在食堂里面   (位置证据,弱)

同理,「图书馆」出现在 name 里说明这是图书馆;出现在某个小铺的 tags 里,
只说明这个铺子在图书馆楼内。

最终解决原则

  1. 按字段区分证据强度。 把「只在 name 里算数」的词单独成表(如 NAME_ONLY_HINTS),
    与「任意字段都算数」的词表(如 ANCHOR_HINTS)分开维护。判断「这个点是什么」只查 name;
    判断「这个点属于什么业态」才用 tags。
  2. 给噪声词最高优先级。 单独一张否决表(如 NOISE_HINTS:停车场、充电站、公交站、ATM…),
    命中即否决,优先于所有正向词表。理由:噪声词的信号方向比正向词更可信——
    「停车场」出现在哪个字段都说明这地方是停车场,而正向词出现在 tags 里可能是位置标签。
  3. 为「整批 tags 不可信」留兜底。 判据要能只靠 name 跑通。当某个校区的 tags 整批错误时,
    规则仍应给出正确结果——这是对第 1 条的强度检验。
  4. 保留人工覆盖口子。 关键词规则总有覆盖不到的边角,POI 上留一个 anchor 字段供管理端
    定死 true / false,不用改代码。规则覆盖大多数,人工覆盖兜长尾。

验证方法

三条断言缺一不可,且必须成对构造正反例:

  • 正例:食堂本身(「万家万里餐厅(三食堂)」「万家钱湖餐厅(一食堂)」)必须判定为大地点。
    → 证明「只看名称」不会漏掉真食堂。
  • 反例:位于食堂内的小铺(「超超水果店」,tags 含 三食堂)必须不判定为大地点。
    → 证明位置标签不提拔。
  • 鲁棒性:把某批数据的 tags 清空或替换成无关值(如 教育培训;校内设施),
    断言全部判据结果不变。
    → 证明判据不依赖 tags 的正确性。

第三条最容易被跳过,但它是唯一能证明「整批数据脏了也不会崩」的断言。

识别口诀

**判据在同一批数据上「一部分正常、一部分反常」,先怀疑某个字段在不同来源里语义不一致,
而不是怀疑规则写漏了词。**

对应到本项目:看到「某校区的判据结果和另一个校区不一样」,第一反应应该是去 diff
两批数据的 tags 构成,而不是去读规则代码。

推广形态:凡是从外部抓来的数据,都要问一句「这个字段里装的是不是只有一种语义」。
富文本备注、标签列、自由描述字段是高发区。

相关概念


本文归档于个人知识库 · 领域:CS & AI · 模块:04 Project_CS_AI/Algorithms