2011-11-29 79 views
5

從給出的字符串中去除褻瀆詞的正確方法是什麼:
1)我有一個包含100個單詞列表的字符串數組。 2)處理部分單詞的正確方法是什麼?大多數人如何處理這個問題?例如單詞mass。然後有時候一個部分詞也是不好的 - 假設foobar是一個非常褻瀆的詞,我可能想要禁止foobar和foobar *和* foobar。使用正則表達式(100字的列表)的褻瀆過濾器

那麼你把所有的單詞放到一個單一的表達式或通過列表循環?

什麼是解決它的正確方法?我正在使用Groovy/Grails,但歡迎任何現代語言例子。

+2

檢查此鏈接:http://stackoverflow.com/questions/273516/how-do-you-implement-a-good-profanity-filter –

+1

尋找斯坎索普問題:http://en.wikipedia .ORG /維基/ Scunthorpe_problem – rossum

回答

2
  1. 串連每一個字成詞的列表 - (foobar|foobaz|...)
  2. 然後把警衛分組兩側的多餘的字符

    [^[email protected]#$%^&*]*(foobar|foobaz|foofii)[^[email protected]#$%^&*]*

此外,你可能會希望使用不區分大小寫的標誌,以便它可以匹配像FooBaz和fOObaR這樣的詞。

就性能而言,將它連接爲一個大的正則表達式可能是最快的(儘管我不是專家)。正則表達式算法在搜索&處理分支條件時非常高效。基本上,它一定比O(mn)(其中m是單詞的數量,n是你正在尋找的文字大小)

3

這是很解決一個難題,你需要確定是否正則表達式將工作爲你和你如何處理嵌入(當你添加一個字典詞的褻瀆像frackface除了真正的F字)。

正則表達式通常會限制它們可以使用多長時間,這通常會阻止您爲所有單詞使用單個正則表達式。針對字符串執行多個正則表達式非常慢,具體取決於您需要的性能以及黑名單的大小。我們最初實施CleanSpeak作爲正則表達式系統,但它沒有擴展,我們使用不同的機制重寫它。

您還需要考慮詞組,標點符號,空格,leet-speak和其他語言。所有這些使得正則表達式作爲解決方案的吸引力較小。下面是使用這個詞打招呼一些例子(假設這是這項工作的褻瀆):

  • 列表項
  • 你好
  • 你好
  • h_e_l_l_o
  • | - | ELLO
  • h3llo
  • 「hello there」(這個短語可能不包含任何褻瀆詞,但結合他們是褻瀆的)

您還需要處理兩個或兩個以上字典(白名單)字詞在彼此相鄰時包含褻瀆的邊緣情況。包含S-詞的一些例子:

  • 慶典它
  • SSH是安靜的時間

這些顯然不是褻瀆,但大部分自產自銷,許多商業解決方案與這些案件的問題。

我們花了3年的時間完善CleanSpeak所使用的過濾器,以確保它可以處理所有這些情況,並且我們會繼續調整並使其更好。我們還花了8個月的時間完善了我們的系統性能,每秒可以處理大約5,000條消息。並不是說你不能建立可用的東西,但要準備好處理很多可能出現的問題,並且要創建一個不使用正則表達式的系統。