协同过滤算法:关键字过滤算法



过滤关键字机制到处可见于是聪明网友就会想到各种各样思路方法突破例如:

1、中文会用繁体字思路方法避开关键字扫描
2、在关键字中间插入无意思特殊例如 * & # @ 等而且个数可变
3、使用谐音或拆字法变换关键字

在实现自己算法时也有些问题:

4、随着时间推移关键字列表会越来越大有些论坛常用正则表达式N次扫描思路方法显得效率很低
5、关键字有区别严重级别有些需要禁止有些只需要替换还有些可能记录下即可


针对这些问题可采用应对思路方法:

1、加载关键字列表时将所有关键字转换成繁体字以扫描繁体版关键字;
这个转换工作只需句就可以实现了:
s=Microsoft.VisualBasic.Strings.StrConv(word, Microsoft.VisualBasic.VbStrConv.TraditionalChinese, 0);

2、在扫描原文本时如果遇到关键字首个文字忽略其后特殊直到下个有意义文字为止当然这里需要在定义关键字列表时指定哪些才需要这样扫描并不是所有关键字都采用这种方式;
例如有关键字 “你好”经常会被人输入成“你x好”或者“你xxxxx好”那么在关键字列表里就需要定义成“你*好”在匹配关键字时如果遇到星号就忽略原文本下个为特殊

3、遇到谐音和拆字时没什么好办法了只好将这些谐音词和拆分词也加入到关键字列表

4、不用正则表达式或者 String.IndexOf思路方法可以将所有关键字首字相同组成个小组然后在将首字放到个散列表(HashTable/Dictionary<T>)在扫描原文本时先在散列表里扫描如果碰到了首字再扫描同组关键字这样简单处理下效率可以提高很多



还有个比用散列表更好思路方法将散列表改成个大小为char.MaxValue然后将首个文字转成即char->然后将关键词集合放到相应下标里这样在扫描原文本时将被扫描转成然后试探相应下标元素是否不为NULL这样比用散列表会更快

5、在定义关键字时同时给个“级别”属性例如使用 E,R,B分别表示只记录、替换、禁止等情况
于是关键字列表如下所示:
你滚 E
他niang R
成*人*网*站 B

这里贴下关键部分代码:



Code
private WordGroup _wordTable;

public FilterResult Filter(ref source,char replaceChar)
{
//NOTE::
// 如果思路方法返回 FilterResult.Replace或者FilterResult.Banned则原某些字会被替代为星号替代后串可以由source取得

(String.IsNullOrEmpty(source)) FilterResult.Pass;

FilterResult result = FilterResult.Pass;
char tempString = null;

start = 0;
for (; start < source.Length; start)
{
WordGroup fw = _wordTable[fastToLower(source[start])];
(fw != null)
{
for ( idx = 0; idx < fw.Count; idx)
{
WordEntity we = fw.GetItem(idx);
matchLength=0;
(we.Word.Length0 || checkString(source, we.Word, start + 1, out matchLength))
{
FilterResult fr = we.HandleType;
(fr > result) result = fr; //记录最高级别处理思路方法
(fr FilterResult.Replace || fr FilterResult.Banned)
{
//替换关键字
(tempStringnull) tempString =source.ToCharArray;;
for ( pos = 0; pos < matchLength + 1; pos)
{
tempString[pos + start] = replaceChar;
}
}
}
}
}
}

(result > FilterResult.RecordOnly)
{
source = (tempString);
}

result;
}

private bool checkString( source, keyword, sourceStart, out matchLength)
{
bool found = false;
sourceOff = 0;
keyIndex = 0;
for (; keyIndex < keyword.Length; keyIndex)
{
(sourceOff + sourceStart >= source.Length) ; //原始串已经全部搜索完毕

(keyword[keyIndex] '*')
{
//跳过可忽略
while (sourceOff + sourceStart < source.Length)
{
(isIgnorableCharacter_CN(source[sourceOff + sourceStart]))
sourceOff;

;
}
}

{
//比较字母
(fastToLower(source[sourceOff + sourceStart]) ()keyword[keyIndex])
{
(keyIndex keyword.Length - 1)
{
found = true;
;
}
}

{
;
}

sourceOff;//移动原始
}
}

//如果匹配中关键字则返回原串中被匹配中文字长度否则返回0
matchLength = sourceOff + 1;
found;
}

private fastToLower(char character)
{
//将大写英文字母以及全/半角英文字母转化为小写字母
charVal = ()character;
(charVal <= 90)
{
(charVal >= 65) //字母A-Z
charVal - 65 + 97;
}
(charVal >= 65313)
{
(charVal <= 65338)
charVal - 65313 + 97; //全角大写A-Z
(charVal >= 65345 && charVal <= 65370)
charVal - 65345 + 97; //全角小写a-z
}
charVal;
}

private bool isIgnorableCharacter_CN(char character)
{
//NOTE::
// 中文表意范围 4E00-9FA5
charVal = ()character;
!(charVal >= 0x4e00 && charVal <= 0x9fa5);
}

// 单个过滤词条目
WordEntity
{
public Word { get; ; }
public FilterResult HandleType { get; ; }
}

// 过滤词
WordGroup
{
//NOTE::用于装载组具有同个字开头过滤词

private List<WordEntity> _words;

public WordGroup
{
_words = List<WordEntity>;
}

public void AppendWord( word, FilterResult handleType)
{
AppendWord( WordEntity { Word = word, HandleType = handleType });
}

public void AppendWord(WordEntity word)
{
_words.Add(word);
}

public Count
{
get { _words.Count; }
}

public WordEntity GetItem( index)
{
_words[index];
}
}
Tags:  蚁群算法 加密算法 四级分数算法 协同过滤算法

延伸阅读

最新评论

发表评论