DFA算法屏蔽字,GO语言版本

buguang01 · · 164 次点击 · 开始浏览    置顶
源码复制就可使用,词库自己网上随边找找就有了。 支持我的github:https://github.com/buguang01 ```go const ( FILE_FILTER = "filter.txt" ) var ( ConfExample *ConfigFilter ) type ConfigFilter struct { FilterList map[rune]*FilterModel //屏蔽字树 } //加载词库 func InitConfigFilter(configpath string) *ConfigFilter { result := new(ConfigFilter) { li := make(map[rune]*FilterModel) //我这里用的是一个文本文件,一行表示一个屏蔽词 file, err := os.Open(path.Join(configpath, FILE_FILTER)) if err != nil { panic(err) } barr, _ := ioutil.ReadAll(file) bstr := string(barr) bstr = strings.ReplaceAll(bstr, "\r", "") rows := strings.Split(bstr, "\n") for _, row := range rows { rowr := []rune(row) fmd, ok := li[rowr[0]] if !ok { fmd = new(FilterModel) fmd.NodeStr = rowr[0] fmd.Subli = make(map[rune]*FilterModel) li[rowr[0]] = fmd } fmd.IsEnd = filterFor(fmd.Subli, rowr, 1) } result.FilterList = li } return result } func filterFor(li map[rune]*FilterModel, rowr []rune, index int) bool { if len(rowr) <= index { return true } fmd, ok := li[rowr[index]] if !ok { fmd = new(FilterModel) fmd.NodeStr = rowr[index] fmd.Subli = make(map[rune]*FilterModel) li[rowr[index]] = fmd } index++ fmd.IsEnd = filterFor(fmd.Subli, rowr, index) return false } //屏蔽字结构 type FilterModel struct { NodeStr rune //内容 Subli map[rune]*FilterModel //屏蔽子集合 IsEnd bool //是否为结束 } //屏蔽字操作,这个方法就是外部调用的入口方法 func FilterChack(data string) (result string) { filterli := ConfExample.FilterList arr := []rune(data) for i := 0; i < len(arr); i++ { fmd, ok := filterli[arr[i]] if !ok { continue } if ok, index := filterChackFor(arr, i+1, fmd.Subli); ok { arr[i] = rune('*') i = index } } return string(arr) } //递归调用检查屏蔽字 func filterChackFor(arr []rune, index int, filterli map[rune]*FilterModel) (bool, int) { if len(arr) <= index { return false, index } if arr[index] == rune(' ') { if ok, i := filterChackFor(arr, index+1, filterli); ok { arr[index] = rune('*') return true, i } } fmd, ok := filterli[arr[index]] if !ok { return false, index } if fmd.IsEnd { arr[index] = rune('*') ok, i := filterChackFor(arr, index+1, fmd.Subli) if ok { return true, i } return true, index } else if ok, i := filterChackFor(arr, index+1, fmd.Subli); ok { arr[index] = rune('*') return true, i } return false, index } ``` 源码复制就可使用,词库自己网上随边找找就有了。 支持我的github:https://github.com/buguang01

入群交流(和以上内容无关):Go中文网 QQ 交流群:798786647 或加微信入微信群:274768166 备注:入群;关注公众号:Go语言中文网

164 次点击  ∙  1 赞  
加入收藏 微博
1 回复  |  直到 2019-08-14 09:09:55
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传