スパムとの闘いで「間違った」言葉を特定する

フォーラムでのスパムとの戦いでは、「通常」に似ているが実際にはストップワードのデータベースにあるテンプレートの単語とは異なる単語を自動的にキャッチするというアイデアが生まれました。 これは、キリル文字をラテンアルファベットに、またはその逆に置き換えることによって行われます。 たとえば、「コンクリートの販売」と「コンクリートの販売」の外観は同じように見えますが、実際には互いに異なっています。

そこで、宇宙のエントロピーを減らすための小さな関数を作成しました。これは、単語が書かれている言語を決定し(可能な場合)、それを通常の言語に置き換えます。 次に、この単語をストップワードのリストと照合し、禁止されているかどうかを判断します:)



(キリル文字は赤、青、ラテンまたは数字でマークされています)



C#コードの詳細には触れません。すべてが明確になると思います。

建設的な提案とコメントが嬉しいです:)



public string CheckWord( string word, out string lang, out bool Changes)

{

lang = "?" ;

string newword = word;

string OnlyRu = "" ;<br>

string OnlyEn = "DdFfGghIiJjLlNQqRrSstUVvWwYZz" ;

string Rus = "1@" ;

string Eng = "AaBEeKkMHOoPpCcTyXx30imu@anb" ;



bool IsRu100percent = false ;

foreach ( char c1 in word)

foreach ( char c2 in OnlyRu)

IsRu100percent = IsRu100percent || (c1 == c2);



if (IsRu100percent)

{

lang = "ru" ;



//

for ( int i = 0; i < word.Length; i++)

if (Eng.IndexOf(word[i]) >= 0)

{

// word[i] ""

}

for ( int i = 0; i < Rus.Length; i++)

newword = newword.Replace(Eng[i], Rus[i]);

}

else

{

bool IsEn100percent = false ;

foreach ( char c1 in word)

foreach ( char c2 in OnlyEn)

IsEn100percent = IsEn100percent || (c1 == c2);

if (IsEn100percent)

{

lang = "en" ;

//

for ( int i = 0; i < word.Length; i++)

if (Rus.IndexOf(word[i]) >= 0)

{

// word[i] ""

}



for ( int i = 0; i < Eng.Length; i++)

newword = newword.Replace(Rus[i], Eng[i]);



}

}

// ?

Changes = newword != word;

newword = newword.ToLower();

_SelectionColor = lang == "ru" ? Color.Red : lang == "en" ? Color.Blue : Color.Black;

return newword;

}



* This source code was highlighted with Source Code Highlighter .









public string CheckWord( string word, out string lang, out bool Changes)

{

lang = "?" ;

string newword = word;

string OnlyRu = "" ;<br>

string OnlyEn = "DdFfGghIiJjLlNQqRrSstUVvWwYZz" ;

string Rus = "1@" ;

string Eng = "AaBEeKkMHOoPpCcTyXx30imu@anb" ;



bool IsRu100percent = false ;

foreach ( char c1 in word)

foreach ( char c2 in OnlyRu)

IsRu100percent = IsRu100percent || (c1 == c2);



if (IsRu100percent)

{

lang = "ru" ;



//

for ( int i = 0; i < word.Length; i++)

if (Eng.IndexOf(word[i]) >= 0)

{

// word[i] ""

}

for ( int i = 0; i < Rus.Length; i++)

newword = newword.Replace(Eng[i], Rus[i]);

}

else

{

bool IsEn100percent = false ;

foreach ( char c1 in word)

foreach ( char c2 in OnlyEn)

IsEn100percent = IsEn100percent || (c1 == c2);

if (IsEn100percent)

{

lang = "en" ;

//

for ( int i = 0; i < word.Length; i++)

if (Rus.IndexOf(word[i]) >= 0)

{

// word[i] ""

}



for ( int i = 0; i < Eng.Length; i++)

newword = newword.Replace(Rus[i], Eng[i]);



}

}

// ?

Changes = newword != word;

newword = newword.ToLower();

_SelectionColor = lang == "ru" ? Color.Red : lang == "en" ? Color.Blue : Color.Black;

return newword;

}



* This source code was highlighted with Source Code Highlighter .









public string CheckWord( string word, out string lang, out bool Changes)

{

lang = "?" ;

string newword = word;

string OnlyRu = "" ;<br>

string OnlyEn = "DdFfGghIiJjLlNQqRrSstUVvWwYZz" ;

string Rus = "1@" ;

string Eng = "AaBEeKkMHOoPpCcTyXx30imu@anb" ;



bool IsRu100percent = false ;

foreach ( char c1 in word)

foreach ( char c2 in OnlyRu)

IsRu100percent = IsRu100percent || (c1 == c2);



if (IsRu100percent)

{

lang = "ru" ;



//

for ( int i = 0; i < word.Length; i++)

if (Eng.IndexOf(word[i]) >= 0)

{

// word[i] ""

}

for ( int i = 0; i < Rus.Length; i++)

newword = newword.Replace(Eng[i], Rus[i]);

}

else

{

bool IsEn100percent = false ;

foreach ( char c1 in word)

foreach ( char c2 in OnlyEn)

IsEn100percent = IsEn100percent || (c1 == c2);

if (IsEn100percent)

{

lang = "en" ;

//

for ( int i = 0; i < word.Length; i++)

if (Rus.IndexOf(word[i]) >= 0)

{

// word[i] ""

}



for ( int i = 0; i < Eng.Length; i++)

newword = newword.Replace(Rus[i], Eng[i]);



}

}

// ?

Changes = newword != word;

newword = newword.ToLower();

_SelectionColor = lang == "ru" ? Color.Red : lang == "en" ? Color.Blue : Color.Black;

return newword;

}



* This source code was highlighted with Source Code Highlighter .














呼び出しは簡単です。

string lang;

bool changes;

string re = "[\\w\\@]+" ;

Regex rx = new Regex(re, RegexOptions.IgnoreCase | RegexOptions.Singleline);

Match m = rx.Match( "poae eo" );

while (m.Success)

{

string newWord = CheckWord(m.ToString(), out lang, out changes);

m = m.NextMatch();

}



* This source code was highlighted with Source Code Highlighter .








string lang;

bool changes;

string re = "[\\w\\@]+" ;

Regex rx = new Regex(re, RegexOptions.IgnoreCase | RegexOptions.Singleline);

Match m = rx.Match( "poae eo" );

while (m.Success)

{

string newWord = CheckWord(m.ToString(), out lang, out changes);

m = m.NextMatch();

}



* This source code was highlighted with Source Code Highlighter .











All Articles