实际上,在改善Hatena Diary时,我们没有用Trie结构进行模式匹配,而是采用了更为高速的Aho-Corasick算法。
Aho-Corasick算法是Alfred V.Aho和Margaret J.Corasick于1975年在论文《Efficient String Matching: An Aid to Bibliographic Search》中提出的古典算法,根据字典创建执行模式匹配的自动机,以实现在线性时间内对输入文本进行计算。这种高速算法的复杂度与字典大小无关。
Aho-Corasick算法利用Trie进行模式匹配,但它添加了返回的边,匹配失败时可以沿着边返回。如果图示的话,如图7.4所示。
例如将"babcdex"输入图中的Trie,那么找到bab的同时也找到了ab。因此,如果能在查找到bab之后不要返回开头的节点0,而是直接移动到节点2的话,就能立即找到ab。而将"节点6的下一个是节点2"这种路径添加到Trie中的预处理,就是Aho-Corasick算法的主要原理。至于添加这些路径的方法,只需从Trie的根节点进行广度优先搜索,找到合适的节点就能建立,这种算法也是众所周知的。
2005年时我们并没有想到利用Aho-Corasick算法进行关键字链接,后来是工藤拓告诉我们的。工藤拓是きまぐれ日記 (神经质的日记)的博主,语素分析库MeCab 的开发者,现在在Google参与Google日文输入法相关开发。其背景是,实现语素分析引擎,要将输入的文章与字典中的所有单词进行模式匹配,这与关键字链接的处理几乎是一样的,而且在自然语言处理中,这种任务使用Trie已成为惯例。
另外,用Aho-Corasick算法实现关键字链接的课题请参见第8章。
[TR]
[TD][I]498)this.width=498;' onmousewheel = 'javascript:return big(this)' height=308 alt="" src="http://pic.aIhUaU.com/201602/15/131511988.jpg" width=530 border=0>[/TD][/TR]
[TR]
[TD](点击查看大图)图7.4 Aho-Corasick算法[/TD][/TR]
Aho-Corasick算法
复杂度与字典大小无关的高速算法
根据字典创建自动机进行模式匹配,对输入文本实现了线性的计算时间