DFA算法屏蔽字,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
}

https://github.com/buguang01/bige

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值