查找n-gram分析。它已成功用于自动检测文本语言,并且即使在非常短的文本上也能出色地工作。
在线演示(不再在线)将“ bilbomoothof”识别为英语,将“ sdfgbhm342r3f”识别为尼泊尔语。即使匹配很差,它也可能总是返回最佳匹配。我认为您可以训练它以区分“可发音”和“随机”。
0
查找n-gram分析。它已成功用于自动检测文本语言,并且即使在非常短的文本上也能出色地工作。
在线演示(不再在线)将“ bilbomoothof”识别为英语,将“ sdfgbhm342r3f”识别为尼泊尔语。即使匹配很差,它也可能总是返回最佳匹配。我认为您可以训练它以区分“可发音”和“随机”。
0
不幸的是,这无法完成,因为Kolmogorov复杂度函数不可计算,因此除非您将某些规则应用于可能的用户名域,否则您将无法生成此类算法,那么您将能够执行启发式分析并做出决定,但即使如此,难做。
PS:发布此答案后,我碰到了一项提供用户名域名限制示例的服务,让用户使用众所周知的公共域的邮箱作为用户名。
0
我想如果您可以限制自己只能听英语发音的话,您可能会想到这样的事情。对我来说(我是法国人),诸如szczepan或wawrzyniec之类的单词是不可发音的,并且肯定具有一定的随机性。
但是他们实际上是波兰人的名字 (意思是史蒂文和劳伦斯 )...
0
我同意Mac。但是,不仅如此,人们有时还会使用无法发音的用户名,例如qwerty或rtfmorleave。
为什么要打扰呢?
<过时和错误,但由于评论,我不删除>
但除此之外 , 没有机器人会使用“ zetztzgsd”作为用户名 ,他们没有实名,可能的昵称之类的字典,所以我认为这对您来说是浪费时间
</已过时且为假,但由于评论而我不删除>
0
只需将CAPTCHA作为注册过程的一部分即可。
您永远都无法将真实的uesrnames与由bot创建的用户名区分开来,而不会严重惹恼用户。
您将使用俗称的或非英语的名称来阻止用户,这会激怒他们,而僵尸程序将继续尝试直到他们捕获到良好的用户名(从字典或其他来源获得-顺便说一句, 这是一个非常好的用户 ! )。
编辑:寻找预防措施而不是事后分析?
解决方案是让其他人为您管理用户身份。例如,您可以使用一小部分OpenID提供程序(例如SO),或facebook connect或两者。您将确定这些用户是真实的,并且他们已经在解决至少一个验证码。
编辑:另一个想法
在Google中搜索字符串,然后检查找到的匹配项数。不应该是您唯一的工具,但它也是一个很好的指标。当然,随机字符串应该几乎没有匹配项。
0
在我的头顶上,您可以利用soundex查找音节。基于一个可发音单词至少有一个音节的假设,这就是我要探索的方向。
编辑:这是一个用于计数音节的函数:
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;
}
从这个非常有趣的链接:
0
您可以使用神经网络来评估昵称是否看起来像自然语言的昵称。
组合两个数据集:一个有效的昵称和一个伪造的昵称。用字符值作为输入训练一个简单的向后传播的单隐藏层神经网络。神经网络将学习区分“ zrgssgbt”和“ zargbyt”之类的字符串,因为后者混合了辅音和元音。
重要的是要使用真实的示例来区分。
0
为了识别[可能]机器人生成的用户名。
假设您有一个用户名,例如“ bilbomoothof” ..可能是胡说八道,但它仍包含发音,因此看起来是人为产生的。
我接受它可能是从音节字典或单词部分中随机生成的,但让我们暂时假设所讨论的机器人有点垃圾。
非常适合在PHP / MySQL中使用的解决方案。