Mensa是Java的模式匹配開源庫

banq發表於2015-02-10
Mensa提供了一個強大且高效的模式匹配問題的解決方案,具體地說:Mensa可以很容易在源文字中發現出現的任何關鍵詞,舉例,你可以在一本小說(源文字)中發現所有的某個人物名稱(關鍵詞)。

dell-oss/Mensa · GitHub

Mensa能一次性快速有效處理源文字,無論你想在其中搜尋一個關鍵詞或一百萬個關鍵詞。

Mensa不侷限於匹配文字資料,只要是任意長符號序列,這些符號的資料型別可以是任意的,字元 byte number 音符等等。

標準的Java JDK內建了字元匹配搜尋功能,包括字串搜尋和正規表示式。大部分情況確實很好,但是在下面問題場景就需要重新考慮:

1.標準庫只適合操作記憶體中字元,它們不適合搜尋非常大的文字,這些文字無法放入整個記憶體中。

2.內建的正規表示式可以識別詞邊界,但是比簡單字串匹配需要更多時間,而不考慮詞邊界,"boy"將會匹配"30-day boycott,"顯然這不是你想要的。(banq注:其實正規表示式很慢)

3.標準庫不能很好地發現大量的關鍵詞,你只能選擇:要麼為每個關鍵詞執行一個單獨文字或正規表示式搜尋操作;要麼建立一個正規表示式包含了每個關鍵詞。

標準庫隨著搜尋關鍵詞增加效能會損耗。

而Mensa可以很方便地實現這些:
1. Mensa是對抽象源文字操作,實現有兩種基於記憶體in-memory和Streaming文字源,你可以定製一個文字源,比如,你能建立一個文字源從資料庫 或從版本控制或從REST API 讀取資料。

2.Mensa有一個選項來啟用或禁用詞邊界word-boundary檢測,當啟用時,關鍵詞將只有在被詞邊界分割時才會識別,構成詞邊界符號是由一個抽象符號分類器決定的,其實現之一是提供給字元符號,但是你也能促進一個定製符號分類器。比如一個基因搜尋應用程式可以定義特定的核苷酸作為基因的界限。

3.一旦Mensa機器構建好,其效能依賴於被搜尋的文字,不是關鍵詞的數量,一個給定的機器例項可以多次重用,甚至可以被併發執行緒來搜尋多個源文字。

4.Mensa是使用Java泛型實現,它可以用來匹配任何型別的符號,這些符號也就是可由Java模板型別S定義的。

假設你的公司有一個入口網站,包含成千上萬個網頁,你要求編寫一個程式,查詢每個員工在這個門戶中被提及了多少次,你能訪問HR資料庫,查詢完整名稱,包括員工的綽號,大概有25000個。使用Mensa步驟如下:
1.建立一個Mensa關鍵詞集合
2.從HR資料庫中讀取員工完整名稱和暱稱,將每個名稱加入到關鍵詞集合
3.建立一個Mensa匹配機器
4.用關鍵詞集合初始化它
5.對於門戶中每個頁面,建立一個Mensa源文字,然後基於這些源文字執行匹配機器,結果將會得到。

具體案例程式碼可見:examples


相關文章