54

[可能性のある]ボットによって生成されたユーザー名を識別するため。

「bilbomoothof」のようなユーザー名を持っているとしましょう。それは意味がないかもしれませんが、それでも発音可能な音が含まれているため、人間が生成したように見えます。

音節または単語の部分の辞書からランダムに生成された可能性があることは認めますが、問題のボットが少しごみであると少し仮定しましょう。

  1. 「sdfgbhm342r3f」のようなユーザー名を持っていると仮定します。人間にとって、これは明らかにランダムな文字列です。しかし、これはプログラムで特定できますか?
  2. このような文字列内の発音可能な音を識別できるアルゴリズム(Soundexなどに類似)はありますか?

PHP/MySQLに適用可能なソリューションが最も高く評価されています。

4

10 に答える 10

16

英語で発音できる音に制限できれば、そのようなことを考えることができると思います。私(私はフランス語)にとって、 szczepanwawrzyniecのような単語は発音できず、確かに一定のランダム性があります。

しかし、それらは実際にはポーランドの名です(スティーブンローレンスを意味します)...

于 2009-07-22T09:59:35.540 に答える
8

Macに同意します。しかしそれ以上に、qwertyやrtfmorleaveのように、発音できないユーザー名を持っている場合があります。

なぜそれを気にするのですか?

<廃止されて誤りですが、コメントのために削除しません>

しかしそれ以上に、ユーザー名として「zetztzgsd」を使用するボットはなく、実名やニックネームの可能性などの辞書があるので、これはあなたにとって時間の無駄になると思います

</ /廃止され、falseですが、コメントのために削除しません>

于 2009-07-22T10:03:02.537 に答える
8

n-gram 分析を参照してください。テキスト言語を自動的に検出するためにうまく使用され、非常に短いテキストでも驚くほどうまく機能します.

オンライン デモ (オンラインではなくなりました) では、「bilbomoothof」が英語として認識され、「sdfgbhm342r3f」がネパール語として認識されました。非常に貧弱なものであっても、おそらく常に最良の一致を返します。「発音可能」と「ランダム」を区別するように訓練できると思います。

于 2009-07-22T11:20:07.560 に答える
2

質問1に返信する:

残念ながら、コルモゴロフ複雑度関数は計算できないため、これを行うことはできません。したがって、可能なユーザー名のドメインにいくつかのルールを適用しない限り、そのようなアルゴリズムを生成することはできません。その後、ヒューリスティック分析を実行して決定することができますが、それでも実際にはするのは難しい。

PS:この回答を投稿した後、ユーザー名ドメイン制限の例を示すサービスに出くわしました。ユーザーがユーザー名としてよく知られているパブリックドメインのメールボックスを使用できるようにします。

于 2009-07-22T09:55:03.317 に答える
2

私の頭のてっぺんから、 soundexを利用して音節を探すことができます。これは、発音可能な単語に少なくとも1つの音節があるという仮定に基づいて、私が探求する方向です。

編集:音節を数えるための関数は次のとおりです。

function count_syllables($word) {
 
$subsyl = Array(
'cial'
,'tia'
 ,'cius'
 ,'cious'
 ,'giu'
 ,'ion'
 ,'iou'
 ,'sia$'
 ,'.ely$'
 );
  
 $addsyl = Array(
 'ia'
 ,'riet'
 ,'dien'
 ,'iu'
 ,'io'
 ,'ii'
 ,'[aeiouym]bl$'
 ,'[aeiou]{3}'
 ,'^mc'
 ,'ism$'
 ,'([^aeiouy])\1l$'
 ,'[^l]lien'
 ,'^coa[dglx].'
 ,'[^gq]ua[^auieo]'
 ,'dnt$'
 );
  
 // Based on Greg Fast's Perl module Lingua::EN::Syllables
 $word = preg_replace('/[^a-z]/is', '', strtolower($word));
 $word_parts = preg_split('/[^aeiouy]+/', $word);
 foreach ($word_parts as $key => $value) {
 if ($value <> '') {
 $valid_word_parts[] = $value;
 }
 }
  
 $syllables = 0;
 // Thanks to Joe Kovar for correcting a bug in the following lines
 foreach ($subsyl as $syl) {
 $syllables -= preg_match('~'.$syl.'~', $word);
 }
 foreach ($addsyl as $syl) {
 $syllables += preg_match('~'.$syl.'~', $word);
 }
 if (strlen($word) == 1) {
 $syllables++;
 }
 $syllables += count($valid_word_parts);
 $syllables = ($syllables == 0) ? 1 : $syllables;
 return $syllables;
 }

この非常に興味深いリンクから:

http://www.addedbytes.com/php/flesch-kincaid-function/

于 2009-07-22T09:56:27.217 に答える
2

ニューラルネットワークを使用して、ニックネームが自然言語のニックネームのように見えるかどうかを評価できます。

2つのデータセットを組み立てます。1つは有効なニックネームで、もう1つは偽のニックネームです。入力として文字値を使用して、単純な逆伝播単一隠れ層ニューラルネットワークをトレーニングします。後者には子音と母音が混在しているため、ニューラルネットワークは「zrgssgbt」と「zargbyt」のような文字列を区別することを学習します。

優れた識別器を取得するには、実際の例を使用することが重要です。

于 2009-07-22T11:02:30.997 に答える
0

この問題の既存のアルゴリズムはわかりませんが、次のいずれかの方法で攻撃される可能性があると思います。

  • ボットはごみである可能性がありますが、指定された文字列で検索できる音節、より具体的には音素のリストを保持できます。しかし、文字列を別の場所などでセグメント化する必要があるため、これは少し難しいように聞こえます。
  • 英語のアルファベットには5つの母音があり、他に21の母音があります。それらがランダムに生成された場合、およそ5/26 * W(Wは単語の長さ)の母音である文字を期待し、これからの大幅な逸脱は疑わしいと考えることができます。(文字が含まれている場合は、5/31など。)ダブルトンを検索し、各ダブルトンが同じ確率で発生することを確認するなどして、このアイデアに基づいて構築してみることができます。
  • さらに、入力文字列を母音の周りに分割してみてください。たとえば、母音の前に3文字、母音の後に3文字の文字列をセグメント化し、音素と比較して認識可能な音になるかどうかを調べます。
于 2009-07-22T10:00:45.553 に答える
0

ГЙロシア語では、、、ЪまたはЬ母音の後などの音節を禁止しています。

ただし、スパムボットは名前データベースを使用するだけです。そのため、私のスパム受信トレイには、歴史書でしか出会えない奇妙な名前がたくさんあります。

私は英語にも音節分布のヒストグラムがあることを期待しています(ETAOIN SHRDLUただし、2文字または3文字の音節の場合も同様です)。また、1つの名前に低周波音節の臨界密度があることは確かに兆候です。

于 2009-07-22T10:01:28.233 に答える
0

多くの大規模なサイトでは、[first init][middle init][last name][number] のようなユーザー名が提案されていることに注意してください。ユーザーはこれらのユーザー名を他のサイトに持ち越しますが、最初の 3 文字は確実に発音できません。

于 2009-07-28T01:52:10.163 に答える