如何检查一个string看起来是随机的,或人类生成和pronouncable?

为了识别[可能] bot生成的用户名。

假设你有一个像“bilbomoothof”这样的用户名..它可能是无稽之谈,但它仍然包含发音的声音,所以出现人为的。

我接受它可能是从一个音节字典或单词部分中随机产生的,但让我们暂时假设这个机器人有点垃圾。

  1. 假设你有一个像“sdfgbhm342r3f”这样的用户名,对于一个人来说,这显然是一个随机的string。 但是,这可以通过编程来识别吗?
  2. 有没有可用的algorithm(类似于Soundex等),可以识别这样的string中的发音?

PHP / MySQL适用的解决scheme最受赞赏。

我想你可以想像一下,如果你可以限制自己的英文发音。 对于我(我是法国人)来说,像szczepanwawrzyniec这样的词是不能发音的,而且肯定有一定的随意性。

但他们实际上是波兰的名字 (意思是史蒂文劳伦斯 )。

我同意Mac。 但更重要的是,人们有时候会有用户名不能代名词,比如qwerty或者rtfmorleave。

为什么打扰呢?

<过时而虚假,但是我不会因为评论而删除>

但更重要的是, 没有僵尸使用“zetztzgsd”作为用户名 ,他们有真实姓名 ,可能的昵称等,所以我认为这将是一个浪费你的时间

</过时和错误,但我不删除,因为评论>

查看n-gram分析。 它成功地用于自动检测文本语言,即使在非常短的文本中也可以令人惊讶地工作。

在线演示(不再在线)认可“bilbomoothof”为英文,“sdfgbhm342r3f”为尼泊尔文。 它可能总是返回最佳匹配,即使它是一个非常糟糕的。 我想你可以训练它辨别“可发音”和“随机”。

只需使用CAPTCHA作为注册过程的一部分。

你永远无法从机器人创build的用户名中辨别出真正的用户名,而不会严重干扰用户。

你会用bizzare或者非英文的名字来阻止用户,这会激怒他们,而且机器人会一直试着去尝试,直到他们find一个好用户名(从字典或其他来源 – 这是一个非常好的顺便说一句! )。

编辑:寻找预防而不是事后分析?

解决办法是让其他人pipe理你的用户身份。 例如,您可以使用一个OpenID提供程序(如SO)或Facebook连接 ,或两者的小列表。 您肯定知道用户是真实的,而且他们一直在解答至less一个CAPTCHA。

编辑:另一个想法

在Google中searchstring,并检查find的匹配数量。 不应该成为你唯一的工具,但它也是一个很好的指标。 随机string,当然,应该有很less或没有匹配。

在我头顶上,你可以find音节,利用soundex 。 这是我将探索的方向,基于一个可读的词至less有一个音节的假设。

编辑:这是一个函数计数音节:

 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('/[^az]/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/

问题#1的回复:

不幸的是,这是不可能完成的,因为Kolmogorov复杂度函数是不可计算的,所以除非你将一些规则应用到可能的用户名的域中,否则你不能生成这样的algorithm,那么你将能够进行启发式分析和决定,但即使这样难做。

PS:在发布这个答案后,我碰到一些服务,给出了一个用户名域名限制的例子,让用户使用知名公有领域的邮箱作为用户名。

您可以使用neural network来评估昵称是否看起来像自然语言的昵称。

组装两个数据集:一个有效的昵称和一个伪造的昵称。 用字符值作为input训练一个简单的后退单隐层neural network。 neural network将学习区分诸如“zrgssgbt”和“zargbyt”之类的string,因为后者具有辅音和元音混合。

使用真实世界的例子来获得一个好的鉴别器是很重要的。

我不知道这个问题的现有algorithm,但我认为它可以通过以下任何一种方式进行攻击:

  • 你的机器人可能是垃圾,但你可以保留一个音节列表,或者更具体地说,音素,你可以尝试find你的string。 但是这听起来有点困难,因为你需要在不同的地方分割string等。
  • 英语字母表中有5个元音,还有21个元音。 你可以假设,如果他们是随机产生的,那么大约你会期望5/26 * W(其中W是字长)是元音的字母,并且明显偏离这个可能是可疑的。 (如果包含字母,那么5/31等等。)可以尝试通过searchdoubletons来构build这个想法,并试图确保每个doubleton以相同的概率发生。
  • 此外,您可以尝试将元音分隔在元音周围,例如在元音前加三个字母,在元音后加三个字母,然后通过与音素进行比较,试着找出是否产生可识别的声音。

在俄语中,我们有禁止音节,如ГЙГЙГЙ在元音之后等等。

然而,垃圾邮件机器人只是使用名称数据库,这就是为什么我的垃圾邮件收件箱充满了奇怪的名字,你只能在历史书上遇到。

我希望英语也有音节分布直方图(如ETAOIN SHRDLU ,但是对于两个字母或甚至三个字母的音节),并且以一个名字具有临界密度的低频音节当然是一个标志。

请注意,许多大型网站build议用户名如[初始化] [中初始化] [姓氏] [编号]。 然后用户将这些用户名传送到其他网站,前三个字母肯定不能发音。