如何检查一个字符串是否看起来是随机的,还是人为产生和发音的?
nlp
12
0

为了识别[可能]机器人生成的用户名。

假设您有一个用户名,例如“ bilbomoothof” ..可能是胡说八道,但它仍包含发音,因此看起来是人为产生的。

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

  1. 假设您有一个用户名,例如“ sdfgbhm342r3f”,对于人类来说,这显然是一个随机字符串。但是可以通过编程方式识别吗?
  2. 是否有可用的算法(类似于Soundex等)可识别像这样的字符串中的明显声音?

非常适合在PHP / MySQL中使用的解决方案。

参考资料:
Stack Overflow
收藏
评论
共 7 个回答
高赞 时间 活跃

查找n-gram分析。它已成功用于自动检测文本语言,并且即使在非常短的文本上也能出色地工作。

在线演示(不再在线)将“ bilbomoothof”识别为英语,将“ sdfgbhm342r3f”识别为尼泊尔语。即使匹配很差,它也可能总是返回最佳匹配。我认为您可以训练它以区分“可发音”和“随机”。

收藏
评论

回答问题1:

不幸的是,这无法完成,因为Kolmogorov复杂度函数不可计算,因此除非您将某些规则应用于可能的用户名域,否则您将无法生成此类算法,那么您将能够执行启发式分析并做出决定,但即使如此,难做。

PS:发布此答案后,我碰到了一项提供用户名域名限制示例的服务,让用户使用众所周知的公共域的邮箱作为用户名。

收藏
评论

我想如果您可以限制自己只能听英语发音的话,您可能会想到这样的事情。对我来说(我是法国人),诸如szczepanwawrzyniec之类的单词是不可发音的,并且肯定具有一定的随机性。

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

收藏
评论

我同意Mac。但是,不仅如此,人们有时还会使用无法发音的用户名,例如qwerty或rtfmorleave。

为什么要打扰呢?

<过时和错误,但由于评论,我不删除>

除此之外没有机器人会使用“ zetztzgsd”作为用户名 ,他们没有实名,可能的昵称之类的字典,所以我认为这对您来说是浪费时间

</已过时且为假,但由于评论而我不删除>

收藏
评论

只需将CAPTCHA作为注册过程的一部分即可。

您永远都无法将真实的uesrnames与由bot创建的用户名区分开来,而不会严重惹恼用户。

您将使用俗称的或非英语的名称来阻止用户,这会激怒他们,而僵尸程序将继续尝试直到他们捕获到良好的用户名(从字典或其他来源获得-顺便说一句, 这是一个非常好的用户 ! )。

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

解决方案是让其他人为您管理用户身份。例如,您可以使用一小部分OpenID提供程序(例如SO),或facebook connect或两者。您将确定这些用户是真实的,并且他们已经在解决至少一个验证码。

编辑:另一个想法

在Google中搜索字符串,然后检查找到的匹配项数。不应该是您唯一的工具,但它也是一个很好的指标。当然,随机字符串应该几乎没有匹配项。

收藏
评论

在我的头顶上,您可以利用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;
 }

从这个非常有趣的链接:

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

收藏
评论

您可以使用神经网络来评估昵称是否看起来像自然语言的昵称。

组合两个数据集:一个有效的昵称和一个伪造的昵称。用字符值作为输入训练一个简单的向后传播的单隐藏层神经网络。神经网络将学习区分“ zrgssgbt”和“ zargbyt”之类的字符串,因为后者混合了辅音和元音。

重要的是要使用真实的示例来区分。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题