敏感詞過濾演算法實現

2021-10-14 03:41:21 字數 4156 閱讀 8582

filterhelper類

#region 非法關鍵字過濾 bate 1.1

///

///

public

class

filterhelper

public

filterhelper

(string dictionarypath)

private

string dictionarypath =

string

.empty;

///

/// 詞庫路徑

///

public

string dictionarypath

set}

///

/// 記憶體詞典

///

private wordgroup[

] memorylexicon =

newwordgroup[(

int)

char

.maxvalue]

;private

string sourcttext =

string

.empty;

///

/// 檢測源

///

public

string sourcttext

set}

///

/// 檢測源游標

///

int cursor =0;

///

/// 匹配成功後偏移量

///

int wordlenght =0;

///

/// 檢測詞游標

///

int nextcursor =0;

private list<

string

> illegalwords =

newlist

<

string

>()

;///

/// 檢測到的非法詞集

///

public list<

string

> illegalwords

}///

/// 判斷是否是中文

///

///

///

private

bool

ischs

(char character)

///

/// 判斷是否是數字

///

///

///

private

bool

isnum

(char character)

///

/// 判斷是否是字母

///

///

///

private

bool

isalphabet

(char character)

///

/// 轉半形小寫的函式(dbc case)

///

/// 任意字串

/// 半形字串

//////全形空格為12288,半形空格為32

///其他字元半形(33-126)與全形(65281-65374)的對應關係是:均相差65248

/// private

string

todbc

(string input)

if(c[i]

>

65280

&& c[i]

<

65375

) c[i]=(

char

)(c[i]

-65248);

}return

newstring

(c).

tolower()

;}///

/// 載入記憶體詞庫

///

private

void

loaddictionary()

comparison<

string

> cmp =

delegate

(string key1,

string key2)

; wordlist.

sort

(cmp)

;for

(int i = wordlist.count -

1; i >

0; i--)}

foreach

(var word in wordlist)

group

.add

(word.

substring(1

));}

}}}///

/// 檢測

///

///

///

private

bool

check

(string blackword)

else

else

break;}

if((int

)blackword[i]==(

int)sourcttext[nextcursor + offset]

)else

} nextcursor = nextcursor +

1+ offset;

wordlenght++;}

return found;

}///

/// 查詢並替換

///

///

public

string

filter

(char replacechar)

illegalwords.

add(blackword)

; cursor = cursor + wordlenght;

i = i + wordlenght;}}

} cursor++;}

return

newstring

(tempstring);}

else}}

///

/// 具有相同首字元的片語集合

///

class

wordgroup

///

/// 新增詞

///

///

public

void

add(

string word)

///

/// 獲取總數

///

///

public

intcount()

///

/// 根據下標獲取詞

///

///

///

public

string

getword

(int index)

}#endregion

呼叫

//該**為net core下的控制台demo

string path = directory.

getcurrentdirectory()

.replace(,

"");filterhelper filter =

newfilterhelper

(path+

"/暴恐詞庫.txt");

//存放敏感詞的文件

filter.sourcttext =

"你個大推背"

;string resultstr = filter.

filter

('*');

//用*號代替敏感詞

var list=filter.illegalwords;

//這個可以獲取所有敏感詞集合

foreach

(string s in list)

console.

writeline

(resultstr)

;

敏感詞過濾演算法實現

說到敏感詞過濾,我也覺得這裡沒有必要寫這個文章,因為前人已經前前後後有過很多種演算法解決該問題。這裡我之所以寫這個文章,是因為我自己自創了一種演算法 真的是自創哦,因為我在寫這個演算法的時候,完全是自己想出來的方式,沒有借鑑任何 靈感來自於一篇文章中的一句話 如果能掃瞄一遍文字就能將所有的詞找出來,...

Java Web 敏感詞過濾演算法

1.dfa演算法 dfa演算法的原理可以參考這裡,簡單來說就是通過map構造出一顆敏感詞樹,樹的每一條由根節點到葉子節點的路徑構成乙個敏感詞,例如下圖 簡單實現如下 public class textfilterutil 構建敏感詞庫 param keyword private static voi...

Java Web敏感詞過濾演算法

1.dfa演算法 dfa演算法的原理可以參考 這裡 簡單來說就是通過map構造出一顆敏感詞樹,樹的每一條由根節點到葉子節點的路徑構成乙個敏感詞,例如下圖 簡單實現如下 public class textfilterutil 構建敏感詞庫 param keyword private static vo...