python 實現(xiàn)敏感詞過濾的方法
如下所示:
#!/usr/bin/python2.6
# -*- coding: utf-8 -*-
import time
class Node(object):
def __init__(self):
self.children = None
# The encode of word is UTF-8
def add_word(root,word):
node = root
for i in range(len(word)):
if node.children == None:
node.children = {}
node.children[word[i]] = Node()
elif word[i] not in node.children:
node.children[word[i]] = Node()
node = node.children[word[i]]
def init(path):
root = Node()
fp = open(path,'r')
for line in fp:
line = line[0:-1]
#print len(line)
#print line
#print type(line)
add_word(root,line)
fp.close()
return root
# The encode of word is UTF-8
# The encode of message is UTF-8
def is_contain(message, root):
for i in range(len(message)):
p = root
j = i
while (j<len(message) and p.children!=None and message[j] in p.children):
p = p.children[message[j]]
j = j + 1
if p.children==None:
#print '---word---',message[i:j]
return True
return False
def dfa():
print '----------------dfa-----------'
root = init('/tmp/word.txt')
#message = '不顧'
print '***message***',len(message)
start_time = time.time()
for i in range(1000):
res = is_contain(message,root)
#print res
end_time = time.time()
print (end_time - start_time)
def is_contain2(message,word_list):
for item in word_list:
if message.find(item)!=-1:
return True
return False
def normal():
print '------------normal--------------'
path = '/tmp/word.txt'
fp = open(path,'r')
word_list = []
print '***message***',len(message)
for line in fp:
line = line[0:-1]
word_list.append(line)
fp.close()
print 'The count of word:',len(word_list)
start_time = time.time()
for i in range(1000):
res = is_contain2(message,word_list)
#print res
end_time = time.time()
print (end_time - start_time)
if __name__ == '__main__':
dfa()
normal()
測試結果:
1) 敏感詞 100個
----------------dfa----------- ***message*** 224 0.325479984283 ------------normal-------------- ***message*** 224 The count of word: 100 0.107350111008
2) 敏感詞 1000 個
----------------dfa----------- ***message*** 224 0.324251890182 ------------normal-------------- ***message*** 224 The count of word: 1000 1.05939006805
從上面的實驗我們可以看出,在DFA 算法只有在敏感詞較多的情況下,才有意義。在百來個敏感詞的情況下,甚至不如普通算法
下面從理論上推導時間復雜度,為了方便分析,首先假定消息文本是等長的,長度為lenA;每個敏感詞的長度相同,長度為lenB,敏感詞的個數(shù)是m。
1) DFA算法的核心是構建一棵多叉樹,由于我們已經(jīng)假設,敏感詞的長度相同,所以樹的最大深度為lenB,那么我們可以說從消息文本的某個位置(字節(jié))開始的某個子串是否在敏感詞樹中,最多只用經(jīng)過lenB次匹配.也就是說判斷一個消息文本中是否有敏感詞的時間復雜度是lenA * lenB
2) 再來看看普通做法,是使用for循環(huán),對每一個敏感詞,依次在消息文本中進行查找,假定字符串是使用KMP算法,KMP算法的時間復雜度是O(lenA + lenB)
那么對m個敏感詞查找的時間復雜度是 (lenA + lenB ) * m
綜上所述,DFA 算法的時間復雜度基本上是與敏感詞的個數(shù)無關的。
以上這篇python 實現(xiàn)敏感詞過濾的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python多線程threading join和守護線程setDeamon原理詳解
這篇文章主要介紹了Python多線程threading join和守護線程setDeamon原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-03-03
python 中文件輸入輸出及os模塊對文件系統(tǒng)的操作方法
這篇文章主要介紹了python 中文件輸入輸出及os模塊對文件系統(tǒng)的操作方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08
python中使用iterrows()對dataframe進行遍歷的實例
今天小編就為大家分享一篇python中使用iterrows()對dataframe進行遍歷的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06
Python Selenium 之數(shù)據(jù)驅(qū)動測試的實現(xiàn)
這篇文章主要介紹了Python Selenium 之數(shù)據(jù)驅(qū)動測試的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08

