使用的库是: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最合适,没必要放在关系型数据库)里加载,再增加一个添加新词的方法就更好了。