打赏

[Alg] 文本匹配-单模匹配与多模匹配

实际场景:

网站的用户发了一些帖子S1, S2,...,网站就要审核一下这些帖子里有没有敏感词。

1. 如果网站想查一下帖子里有没有一个敏感词P,这个文本匹配要怎么做更快?

2. 如果网站想查一下帖子里有没有敏感词P1, P2,...,这个文本匹配要怎么做更快?

单模匹配与多模匹配

从以上的实际场景中,可以抽象出来两类文本匹配的问题。这里首先将"帖子"抽象为待匹配的序列S,将"敏感词"抽象为模式串P。那目标就是看看序列S中是否包含模式串P。

如果模式串P只有一个,要看看序列S中是否包含P,我们称这是单模匹配问题;

如果模式串有多个P1, P2,...,要将序列S中出现的所有模式串全部找出来,我们称这是多模匹配问题。

单模匹配常用算法-KMP、BM、Sunday

效率:KMP < BM < Sunday

对于单模匹配问题,要如何做?

暴力:如果分别从序列S和模式串P的第一个字符开始匹配,遇到不匹配的,则回到当前序列开始字符的下一个字符,和模式串的第一个字符来匹配,对于大规模文本非常不可行。

所以提出了KMP、BM、Sunday等算法进行优化。

多模匹配常用算法-字典树、AC、WM

对于多模匹配问题,常用的算法

1. 构建字典树。

2. AC算法。对于1中最简单的字典树,遇到不匹配的,又重新回根节点再次判断,并不能充分利用模式串的信息。可以参考KMP寻找next的方法,为字典树的节点找fail时跳转的节点,加速。

3. WM算法。

算法详解

<1> 单模匹配

1. KMP: https://www.cnblogs.com/shiyublog/p/12494790.html

2. BM: https://www.cnblogs.com/zhangtianq/p/5839909.html

3. Sunday: https://www.cnblogs.com/shiyublog/p/12601886.html

<2> 多模匹配

1. AC: https://www.cnblogs.com/shiyublog/p/12494120.html

2. WM: https://www.cnblogs.com/shiyublog/p/12616964.html

posted @ 2020-03-15 22:43  listenviolet  阅读(1610)  评论(0编辑  收藏  举报