/** * TODO 待整理 */ package tokenizer import ( "glc/conf" "os" "strings" "github.com/wangbin/jiebago" ) var seg jiebago.Segmenter // 参考 https://github.com/wangbin/jiebago var ignoreWords []string // 默认忽略的单词 // var simpleCutMode bool // 是否使用简单分词模式 // 初始化装载字典 func init() { // 分词字典文件默认是“dict.txt”,支持通过环境变量“DICT_FILE”设定 dictFile := os.Getenv("DICT_FILE") if dictFile == "" { dictFile = "dict.txt" } // 默认忽略的单字,主要是键盘能直接敲出的全角半角符号,字母数字不大好说不做排除 ignoreWords = strings.Split("`~!@# $%^&*()-_=+[{]}\\|;:'\",<.>/?,。《》;:‘ ’“”、|】}【{+-—()×&…%¥#@!~·\t\r\n", "") // 有些关键词是要按规则忽略的,支持通过环境变量“INGORE_WORDS”设定,以半角逗号分隔 strWords := conf.Getenv("INGORE_WORDS", "") if strWords != "" { ignoreWords = append(ignoreWords, strings.Split(strWords, ",")...) } //log.Println("默认忽略的单词: ", ignoreWords) // simpleCutMode = conf.GetenvBool("SIMPLE_CUT_MODE", true) seg.LoadDictionary(dictFile) } // 按搜索引擎模式进行分词后返回分词数组 func CutForSearch(text string) []string { return CutForSearchEx(text, nil, nil) } // 按搜索引擎模式进行分词后返回分词数组,可自定义添加或删除分词 func CutForSearchEx(text string, addWords []string, delWords []string) []string { if strings.TrimSpace(text) == "" { return []string{} } txt := strings.ToLower(text) // 结巴分词 sch := seg.CutForSearch(txt+" "+strings.Join(addWords, " "), true) // TODO 暂且补丁 var mapStr = make(map[string]string) tmp := "" for word := range sch { tmp = strings.TrimSpace(word) if tmp != "" { mapStr[tmp] = "" } } // // 简单分词 // if simpleCutMode { // // 针对日志再保留特殊字符(【.】用于包名,【/】用工于路径或日期,【_】常用于表名,【-】常用于日期或连词) // txt = replaceByRegex(txt, "[,/;\"'??,。!!=@#\\[\\]【】\\\\:]", " ") // //log.Println(txt) // keys := strings.Split(txt, " ") // for _, word := range keys { // tmp = strings.TrimSpace(word) // tmp = strings.TrimRight(strings.Trim(tmp, "."), "-") // 去除两边点和右边减号 // if tmp != "" { // mapStr[tmp] = "" // } // } // } // 删除默认忽略的单词 for _, word := range ignoreWords { delete(mapStr, word) } // 自定义添加分词 for _, word := range addWords { tmp = strings.TrimSpace(strings.ToLower(word)) if tmp != "" { mapStr[strings.TrimSpace(strings.ToLower(word))] = "" } } // 自定义删除分词 for _, word := range delWords { tmp = strings.TrimSpace(strings.ToLower(word)) delete(mapStr, tmp) } // 遍历所有键存入数组返回,忽略大小写无重复 var rs []string for k := range mapStr { rs = append(rs, k) } return rs } // func replaceByRegex(str string, rule string, replace string) string { // reg, err := regexp.Compile(rule) // if reg == nil || err != nil { // panic("ssssssssssssssssssssssssssss") // // return "" // } // return reg.ReplaceAllString(str, replace) // } // // 检索用文字进行分词,以及针对检索特殊场景的优化 // func GetSearchKey(searchKey string) string { // if searchKey == "" { // return "" // } // var mapKey = make(map[string]string) // kws := CutForSearch(searchKey) // for _, k := range kws { // mapKey[k] = "" // } // for _, kw := range kws { // ks := CutForSearch(kw) // if len(ks) > 1 { // for _, k := range ks { // delete(mapKey, k) // } // mapKey[kw] = "" // } // } // var rs []string // for k := range mapKey { // rs = append(rs, k) // } // // TODO // log.Println("搜索关键词", kws, "优化后搜索", rs) // return strings.Join(rs, " ") // }