PHP оценивает строку как человеческое имя или другой текст

Ближайший существующий вопрос, который я нашел, это this или это

Я хотел бы написать функцию или класс, который принимает строку, а затем на основе любых критериев, которые могут быть запрограммированы в нее, будет возвращать вероятность того, что это настоящее человеческое имя. На данный момент я ожидаю, что он будет сильно смещен в сторону английских или европейских имен или английских транслитераций других имен. (например, "bob", "bob smith" и "smith" должны возвращать значение 1.0, а "sfgoisxdzzg" должно возвращать что-то вроде .001 или даже .0000001)

Кто-нибудь знает, это уже делается/делается? (даже если на другом языке) Моей первой мыслью было, что мне придется сделать какой-то скрипт машинного обучения. Моя проблема с этим заключается в моем полном незнании какой-либо теории машинного обучения.

Итак, вторая часть моего вопроса такова: является ли машинное обучение жизнеспособным вариантом решения этой проблемы? Если да, то с каких ресурсов мне следует начать, чтобы узнать, как это сделать? ЕСЛИ нет, можете ли вы указать мне правильное направление?


person TecBrat    schedule 28.03.2013    source источник
comment
Принятый ответ на ваш первый упомянутый вопрос - это то, что вы должны принять в качестве ответа на это. Вы сами/администрация должны следить за базой данных и выдавать плохие/наказания/штрафы за недопустимые имена.   -  person Daryl Gill    schedule 28.03.2013
comment
Ради интереса, зачем вам это?   -  person Jim    schedule 28.03.2013
comment
Вы можете взглянуть на Levenshtein и другие подобные функции, связанные оттуда. Как и в случае с чашей BCS, просто проведите их через кучу различных тестов и посмотрите, что получится в итоге. Однако вам, вероятно, понадобятся некоторые архетипы.   -  person Jared Farrish    schedule 28.03.2013
comment
Этот вопрос также может быть полезен: stackoverflow.com/a/6298193/505722   -  person Jim    schedule 28.03.2013
comment
Возможно, у Facebook есть идея проверки имени. Если часть использует специальный символ или словарное слово, то она недействительна.   -  person    schedule 28.03.2013
comment
@Jim Моя первоначальная причина в том, что у меня есть контактные формы, которые получают такие имена, как gyjSFjXJHjtgfgc. У меня уже есть несколько тестов на спам, но я подумал, что это может стать интересным побочным проектом, где я мог бы чему-то научиться.   -  person TecBrat    schedule 28.03.2013


Ответы (1)


Этот байесовский подход, который я использую для фильтрации с большим успехом при отправке контактов и запросах форм котировок. Форма использует скоринг и обрабатывает запросы со всего мира на разных языках. Если они не проходят 3 или 4 теста в разных полях, я отмечаю их как попытку спама. Очевидно, что такие вещи, как «123456», мгновенно вызывают красный флаг для номера телефона. Также 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);
?>

Даже если кто-то сбросит, он скопирует меня при попытке, чтобы я мог исправить свой подсчет очков. Есть несколько ложных срабатываний, как правило, на китайском или корейском языке, но по большей части любой, кто заполнит форму на английском языке, пройдет. Такие имена, как «У Си», действительно существуют.

person AbsoluteƵERØ    schedule 28.03.2013
comment
Это похоже на то, как я сейчас справляюсь с потенциальным спамом. Я дам некоторое время для других ответов, но я, вероятно, приму этот. - person TecBrat; 28.03.2013
comment
Прочитав ваш ответ, я изучаю слово байесовский, и я очень заинтригован. Это может быть совершенно новой областью для меня, чтобы направить некоторые знания. БЛАГОДАРНОСТЬ! Фильтрация спама Я уже делал это, не зная слова, но теперь я знаю, что искать чтобы найти больше ресурсов на нем. - person TecBrat; 28.03.2013
comment
В качестве примечания я также нашел этот детектор тарабарщины, который поможет мне . В качестве учебного текста использовался роман, и я подозреваю, что вместо этого человек мог бы использовать список имен. - person TecBrat; 29.03.2013