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

buguang01 · 2019-08-13 16:34:24 · 2751 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2019-08-13 16:34:24 的主题,其中的信息可能已经有所发展或是发生改变。

源码复制就可使用,词库自己网上随边找找就有了。

支持我的github:https://github.com/buguang01


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大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2751 次点击  ∙  1 赞  
加入收藏 微博
1 回复  |  直到 2019-08-14 09:09:55
buguang01
buguang01 · #1 · 6年之前

今天刚写了一个聊天服务器,就把这个用上了,这个算法真不错,一毫秒可以处理几千次。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传