字符串中的智能模式匹配

时间:2014-11-04 22:43:49

标签: regex string artificial-intelligence

假设我的文件名格式不同。我希望能够像人类一样从文件名中提取某些方面;模式识别。

显然,我可以通过正则表达式来强迫自己,但这不是我所追求的。假设我有这4个字符串:

[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 Yona
Wolf Girl and Black Prince
Mobile Suit Gundam AGE

或剧集编号:20, 05, 05, 36。你得到了我要去的地方。

有哪些建议的技术可以用来实现预期的结果,或者这是在大学里研究的东西,但仍然没有解决方案?

1 个答案:

答案 0 :(得分:1)

你正在寻找的是grammar induction并且它可以工作,但是让一个程序找出一个匹配某些字符串而不是其他字符串的正则表达式(或其他类型的模式)。你必须自己给它字符串,称为训练集,带有正例(应匹配的字符串)和负例(不应匹配的字符串)。

一种有趣的技术被称为boosting,你可以在其中学习很多精确的简单模式(不与负面例子匹配),但只匹配一些正面例子;但是当它们组合在一起时,会匹配大量的正面例子。

由于你想要提取子字符串而不仅仅是匹配字符串,我采用的方法是获取文件名的前缀并尝试匹配它们。通过这种方式,您可以知道子串的起始位置。这是一个例子:

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] _”。您也可以通过使用包含感兴趣内容的前缀来匹配结束位置。

要了解正则表达式学习,请参阅此post。请记住,自动学习永远不会是完美的,但您使用的示例越多,它就越准确。