【问题标题】:PHP judge a string as a human name or other textPHP判断一个字符串是人名还是其他文本
【发布时间】:2013-03-28 02:59:01
【问题描述】:

我发现的最接近的现有问题是thisthis

我想编写一个接受字符串的函数或类,然后根据可以编程的任何标准返回它是真实人名的概率。目前,我预计它会严重偏向于英语或欧洲名称或其他名称的英语音译。 (例如,“bob”、“bob smith”和“smith”都应该返回 1.0,“sfgoisxdzzg”应该返回 .001 甚至 .0000001)

有谁知道这是否已经完成/正在完成? (即使是另一种语言) 我的第一个想法是我必须编写某种机器学习脚本。我的问题是我对任何机器学习理论都一无所知。

所以,我的问题的第二部分是:机器学习是解决这个问题的可行选择吗?如果是这样,我应该从哪些资源开始学习如何做到这一点?如果没有,你能指出我正确的方向吗?

【问题讨论】:

  • 第一个引用问题的公认答案是您应该对此的回答。由您自己/管理员来监控数据库并对无效名称发出不良/惩罚/处罚
  • 出于兴趣,您为什么要这样做?
  • 您可以查看Levenshtein 以及从那里链接的其他类似功能。就像 BCS 碗选择一样,只需将它们折腾通过一堆不同的测试,看看你最终会得到什么。但是,您可能需要一些原型。
  • 这个问题也可能有用:stackoverflow.com/a/6298193/505722
  • 也许 facebook 已经实现了名称检查的想法。如果某个部分使用特殊字符或字典单词,则它是无效的。

标签: php text-analysis


【解决方案1】:

我用于过滤的这种贝叶斯方法在联系提交和报价表单请求方面取得了相当大的成功。该表格使用评分并处理来自世界各地的各种语言的请求。如果他们仅在各个领域未通过 3 或 4 次测试,那么我会将它们标记为垃圾邮件尝试。显然,像“123456”这样的电话号码会立即引发红旗。此外,cmets 中的 BBCode 是一个致命的赠品。

<?php
function nameCheck($var) {
        $nameScore = 0;
        //If name < 4 score + '3'
        $chars_count = strlen($var);
        $consonants = preg_replace('![^BCDFGHJKLMNPQRSTVWXZ]!i','',$var);
        $consonant_count = strlen($consonants);
        $vowels = preg_replace('![^AEIOUY]!i','',$var);
        $vowel_count = strlen($vowels);
        //We're expecting first and last name.
        if ($chars_count < 4){
            $nameScore = $nameScore + 3;    
        }

        //if name > 4 and no spaces score + '4'
        if (($chars_count > 4)&& (!preg_match('![ ]!',$var))){
            $nameScore = $nameScore + 4;    
        }

        if (($chars_count > 4)&&(($consonant_count==0)||($vowel_count==0))){
            $nameScore = $nameScore + 5;            
        }

        //if name > 4 and vowel to consonant ratio < 1/8 score + '5'
        if (($consonant_count > 0) && ($vowel_count > 0) && ($chars_count > 4) && ($vowel_count/$consonant_count < 1/8)){
            $nameScore = $nameScore + 5;    
        }
        //Needs at least 1 letter.
        if (!preg_match('![A-Za-z]!',$var)){
            $nameScore = $nameScore + 10;           
        }

        return $nameScore;
    }

//added for testing
$var = $_GET['email'];
echo nameCheck($var);
?>

即使有人同花,我也会在尝试时复制我,这样我就可以修正我的得分。中文或韩文通常会有一些误报,但大多数情况下,任何用英文填写表格的人都会通过。像“无锡”这样的名字确实存在。

【讨论】:

  • 这在概念上类似于我目前处理潜在垃圾邮件的方式。我会花一些时间来回答其他问题,但我可能会接受这个。
  • 自从看了你的回答,我一直在研究“贝叶斯”这个词,我很感兴趣。这对我来说可能是一个全新的领域来指导一些学习。谢谢! Spam Filtering 我已经在这样做了,但不知道这个词,但现在我知道要搜索什么以找到更多资源。
  • 作为旁注,我还发现这个Gibberish Detector 可以为我解决问题。它使用小说作为训练文本,我怀疑一个人可以使用名单代替。
猜你喜欢
  • 1970-01-01
  • 2010-09-09
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 2021-06-22
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多