DFA算法 处理屏蔽词库

摘要:
CreateTree()自身。rootNode=self:createNode('R')--根节点fori=1,vinipairs(nodes)doivv。c==cthenrn=vbbreakendreturnnend--字符串转换为字符数组函数Sensitive WordsUtil:len)elselocaltmp=string。sub(str,

春节之后,回来就连着上班,没休息过来那.简单整下吧。

这里是lua实现的。直接上代码。

--敏感词库转化关键词 dfa算法处理屏蔽词库
require "sensitive_words"   ---词库

local SensitiveWordsUtil = class('SensitiveWordsUtil')

function SensitiveWordsUtil:ctor()
    self:createTree()
end

--树节点创建
function SensitiveWordsUtil:createNode(c,flag,nodes)
    local node = {}
    node.c = c or nil           --字符
    node.flag = flag or 0       --是否结束标志,0:继续,1:结尾
    node.nodes = nodes or {}    --保存子节点
    return node
end

--初始化树结构
function SensitiveWordsUtil:createTree()
    self.rootNode = self:createNode('R')  --根节点  
    for i=1,#sensitive_words do
        local chars = self:getCharArray(sensitive_words[i])
        if #chars > 0 then
            self:insertNode(self.rootNode,chars,1)
        end
    end

end

--插入节点
function SensitiveWordsUtil:insertNode(node,cs,index)
    local n = self:findNode(node,cs[index])
    if n == nil then
        n = self:createNode(cs[index])
        table.insert(node.nodes,n)
    end

    if index == #cs then
        n.flag = 1
    end

    index = index + 1
    if index <= #cs then
        self:insertNode(n,cs,index)
    end
end

--节点中查找子节点
function SensitiveWordsUtil:findNode(node,c)
    local nodes = node.nodes
    local rn = nil
    for i,v in ipairs(nodes) do
        if v.c == c then
            rn = v
            break
        end
    end
    return rn
end

--字符串转换为字符数组
function SensitiveWordsUtil:getCharArray(str)
    str = str or ""
    local array = {}
    local len = string.len(str)
    while str do
        local fontUTF = string.byte(str,1)

        if fontUTF == nil then
            break
        end

        --lua中字符占1byte,中文占3byte
        if fontUTF > 127 then 
            local tmp = string.sub(str,1,3)
            table.insert(array,tmp)
            str = string.sub(str,4,len)
        else
            local tmp = string.sub(str,1,1)
            table.insert(array,tmp)
            str = string.sub(str,2,len)
        end
    end
    return array
end

--将字符串中敏感字用*替换返回
function SensitiveWordsUtil:warningStrGsub(inputStr)
    local chars = self:getCharArray(inputStr)
    local index = 1
    local node = self.rootNode
    local word = {}

    while #chars >= index do
        --遇空格节点树停止本次遍历[习 近  平 -> ******]
        if chars[index] ~= ' ' then
            node = self:findNode(node,chars[index])
        end

        if node == nil then
            index = index - #word 
            node = self.rootNode
            word = {}
        elseif node.flag == 1 then
            table.insert(word,index)
            for i,v in ipairs(word) do
                chars[v] = '*'
            end
            node = self.rootNode
            word = {}
        else
            table.insert(word,index)
        end
        index = index + 1
    end

    local str = ''
    for i,v in ipairs(chars) do
        str = str .. v
    end

    return str
end

--字符串中是否含有敏感字
function SensitiveWordsUtil:isWarningInPutStr(inputStr)
    local chars = self:getCharArray(inputStr)
    local index = 1
    local node = self.rootNode
    local word = {}

    while #chars >= index do
        if chars[index] ~= ' ' then
            node = self:findNode(node,chars[index])
        end

        if node == nil then
            index = index - #word 
            node = self.rootNode
            word = {}
        elseif node.flag == 1 then
            return true
        else
            table.insert(word,index)
        end
        index = index + 1
    end

    return false
end


return SensitiveWordsUtil

说明:
1、sensitive_words.lua是词库生成的lua文件。
可以根据提供的表格,使用脚本生成,这里不解释、

简单贴下,可以生成类似的格式(只是一个例子。可以使用更好的格式。)
sensitive_words = {} 
sensitive_words[1] = "敏感词1"
sensitive_words[2] = "敏感词2"
sensitive_words[3] = "敏感词3"

2、warningStrGsub 将字符串中敏感字用*替换返回

3、--isWarningInPutStr字符串中是否含有敏感字

看代码吧。网上一搜一大堆。了解原理就好。

这个比全部for循环效率高很多


测试发现,低端手机,依然会卡,所以采用 c++的方式实现一遍,比lua的效率要高。 敏感词太多的话,可以分批加载,分帧加载

免责声明:文章转载自《DFA算法 处理屏蔽词库》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇fio硬盘压力测试记录一下家里双路由实现wifi漫游功能下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

kubernetes的headless service介绍

headless service是一个特殊的ClusterIP类service,这种service创建时不指定clusterIP(--cluster-ip=None),因为这点,kube-proxy不会管这种service,于是node上不会有相关的iptables规则。 当headless service有配置selector时,其对应的所有后端节点,会...

sqlserver数据库中的mdf文件太大,表空间分析和表空间释放

查询数据库的大小: EXEC sp_spaceused 为了保证查询结果的实时性,推荐使用 @updateusage 参数来确保统计数据是最新的: EXEC sp_spaceused @updateusage = N'TRUE'; 具体查询某个表的大小: EXEC sp_spaceused 't_table' 分析查询数据库中所有表占用的内存大小: dec...

k8s存储之emptyDir、hostPath和nfs存储卷

Volume  容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet会重启它,但是容器中的文件将丢失——容器以干净点状态(镜像最初点状态)重新启动。其次,在pod中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes中的volume就能很好的解决了这些问题。 1.背景 Doc...

Android 自定义CheckBox 样式

新建Android XML文件,类型选Drawable,根结点选selector,在这定义具体的样式。 <?xml version="1.0" encoding="UTF-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android">...

k8s搭建

一、各节点组件图 二、环境准备 ip地址 | 节点角色 | 处理器| 内存|主机名 ---|------|------|------|------|------|--- 10.0.0.11 | master | >=2c |>=2G|master 10.0.0.11 | node01 | >=2c |>=2G|node01 10....

SQL Server查看库、表占用空间大小

转自:https://blog.csdn.net/yenange/article/details/50493580查询数据文件与日志文件占用情况,查看数据大小,查看库大小    1. 查看数据文件占用(权限要求较大) DBCC showfilestats 2. 查看日志文件占用 dbcc sqlperf(logspace) USE master go-...