整理一下最近在做的一个内部 Skill 踩的坑,记录一下。
任务背景
这个 Skill 主要是通过采集一个集合站的平台热榜,再结合所有热榜内容,推理出最新的趋势热点。
具体原理是:跑 8 个平台上的热榜,选择出现在 3 个及以上平台的题,把它们判断为热门趋势。需要注意的是,这些标题不一定会完全一致,所以需要做一个语义判断。
结构非常简单:一个爬取,一个分析。
算法尝试
初始版本的设计是采集 8 个平台的榜单标题,全部塞给大语言模型分析。由于偷懒没有检查初步抓取结果,导致传送给大语言模型的内容过多(抓取时把整个页面内容都抓下来了)。因为没有检查内容,语言模型被卡住。同时也不知道公司这个版本支持单次多少字符,就想着可能得用算法方式解决。
第一版:Jaccard 相似度 + 图聚类
把标题切成连续的 2-3 字,计算 Jaccard 相似度,用图聚类把相似标题聚成候选话题(其实也不知道这段是什么意思,是 DS 老师说的)。最终生成的效果不太好,只能跑出来 2-3 个话题。
第二版:TF-IDF + 余弦相似度
把所有标题分词构建词典,把每个标题变成一个 5706 维向量(词频 × IDF),再计算余弦相似度(仍然不知道是什么意思,还是 DS 老师教的)。因为标题太短,向量很稀疏,基本上匹配不出来任何东西。
第三版:规则匹配
只能用穷尽的办法,根据前几轮找到的一些内容去推理规则,比如说《》【】成对符号里的内容、英文加数字的复合词、中文子串。一开始用 4 字匹配,结果很干净,但匹配到的内容很少;后面切换成 3 字,尚可但内容不够多;最后改成 2 字,碎片化太严重,导致大量误合并。
到了这里,感觉算法太复杂了——为了这么一个需求写这么复杂的算法,好像也没什么必要。
大语言模型
于是又转回大语言模型处理。这时突然发现,原来一开始清洗得不够干净,于是重新针对所有抓取按照平台不同规则进行清洗,再把所有字段统一大小写、删除空格、全角转半角,让所有字符串都干净后,再全量送给大语言模型分析。
但奇怪的是,大语言模型分析出来的数量仍然没有比算法多。肉眼分辨,应该不只分析出那么多才对,推测是因为语言模型收到的文字太多,模型疲劳了。于是又加了一步:随机打乱这些句子,再发送给语言模型,一共打乱 4 次,取并集后再去重。这下一次就能识别出 5-6 个话题,比原来的 3 个要好得多。
紧接着又发现了一些特殊情况,因为平台间表述不同,有时虽然是同一个意思或同一个话题,但具体描述有差异。比如最近《阿嬷的情书》特别火,有的平台在说这个电影好,有的在说票房好,但都代表《阿嬷的情书》是个热门趋势。所以并不需要语义上完全一致,也可以判定为同一个热门趋势,于是加了一个兜底规则:话题 A 和话题 B 共享大于等于 4 个连续中文字符的子串时,把它们判定为同一个话题。
到这里终于可以跑出完整数据了,一共有 7-8 条,顺利的话能跑出 10 来条。DONE!
结论
总结:每一步都要确认结果,不要急于求成,不然会浪费时间。语义分析还是大模型靠谱,写算法太麻烦。
评论