這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
使用的庫是:github.com/huichen/sego
// 載入詞典
var segmenter sego.Segmenter
//內建的分詞庫資訊
segmenter.LoadDictionary("../github.com/huichen/sego/data/dictionary.txt")
// 分詞
text := []byte("使用它可以進行快速開發,同時它還是一個真正的編譯語言,我們之所以現在將其開源,原因是我們認為它已經非常有用和強大")
segments := segmenter.Segment(text)
// 處理分詞結果
// 支援普通模式和搜尋模式兩種分詞,見代碼中SegmentsToString函數的注釋。
fmt.Println(sego.SegmentsToString(segments, false))
//可以使用以下方法過濾敏感詞
var (
replaceTo = "*"
replaceByte = []byte(strings.Repeat(replaceTo, 1024))
)
func (self *WordFilter) Filter(input string) (string, error) {
bin := []byte(input)
segments := self.segmenter.Segment(bin)
cleanString := make([]byte, 0, len(bin))
for _, seg := range segments {
word := bin[seg.Start():seg.End()]
fmt.Println(seg.Token().Text())
if self.dirtyWords[strings.ToUpper(string(word))] {
cleanString = append(cleanString, replaceByte[:utf8.RuneCount(word)]...)
} else {
cleanString = append(cleanString, word...)
}
}
return string(cleanString), nil
}
//其中dirtyWords是map[string]bool類型,是否為敏感詞。
dictionary.txt詞庫檔案:是從github.com/fxsjy/jieba裡複製出來的。檔案裡以空隔分開,第一個是詞,第二個是詞頻,第三個是詞性。sego預設不載入詞頻小於2的詞;
沒有提供添加額外詞的方法,可以把github.com/huichen/sego/segmenter.go裡的載入詞庫的方法LoadDictionary改為從nosql(個人感覺mongodb最合適,沒必要放在關係型資料庫)裡載入,再增加一個添加新詞的方法就更好了。