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()
測試結(jié)果:
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 算法只有在敏感詞較多的情況下,才有意義。在百來個敏感詞的情況下,甚至不如普通算法
下面從理論上推導(dǎo)時間復(fù)雜度,為了方便分析,首先假定消息文本是等長的,長度為lenA;每個敏感詞的長度相同,長度為lenB,敏感詞的個數(shù)是m。
1) DFA算法的核心是構(gòu)建一棵多叉樹,由于我們已經(jīng)假設(shè),敏感詞的長度相同,所以樹的最大深度為lenB,那么我們可以說從消息文本的某個位置(字節(jié))開始的某個子串是否在敏感詞樹中,最多只用經(jīng)過lenB次匹配.也就是說判斷一個消息文本中是否有敏感詞的時間復(fù)雜度是lenA * lenB
2) 再來看看普通做法,是使用for循環(huán),對每一個敏感詞,依次在消息文本中進行查找,假定字符串是使用KMP算法,KMP算法的時間復(fù)雜度是O(lenA + lenB)
那么對m個敏感詞查找的時間復(fù)雜度是 (lenA + lenB ) * m
綜上所述,DFA 算法的時間復(fù)雜度基本上是與敏感詞的個數(shù)無關(guān)的。
以上這篇python 實現(xiàn)敏感詞過濾的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python pip通過requirements.txt 文件安裝依賴
requirements.txt是定義項目依賴的python包,可通過工具生成,本文主要介紹了Python pip通過requirements.txt文件安裝依賴,具有一定的參考價值,感興趣的可以了解一下2024-03-03
Google colab中從kaggle中接入數(shù)據(jù)的操作方法
這篇文章主要介紹了Google colab中如何從kaggle中接入數(shù)據(jù),本文涉及到兩大平臺內(nèi)容,所以我默認你已經(jīng)擁有了,并且使用過了一段時間的google賬號和kaggle賬號,需要的朋友可以參考下2024-03-03
Python實現(xiàn)將MongoDB中的數(shù)據(jù)導(dǎo)入到MySQL
這篇文章主要為大家詳細介紹了如何通過Python封裝一個將?MongoDB?中的數(shù)據(jù)導(dǎo)入到?MySQL?中的?Python?工具類?MongoToMysql,感興趣的可以了解一下2023-05-05
python實現(xiàn)xlwt xlrd 指定條件給excel行添加顏色
這篇文章主要介紹了python實現(xiàn)xlwt xlrd 指定條件給excel行添加顏色,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07

