问题描述
先说下背景,问题是这样的。我经常用下载软件去一些网站上下载新番回来看,但是每次下载新番都会遇到一些烦心事,比如:
这样的文件名我非常不喜欢,所以我写了一个脚本来批量修改这些文件名,脚本大致如下:
const fs = require('fs')
const path = require('path')
const file_path = [
[
"D:\download\[DMG][OVERLORD_II][01-13 END+SP01-13 END][1080P][HEVC_Ma10P][MKV]",
/[DMG][OVERLORD_II][(w*d+)(?:sEND)*][1080P_Ma10P][HEVC_AAC](w+)(.+)/,
"不死者之王2-",
],[
"D:\download\[SumiSora][NEW_GAME!!][01-12][MKV][1080p]",
/[SumiSora][NEW_GAME!!][(d+)][x265_aac](w+)(.+)/,
"NEW GAME!!-",
]
]
file_path.forEach((content) => {
fs.readdir(content[0], (err, file_arr) => {
file_arr.forEach((filename) => {
let arr = filename.match(content[1])
if (arr != null) {
let idx = arr[1]
let suffix = arr[2]
let old_path = path.join(content[0], filename)
let new_path = path.join(content[0], content[2] + idx + suffix)
fs.rename(old_path, new_path, (err) => {
if (err) {
throw err
}
console.log('Rename complete!', content[2] + idx + suffix)
})
}
})
})
})
说白了就是遍历所有文件,正则匹配对应规则,提取出集数,然后重命名。
但是这并不是非常好的办法,因为每当我又多下载了一部番的时候就需要去修改这个脚本添加新的正则规则,很烦躁。然后我就在想有没有更好的办法做这个。
我想过遍历剔除相同的字符串只保留不同的部分,这样就可以得到集数了,但有些特殊情况,比如有剧场版,名字虽然类似但集数不太一样,还比如SP的集数跟普通集数在一个文件夹里,也需要考虑处理,总之这个办法写代码也感觉不够通用。
然后我又想到了是否能够用机器学习的方法来写个程序训练它去识别这样的文件名,然后它之后就能自动帮我重命名。初步的想法是写一个贝叶斯分类器,然后我先标识一遍哪些是有用的词,让它能学习到从类似的文件名中筛选出集数这样的关键信息,只要到这一步就够了,后面我拼我想要的文件名和后缀之类的都挺容易。但我看了下网上的类似机器学习的库或者是分词库没了头绪。。。没写过机器学习的类似功能,有没有朋友能给个思路之类的,谢谢。
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…