假设我有一些格式不同的文件名。我希望能够像人类一样从这些文件名中提取某些信息;这需要模式识别能力。
显然,我可以通过正则表达式强行解决这个问题,但这并不是我想要的。假设我有这四个字符串:
[MAS] Hayate no Gotoku!! 20 [BD 720p] [21D138F8].mkv[Leopard-Raws] Akatsuki no Yona - 05 RAW (MX 1280x720 x264 AAC).mp4[BLAST] Wolf Girl and Black Prince - 05 [720p] [C1252A5E].mkv[sage]_Mobile_Suit_Gundam_AGE_-_36_[720p][10bit][45C9E0D0].mkv
如你所见,所有这些文件名都有一定的模式,但并不完全相同。因此,通用的正则表达式无法解决这个问题。相反,我想探索计算智能技术,如人工神经网络(ANN)或其他智能方法来解决这个问题。
假设我们想要提取文件名。人类会返回这些值:
Hayate no Gotoku!!Akatsuki no YonaWolf Girl and Black PrinceMobile Suit Gundam AGE
或者是集数:20, 05, 05, 36
。你明白我的意思了。
有什么建议的技术可以用来达到预期的结果吗,或者这是大学里正在研究但尚未解决的问题吗?
回答:
你所寻找的被称为语法归纳,它通过让程序找出一个正则表达式(或其他类型的模式)来匹配某些字符串而不是其他字符串来工作。然而,你必须自己提供字符串,称为训练集,包括正面例子(应该匹配的字符串)和负面例子(不应该匹配的字符串)。
一种有趣的技术被称为提升,你可以学习许多简单的模式,这些模式是精确的(不匹配负面例子)但只匹配少数正面例子;然而,当它们结合在一起时,会匹配大量的正面例子。
由于你想提取子字符串而不是仅仅匹配字符串,我会采取的方法是取文件名的前缀并尝试匹配它们。这样你就知道子字符串从哪里开始了。这里有一个例子:
Positives:[MAS] [Leopard-Raws] [BLAST] [sage]_Negatives:[MAS] H[Leopard-Raws] Akat[BL[sage]_Mobile_Suit_Gundam_AGE_
如果操作正确,你应该能得到一个可以用于文件名前缀的正则表达式。通过一次增加一个字母的前缀,你可以知道感兴趣的内容从哪里开始。像这样:
[ False[s False[sa False[sag False[sage False[sage] True[sage]_ True[sage]_M False
这里发生的事情是我一次增加一个字符的文件名前缀,直到我学习的正则表达式匹配它。但我也想找到最长的匹配前缀(因为否则我会错过下划线,因为[sage]也是一个可接受的前缀),所以我继续向前移动,直到正则表达式不再匹配。这样我就会知道实际内容之前的前缀是”[sage]_”。你也可以用包含感兴趣内容的前缀来匹配它结束的位置。
要了解正则表达式学习,请查看这个帖子。请记住,自动学习永远不会是完美的,但你使用的例子越多,它就越准确。