這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
我們針對抓取來的頁面進行關鍵詞匹配,但是隨著爬蟲的量級越來越大,關鍵詞計算有些算不過來…. 資料隊列已經到了100w左右…. 又在多個節點上,發布了docker化的關鍵詞匹配服務。 關鍵詞匹配服務的伺服器數量已經到了10台,裡面的代碼邏輯已經做到最優,相關的演算法也是用的ac自動機(ahocorasick),我們也看了下python的ahocorasick實現代碼,可以說這老外寫得不錯,代碼品質很高,演算法實現也很清晰。 在python ahocorasick模組也沒幾個可以選。 同事小軍也在折騰關於他那邊業務的ac自動機邏輯,會出現一個問題。 舉個例子,我的關鍵字是 iphone ,我匹配的內容是 “iphone iphone5 iphone6″ ,但是用python下的ahocorasick匹配的結果是iphone,沒有匹配到iphone5和6。 根據ac自動機原理,他是可以匹配到iphone5的,java版本是可以全部匹配的。 個人覺得,python ahocorasick 是做了相關的匹配精度,所有才沒有把iphone5匹配到。
http://xiaorui.cc/?p=1535
正體,python的gil限制了他計算的效能,這種多匹配模式也不太適合用multiprocessing多進程。 今天正好同事分享了golang,那,重新拾起我曾經拋棄的golang,來解決效能問題。 後期會做成http api服務,供業務層接入。
export GOROOT=/usr/lib/go
export GOPATH=$HOME/go
go get github.com/gansidui/ahocorasick
go build ac.go
Pythonpackage mainimport ( "fmt" "github.com/gansidui/ahocorasick")func main() { ac := ahocorasick.NewMatcher() dictionary := []string{"hello", "world", "nima", "google", "golang", "c++", "xiaorui"} ac.Build(dictionary) ret := ac.Match("hello golang google, i love golang!!! xiaorui xiaorui.cc") for _, i := range ret { fmt.Println(dictionary[i]) }}
123456789101112131415161718192021 |
package main import ( "fmt" "github.com/gansidui/ahocorasick") func main() { ac := ahocorasick.NewMatcher() dictionary := []string{"hello", "world", "nima", "google", "golang", "c++", "xiaorui"} ac.Build(dictionary) ret := ac.Match("hello golang google, i love golang!!! xiaorui xiaorui.cc") for _, i := range ret { fmt.Println(dictionary[i]) }} |