[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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM