← 返回项目档案

项目复盘 · 2018

营创易:热点评分、语义路径与人工审核如何组成创意工具

从四版需求、热点脚本、小程序和审核台还原营销路径产品,并区分路径算法设计与现存代码证据。

小程序热点分析内容营销路径推荐

内容策划追热点时,真正困难的不是知道“什么正在变热”,而是找到品牌与热点之间自然、可解释、又不冒犯用户的连接。营创易把这个过程拆成两个输入:用户给出产品或服务关键词,再选择一个热点;系统返回由若干概念节点串成的候选路径,供策划者继续写成故事。

历史材料保存了四版需求、热点采集脚本、WePY 小程序和 Vue 审核台。它们足以还原热点榜、路径检索、收藏分享和人工审核闭环,也记录了计划中的知识图谱路径算法。但生成路径的主服务源码不在当前仓库快照中,所以算法章节必须区分“需求中定义的方法”与“现存代码可以证明的方法”。

产品不是自动写文章

1.0 需求把产品定位为“基于知识图谱的营销创意生成效率工具”。它输出概念链条,不输出成稿。目标用户需要根据链条判断事实是否成立、品牌语气是否合适,以及转折是否足够有趣。

这个边界决定了五个核心业务对象:

对象关键字段用途
热点标题、来源、排名、热度、趋势、描述、更新时间路径终点与首页推荐
热点历史热度、趋势、记录时间展示变化并对过期热点降权
新闻热点标识、标题、摘要、来源解释热点背景
路径始点、终点、节点序列、审核状态、原因核心创意提示
用户路径用户、路径、始点输入、收藏状态收藏、分享与个人列表

小程序接口还显示,路径返回对象至少包含 pathIdpathNodesbeginInput、审核状态和用户关联信息。前端将首节点、末节点和中间节点拆开显示,并通过用户关联是否存在判断收藏状态。

用户端的完整执行链

小程序有两种进入路径的方式。用户可以从首页热点榜打开热点详情,查看热度、推荐程度、说明和相关新闻,再点击“关联热点”;也可以进入营销路径页,分别搜索关键词和热点。

实际流程如下:

  1. 应用启动时检查登录态和用户信息,缺失则进入登录页。
  2. 首页按页读取热点;热点详情把热度和推荐值限制在零到一百之间展示。
  3. 路径页保存最近五组“关键词—热点”历史,同时读取系统推荐的组合。
  4. 两个输入都就绪后,请求路径搜索,第一页默认返回五条。
  5. 若第一页无结果,服务端可以返回一组替代热点,前端让用户直接改选后再次搜索。
  6. 返回路径被转换成“始点—中间节点—终点”,再按估算高度分配到左右两列。
  7. 用户可打开大图、收藏、取消收藏或分享单条路径;个人中心按页读取已收藏路径。

左右瀑布流不是简单按奇偶分列。代码以“中间节点数加二”估算每张卡片高度,每次把下一条放入当前累计高度较小的一列。这是一个轻量贪心布局,能减少两列高度差,又不需要读取实际渲染尺寸。

热点到营销路径
榜单抓取热点快照分源评分时间衰减热点推荐
关键词与热点候选路径规则过滤排序用户搜索结果
候选路径人工审核推荐或下线
用户搜索结果收藏或分享用户路径

路径算法在需求里怎样定义

1.0 需求提出的路径生成方法是:

  1. 用户关键词先匹配商品名称体系。
  2. 商品名称和热点名称分别匹配话题树或话题下的优质问答语料。
  3. 两侧沿话题树向上探索,直到找到共同话题。
  4. 把两侧节点拼成从产品到热点的候选路径。

当时计划用多级商品分类和品牌名称作为产品词表,用话题树及优质问答作为语料。1.1 又提出第二条思路:从用户关键词扩展联想词,从热点分词扩展联想词,再连接两侧结果。

需求还为候选路径定义了优化和排序规则:相邻节点关联度需落在可理解且不至于过近的区间;整条路径暂定四到九个节点,即二到七个中间节点;删除除汉字、英文字母和数字之外的异常节点;合并大小写差异、字符相同或含义相近的重复节点;优先按相邻节点平均关联度降序,其次按节点数升序,再按中间节点字母顺序稳定排序。

这些规则体现了一个很好的产品判断:最短路径不一定是最有价值的路径。关系太近没有创意空间,关系太远又难以讲清;路径评分应该同时考虑可解释性、新颖度和长度。

但当前只找到调用路径搜索接口的小程序和审核前端,没有主服务、图数据、关联度计算或离线任务源码。因此,不能确认话题树算法、关联阈值和排序公式最终按需求实现。它们是经过细化的设计证据,不是实现证据。

热点管线有可核对的代码

热点辅助脚本实现了两个来源:一个综合搜索榜和一个内容搜索热词榜。需求曾规划第三种社交话题来源,但当前脚本没有相应采集函数,说明范围在实现阶段发生了收缩。

采集器对网络请求最多重试五次,并逐次增加等待;榜单页通过 XPath 解析标题、排名、指数和趋势,再为每个热点抓取最多五条新闻,用首条摘要作为热点说明。数据库分为本地状态表和线上展示表:

  • topic_info 保存当前标题、基础分、上次数值、上次增量、来源类型和更新时间;
  • topic 保存对外展示的标题、趋势、分数、描述和推荐程度;
  • topic_score_history 在更新前保存旧分数、趋势和时间;
  • topic_news 保存热点关联的新闻标题、摘要和来源。

处理状态机是:新热点写入状态表和展示表,并补充新闻;已存在热点更新数值和增量,先把线上旧状态写入历史,再更新线上记录;本次未抓到的旧热点按离开榜单的天数衰减;最后把过期状态表中的数值归零,为未来重新上榜做准备。

热度与趋势公式

代码对两个来源分别计算基础分。设榜单名次为 a,来源指数或结果数为 b

  • 综合搜索榜:base = (51 - a) × 0.2 + b ÷ 100000 × 0.2
  • 内容搜索热词榜:base = (11 - a) × 0.3 + b ÷ 100 × 0.3

写入线上展示表前,分数乘十并限制在零到一百。当天也会先扣除一个来源系数;热点离榜 c 天后,再扣除 2^c × coefficient。指数级惩罚意味着热点离榜初期仍有短暂余温,随后迅速退出推荐。

下面的等价伪代码依据热点脚本中的两类来源公式和离榜衰减整理;变量名经过解释性改写,并非原文件逐行摘录:

python
def update_display_score(item, days_off_list, coefficient):
    if item.source == "integrated-search":
        base = (51 - item.rank) * 0.2
        base += item.index_value / 100000 * 0.2
    else:
        base = (11 - item.rank) * 0.3
        base += item.index_value / 100 * 0.3
    display = min(max(base * 10, 0), 100)
    if days_off_list > 0:
        penalty = (2 ** days_off_list) * coefficient
        display = max(display - penalty, 0)
    return display

综合搜索榜直接使用来源提供的上涨、持平或下降标记。内容搜索热词榜则比较本次增量与上次增量:首次有新增记为上涨,两次都无新增记为持平;上次增量大于零时,趋势值为两次增量之比;遇到负增量则回退为持平并把增量归零。

这里需要区分“热度”和“推荐程度”。脚本把来源榜单中的可视化热度宽度或按名次递减的值作为推荐值,同时用上述公式计算动态热度。前者更像来源内优先级,后者才包含指数和时间衰减。

人工审核是一套明确状态机

审核台有两个页面:自动候选审核和人工创建路径。候选列表支持按始点、终点查询,审核人员可把每条路径置为通过、下线或未决,再批量提交。后台同时展示热点的来源、热度、路径总数和通过数。

由前端代码可以确认状态语义:

  • 0:未决或恢复到未选择状态;
  • 1:审核通过,可作为推荐路径;
  • -1:下线,收藏列表可能保留,但不再允许继续分享。

人工创建页允许填写始点、二到六个中间节点,并从当日热点中选择终点;提交后直接走“添加并审核”流程。1.2 需求进一步改变了审核定位:自动计算的路径可以直接被搜索到,审核通过的路径承担推荐角色,审核不通过的路径下线。这个调整把人工审核从“所有结果上线前的闸门”变成“推荐质量与风险控制层”,减少了热点时效与人工吞吐之间的冲突。

项目文档还记录过坏案例:节点完全重复、人物姓名不适合作为中间节点,以及“节点歧义越多、转折越大越有趣”的探索。它揭示了审核真正要判断的不是图上是否连通,而是语义是否能被人理解、是否安全、是否仍符合当前语境。

版本演进留下了什么

小程序提交从页面开发、接口联调和体验版,连续推进到 1.1、1.2 和 1.4 发布;审核台经历了路径审核、接口代理和 1.2 整合。需求版本的变化更加具体:

  • 1.0 定义三大页面、离线路径、热点公式、路径约束和临时审核。
  • 1.1 新增热点详情、路径内与路径间排重、第二种探索方法、审核排序与统计、人工创建路径。
  • 1.2 增加页面与点击埋点,并把审核通过改为推荐、审核不通过改为下线。
  • 后续代码继续修复请求未结束就显示空状态、节点显示和线上环境问题。

文档版本、代码提交和实际发布编号并非一一对应,因而只能确认持续迭代,不能精确断言每个线上版本包含哪些需求。

代码里的关键风险

  • 热点脚本用字符串拼接 SQL,标题和摘要既可能破坏语句,也带来注入风险;应全部参数化。
  • 网络解析依赖固定 XPath 和页面文本,部分请求没有统一超时;来源页面改版可能让一次任务长时间卡住或悄悄返回空数据。
  • 只有新热点会插入新闻,旧热点更新分数时没有同步刷新说明和新闻,内容可能越来越陈旧。
  • 同标题若来自另一来源,脚本直接跳过,没有实体合并、来源优先级和证据保留机制。
  • Python 的 lstriprstrip 被当作精确前后缀删除使用,实际会按字符集合剥离,摘要可能被误删字符。
  • 本地状态表与线上展示表分别提交事务;中途失败会产生一边已更新、另一边未更新的不一致。
  • 小程序手工拼接查询参数,使用重复连接符且没有统一编码;含空格、连接符或非 ASCII 字符的输入可能出现歧义。
  • 请求封装在非成功响应时返回一个未正确绑定上下文的方法引用,调用方可能收到不可预测结果。
  • 分页逻辑用“本页少于五条”判断结束,把页面大小隐含在前端常量中。
  • 审核台直接修改 Array 原型清除空节点,影响全局行为;批量审核也没有显示并发版本或冲突提示。
  • 辅助仓库提交了完整虚拟环境和固定连接信息,历史连接材料应视为不可继续使用,并与代码彻底分离。

如果今天重建

  1. 热点采集写入不可变快照,再由独立作业标准化、合并同一事件并计算分数;每个来源保存抓取时间和失败状态。
  2. 热度分数按来源先归一化,再分别公开排名、当前规模、增长速度、持续时间和陈旧度,避免一个合成分数掩盖差异。
  3. 路径服务保存算法版本、每条边的关联证据、过滤原因和最终排序分,支持复现同一次生成。
  4. 自动候选增加品牌安全、敏感事件、事实时效和节点可读性检查;人工拒绝原因结构化回流评估集。
  5. 审核采用带版本号的状态机,禁止旧页面覆盖新审核结果;下线与删除分开处理。
  6. 用户端用标准参数序列化、明确分页游标和统一错误对象;收藏操作采用幂等接口。
  7. 建立四类核心指标:有结果率、审核通过率、路径采用或收藏率、坏案例类型分布。只有这些指标才能判断路径算法是否真的帮助创作。

营创易留下的最有价值经验,是把一个模糊的“帮我想创意”问题拆成了可运作的系统:热点采集解决时效,知识路径提供转折,人工审核控制可读性和风险,收藏分享承接真实使用。它的主要遗憾也很明确:算法主服务和运行指标没有保留下来,使今天只能恢复产品规约,无法验证路径质量。

证据边界

协作空间保留四版产品需求、运营备忘和坏案例;小程序、审核台和热点脚本分别保留持续提交。源码可以确认热点榜与详情、关键词和热点组合、路径分页、无结果替代热点、收藏、分享、个人列表、三态审核、人工建路和分源热点评分。

当前快照缺少路径生成主服务、图数据、训练语料、关联度计算、离线任务和生产指标。因此,话题树探索、联想词连接、阈值过滤和路径排序只作为需求设计呈现;已有发布提交也不能证明用户量、创意采用率或营销效果。文档中的潜在合作记录不作为成交或商业成功证据。