2010-02-03 63 views
11

使用JavaScript我需要從〜100000個單詞文檔中有效地移除〜10000個關鍵字,其中〜1000個關鍵字將成爲關鍵字。你會建議什麼?替換文本中多個單詞的高效方法

會不會海量正則表達式實用? 或者我應該只遍歷文檔字符尋找關鍵字(無聊)?

編輯:
好點 - 只有整個單詞,而不是部分。一些關鍵字包含空格。
我試圖做到所有客戶端,以減少後端的壓力。

+1

有趣的問題。一方面,以編譯語言手寫的狀態機將會超出正則表達式,但另一方面,Javascript本身速度很慢,所以您需要嘗試並基準測試正則表達式引擎是否由於被編譯而更快。 – 2010-02-03 08:15:14

+0

它必須是JavaScript還是可以將它推送到服務器進行轉換?如果沒有一些數據進行測試,很難說哪種方法更高效。例如,如果您使用的是Python,則可以分段數據並在您真正需要時進行線程處理。 – 2010-02-03 08:18:21

+0

你是否只需要替換整個單詞或單詞的部分 - 例如單詞,關鍵字,單詞都有單詞'單詞'在其中,他們必須如何處理? – meouw 2010-02-03 08:34:32

回答

6

使用正則表達式可能是一個不錯的選擇:

var words = ['bon', 'mad']; 
'joe bon joe mad'.replace(new RegExp('(' + words.join('|') + ')', 'g'), ''); 
// 'joe joe ' 

正則表達式也不是很複雜的事情像前瞻,和正則表達式引擎是用C/C++,所以你可以期待它相當快。儘管如此 - 基準,並看看性能是否符合您的需求。

我不認爲實現自己的解析器會更快,但我可能是錯的 - 基準測試。

將文檔發送到服務器聽起來不太好。用100k的話說,您正在查看兆字節範圍內的有效負載,並且您仍然必須在服務器上對其執行某些操作並將其推回。


您可能需要調整正則表達式做的空間的東西。

+1

你可能想添加單詞邊界檢查''\\ b('+ words.join('|')+')\\ b'' – 2010-02-03 08:38:48

+0

正則表達式可以使用一些愛,我同意,但它說明了這一點。 – 2010-02-03 08:46:41

0

我的直覺告訴我,對於如此多的關鍵字 - 排序關鍵字和創建每個字符狀態機將比正則表達式快得多,因爲狀態機很平凡,可以自動生成。

相關問題