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,按这个逻辑来:
- 初始化扩展时,把所有歌词文件名预处理一遍存起来,不用每次重复处理
- 拿到YouTube标题后先做预处理,得到标准化的搜索词
- 遍历所有预处理后的文件名,按优先级匹配:
- 第一优先级:文件名是搜索词的子串,或者搜索词是文件名的子串(比如搜索词是"miki jevremovic kancone",文件名是"kancone",直接命中)
- 第二优先级:计算两者的共同单词比例,比如把文本拆成单词数组,交集单词数除以较短数组的长度,超过60%就算匹配(可以自己调阈值)
三、修复你遇到的错误案例
你的问题:搜索"Miki Jevremović - Kancone"时匹配到"Ako jednom vidis Mariju"
经过预处理后:
- 搜索词变成
miki jevremovic kancone - 错误匹配的文件名变成
ako jednom vidis mariju
这俩没有任何共同单词,用上面的子串+共同单词比例逻辑,会直接排除这个错误结果,优先找到包含kancone的文件名
四、额外小优化
- 加个歌手优先级:如果搜索词里能拆出歌手名(比如预处理后前几个单词),文件名包含歌手名的话,优先级再提一档
- 缓存预处理结果:初始化时处理所有文件名,存在内存里,后续匹配直接用,省性能
内容的提问来源于stack exchange,提问作者Milos Stojanovic
相关产品推荐
相关产品推荐

