论坛首页 综合技术论坛

使用DFA实现文字过滤

浏览 72201 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-03-21  
谁有java版的DFA文字过滤?
0 请登录后投票
   发表时间:2009-05-18  
楼主
你这样做还有一个问题
你采用GBK编码
假如某个代检查的文本的编码为:45,47,12,23,23,20
如果关键字中编码为:[b]47,12,23,23[/b]

红色标记处
这样会导致查询到了关键字,但是实际并不是关键字中的

我现在就遇到这个问题
0 请登录后投票
   发表时间:2009-05-18  
刚才提的问题是我这两天碰到的
不过我用的是AC算法实现
0 请登录后投票
   发表时间:2009-05-19  
pantiansheng 写道
楼主
你这样做还有一个问题
你采用GBK编码
假如某个代检查的文本的编码为:45,47,12,23,23,20
如果关键字中编码为:[b]47,12,23,23[/b]

红色标记处
这样会导致查询到了关键字,但是实际并不是关键字中的

我现在就遇到这个问题
这个只要转码就行了,把关键字和文本弄成一样编码的,然后再匹配
0 请登录后投票
   发表时间:2009-05-21   最后修改:2009-05-21
为了能看懂楼主的代码,又复习了一遍python,呵呵
有个问题没弄明白,能否请教一下:
就是在searchWord函数里面,应该是对传入参数str文本进行DFA状态转移,代码大意是

while a < len(str):      
        if temp == None:
            //状态转移失败,回溯字符串指针
            //如果之前word已经保存了2个字符,则 指针-2
            a = a - len(word)           
        elif temp == 1 or temp[1] == 1:
            //状态转移结束,成功匹配到一个字符串
            //这里不理解了,既然已经成功匹配到一个串,那么无需回溯指针呀
            //直接跳过当前成功匹配的串,继续DFA为什么不可以呢?
           
            a = a - len(word) + 1    //为什么成功还要回溯指针呢?        
        else:
            //状态转移,未结束
            word.append(index)
        a = a + 1

不知道我那里理解的有问题,还望不吝赐教,先谢过啦
0 请登录后投票
   发表时间:2009-05-21  
对于这种方法,如果用PHP来写的话,如果有1000个禁用词语,光一个Trie树就需要相当大的内存占用量,速度应该快不了,貌似不怎么可取哦
0 请登录后投票
   发表时间:2009-05-21   最后修改:2009-05-21
bachmozart 写道
为了能看懂楼主的代码,又复习了一遍python,呵呵
`````````````````

文本abc
关键词,ab,bc,回退一步是为了尽量搜索出其他关键字

灰~机 写道
对于这种方法,如果用PHP来写的话,如果有1000个禁用词语,光一个Trie树就需要相当大的内存占用量,速度应该快不了,貌似不怎么可取哦

1000个小case了,6w个关键字在jvm占用180m的内存。还说得过去。
0 请登录后投票
   发表时间:2009-05-21  
ahuaxuan 写道
bachmozart 写道
为了能看懂楼主的代码,又复习了一遍python,呵呵
`````````````````

文本abc
关键词,ab,bc,回退一步是为了尽量搜索出其他关键字


明白了,多谢
0 请登录后投票
   发表时间:2009-05-21  
ahuaxuan 写道

1000个小case了,6w个关键字在jvm占用180m的内存。还说得过去。

写了个PHP的该算法,又用php的array特性,缩小了Trie树占的内存量。效率还算过得去
比preg_match_all那个正则方法效率高6倍左右
0 请登录后投票
   发表时间:2009-05-21  
楼主
请教个问题
在实时情况下
如何保证重新加载同步问题
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics