You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome扩展开发:YouTube视频标题与本地歌词文件名匹配算法选型

解决YouTube标题与本地歌词文件名的匹配问题

一、先做统一文本预处理(核心前提)

所有匹配问题的根源大多是字符、标点、格式差异,先把搜索词(YouTube标题)和文件名都标准化:

  • 统一转小写,避免大小写干扰
  • 移除所有标点符号(逗号、破折号、括号等),比如把"Baby, I love you"转成"baby i love you",和无标点的文件名对齐
  • 替换特殊拉丁字符:š→s、ć→c、č→c、ž→z,解决变音符号的拼写差异
  • 切掉无意义后缀:比如搜索词里的" - Audio"、" (Official Lyrics)",文件名里的.txt也要去掉
  • 合并多个空格为单个,避免空格数量差异

用Chrome扩展常用的JS写个预处理函数:

function normalizeText(text) {
  // 转小写
  let normalized = text.toLowerCase();
  // 保留字母、数字、空格,去掉其余所有字符
  normalized = normalized.replace(/[^\w\s]/g, '');
  // 替换特殊变音字符
  const charMap = { 'š':'s', 'ć':'c', 'č':'c', 'ž':'z' };
  normalized = normalized.replace(/[šćčž]/g, match => charMap[match]);
  // 移除常见的无意义后缀
  const uselessSuffixes = ['audio', 'official audio', 'lyrics', 'official video', 'video'];
  uselessSuffixes.forEach(suffix => {
    normalized = normalized.replace(new RegExp(`\\s+-?\\s+${suffix}$`), '');
  });
  // 合并多空格并去首尾空格
  normalized = normalized.replace(/\s+/g, ' ').trim();
  return normalized;
}

二、用简化的匹配逻辑(精准优先,避开复杂算法)

既然核心是文件名是搜索词的子串/近似子串,不用搞复杂的Levenshtein/Jaccard,按这个逻辑来:

  1. 初始化扩展时,把所有歌词文件名预处理一遍存起来,不用每次重复处理
  2. 拿到YouTube标题后先做预处理,得到标准化的搜索词
  3. 遍历所有预处理后的文件名,按优先级匹配:
    • 第一优先级:文件名是搜索词的子串,或者搜索词是文件名的子串(比如搜索词是"miki jevremovic kancone",文件名是"kancone",直接命中)
    • 第二优先级:计算两者的共同单词比例,比如把文本拆成单词数组,交集单词数除以较短数组的长度,超过60%就算匹配(可以自己调阈值)

三、修复你遇到的错误案例

你的问题:搜索"Miki Jevremović - Kancone"时匹配到"Ako jednom vidis Mariju"
经过预处理后:

  • 搜索词变成miki jevremovic kancone
  • 错误匹配的文件名变成ako jednom vidis mariju
    这俩没有任何共同单词,用上面的子串+共同单词比例逻辑,会直接排除这个错误结果,优先找到包含kancone的文件名

四、额外小优化

  • 加个歌手优先级:如果搜索词里能拆出歌手名(比如预处理后前几个单词),文件名包含歌手名的话,优先级再提一档
  • 缓存预处理结果:初始化时处理所有文件名,存在内存里,后续匹配直接用,省性能

内容的提问来源于stack exchange,提问作者Milos Stojanovic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 12:21:07