检查一个名字是否看起来像“人”?

时间:2010-07-15 18:31:23

标签: php artificial-intelligence

我有一个在线RPG游戏,我正在认真对待。最近我一直遇到用户制作假冒伪劣字符的问题,只是一堆不同的字母。像Ghytjrhfsdjfnsdms,Yiiiedawdmnwe,Hhhhhhhhhejejekk。我强迫他们改名,但它变得太多了。 我该怎么办?

我可以以某种方式检查,至少你不能在彼此旁边使用超过2个相同的字母吗?也许如果它包含元音

11 个答案:

答案 0 :(得分:11)

我建议将精力集中在建立一个用户界面上,这样可以很容易地将所有新名称列入管理员,以及一个强大的“强制重命名”机制,最大限度地减少管理员的工作量,而不是尝试定义一个非常复杂和变化的规则来创建一个名称(并编写一个正则表达式来匹配它们!)。

更新 - 但有一件事是我想到的:Second Life过去常常允许你自由指定一个名字(也许他们会检查名字数据库,我不知道)和然后为您提供几百个预定义姓氏的选择供您选择。对于在线RPG,这可能已经足够了。

答案 1 :(得分:6)

你可以使用metaphone实现,然后寻找“不自然”的模式:

http://www.php.net/manual/en/function.metaphone.php

这是用于metaphone字符串生成的PHP函数。传入一个字符串,它返回文本的语音表示。理论上,您可以传递大量“人类”名称,然后存储有效组合音素的数据库。要测试可疑名称,只需查看音素组合是否在数据库中。

希望这有帮助!

答案 2 :(得分:3)

如果您使用Google Search API查看该名称是否会返回任何结果,该怎么办?

答案 3 :(得分:3)

我说采取@ Unicron的方法,容易拒绝管理员,但在每次拒绝时,将名称添加到禁止名称的数据库中。您可以使用此数据来检测基于模式生成大量用户的特定攻击。当然很难发现一次性。

答案 4 :(得分:3)

会不会限制辅音或元音的数量,并阻止重复帮助? 作为正则表达式:

if(preg_match('/[bcdfghjklmnpqrtsvwxyz]{4}|[aeiou]{4}|([a-z])\1{2}/i',$name)){
    //reject
}

如果允许加重字符,可以将iconvASCII//TRANSLIT一起使用。

答案 5 :(得分:2)

我也有这个问题。解决此问题的一种简单方法是强制用户名对全球名称的数据库进行验证。基本上你在后端有一个数据库,有两十个性别的名字和姓氏,并且它们的名字相匹配。

通过谷歌搜索,您可以找到许多名称数据库。

答案 6 :(得分:2)

  

我可以以某种方式检查,至少你不能使用超过2个相同的字母彼此相邻吗?也许如果它包含元音

如果你想要这个,你可以这样做:

preg_match('/(.)\\1\\1/i', $name);

如果连续三次或更多次出现,则会返回1

答案 7 :(得分:1)

This link可能有所帮助。您也可以通过(可能已修改的)语音合成器引擎插入它,并分析它产生语音的麻烦,而不实际生成它。

答案 8 :(得分:1)

您应该尝试实施Naive Bayes spam filter的修改版本。例如,在正常的垃圾邮件检测中,您可以计算单词垃圾邮件的概率,并使用单个单词概率来确定整个邮件是否为垃圾邮件。

同样,您可以下载单词列表,并计算一对字母属于真实单词的概率。

,例如,创建一个26x26表,T。让第5行代表字母e,让条目T(5,1)ea出现在您的单词列表中的次数。完成计数后,将每行中的每个元素除以行的总和,以便T(5,1)现在是ea在以{开头的一对字母的单词列表中出现的次数的百分比e {1}}。

现在,您可以使用单个对概率(例如,在{JimyJiim}的iy中检查是否Jimy是否是一个可接受的名称。你可能必须确定正确的阈值概率,但要试一试 - 这并不难实现。

答案 9 :(得分:0)

您如何将创建用户的责任委托给第三方来源(如Facebook,Twitter,OpenId ......)?

这样做不会解决您的问题,但是对于用户来说创建其他帐户会更加有效 - 这(假设用户很懒,因为大部分都是)会阻止创建额外的“虚拟”用户。< / p>

答案 10 :(得分:-3)

好像你需要一个相当复杂的preg函数。我不想花时间为你写一篇,因为你会学到更多的自己写作,但如果你发布一些尝试,我会一路走来。

http://php.net/manual/en/function.preg-match.php