频道 5000 条视频我按标题去重,删掉的是不同片子

频道攒到 5000 条视频的时候,我想做一份本地索引,方便按标题搜索。原始数据是用 yt-dlp 拉的信息,--skip-download --write-info-json,存成每视频一个 json。第一步很自然:按标题去重,把看起来重复的合并掉。结果删完再抽查,发现被删的里面有一批是完全不同的视频。

场景很具体:一个以系列内容为主的频道,标题格式高度模板化,比如「第 3 期:xxx」「Fix it: xxx」「Weekly #42」。我当时的去重逻辑是标题完全相等就算重复,用 Python 一把梭:

import json, glob, hashlib
seen = {}
for f in glob.glob('info/*.json'):
    d = json.load(open(f))
    key = d['title'].strip().lower()
    if key in seen:
        continue
    seen[key] = d['id']

问题出在两点。一是标题里的空白和全角半角差异,.strip().lower() 处理不了;二是模板化标题本来就存在同名的不同集,比如同一期标题在不同年份重发,或者系列名相同但内容完全不一样。更隐蔽的是,有些视频标题被作者后期改过,info.json 里的标题和页面上的不完全一致。

后来改成用 video id 做主键,标题只做展示字段。去重只在 id 相同的情况下做,其他一律保留。需要按标题聚合时,单独建一个归一化字段:

def norm(t):
    t = t.strip().lower()
    t = t.replace(':', ':').replace(' ', ' ')
    return ' '.join(t.split())

归一化后的标题只用来做搜索和分组,不参与删除决策。代价是索引体积大了一点,但至少不会误删。

失效的地方也清楚:如果频道本身有大量重发或搬运内容,id 不同但内容相同,这套逻辑不会帮你合并,需要人工或额外做内容指纹。另外标题归一化对中文标点只能覆盖常见几种,遇到特殊符号还是会漏。我自己的坑是早期删掉的 json 没备份,只能重新拉一遍,那次限速拉了很久。

你们做本地索引时,标题字段是拿来做主键还是只做展示?有没有遇到过标题相同但 video id 不同的情况?

0
赞同度 100% · 0 条评论 · 2 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。