2013-03-28 4 views
0

가장 가까운 기존의 문제와 같은 문자열입니다 this 또는 thisPHP 판사 내가 찾은 사람의 이름이나 다른 텍스트

나는 기준이 될 수 있습니다 무엇을 기반으로 다음 문자열을 받아 함수 나 클래스를 작성하고 싶습니다

그것을 프로그래밍하면 실제 인간 이름이라는 확률이 반환됩니다. 지금은 영어 나 유럽 이름이나 다른 이름의 영문 음역으로 크게 편향되어있을 것이라고 기대합니다. (예 : "bob", "bob smith"및 "smith"는 모두 1.0을 반환하고 "sfgoisxdzzg"는 .001 또는 .0000001과 같은 값을 반환해야 함)

끝난? (다른 언어 인 경우에도) 첫 번째 생각은 스크립트를 배우는 일종의 기계를 사용해야한다는 것입니다. 내 문제는 모든 기계 학습 이론에 대한 내 완전 무지입니다.

제 질문의 두 번째 부분은 다음과 같습니다. 기계가이 문제를 해결하기위한 실행 가능한 옵션을 배우고 있습니까? 그렇다면 어떻게 시작해야합니까? 그렇지 않다면 올바른 방향으로 나를 가르 칠 수 있습니까?

+0

첫 번째로 언급 된 질문에 대한 대답이이 답변으로 받아 들여 져야합니다. 데이터베이스를 모니터하고 유효하지 않은 이름에 대해 불량/처벌/벌칙을 발행하는 것은 귀하 자신/행정부의 책임입니다. –

+0

관심없는 이유는 무엇입니까? – Jim

+0

[Levenshtein] (http://php.net/manual/en/function.levenshtein.php)과 거기에서 링크 된 다른 유사한 기능을 살펴볼 수 있습니다. BCS 보울 선택과 마찬가지로, 여러 가지 테스트를 거치면서 끝낼 수 있는지 확인하십시오. 그러나 아마도 당신은 어떤 원형을 필요로 할 것입니다. –

답변

2

연락처 제출 및 견적 양식 요청시 상당히 성공적으로 필터링에 사용하는 베이지안 방식입니다. 양식은 채점을 사용하고 있으며 다양한 언어로 전 세계의 요청을 처리합니다. 그들이 여러 필드에서 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); 
?> 

누군가 내뿜어도 내 시도를 복사하여 내 점수를 수정할 수 있습니다. 일반적으로 중국어 또는 한국어에서는 약간의 가양 성이 있지만 대부분 영어로 작성한 사람은 통과 할 것입니다. "Wu Xi"와 같은 이름이 존재합니다.

+0

이것은 잠재적 인 스팸을 어떻게 처리하는지와 개념이 비슷합니다. 다른 답변을 위해 시간을 좀 갖겠 습니다만, 아마도이 답변을 받아 들일 것입니다. – TecBrat

+0

답변을 읽은 후로, 나는 "베이지안"이라는 단어를 실감했으며 나는 매우 흥미 롭습니다. 이것은 제가 약간의 학습을 지시하는 완전히 새로운 영역 일 수 있습니다. 감사! [스팸 필터링] (http://en.wikipedia.org/wiki/Bayesian_spam_filtering) 나는 이미이 일을하고 있었지만, 그 단어를 알지 못했지만 이제는 더 많은 자료를 찾기 위해 무엇을 검색해야하는지 알고있다. – TecBrat

+0

부수적으로, 나는 또한이 [Gibberish Detector] (https://github.com/buggedcom/Gibberish-Detector-PHP)가 나를 위해 트릭을 수행한다는 것을 알았습니다. 그것은 훈련 텍스트로 소설을 사용하고 나는 사람이 대신 이름 목록을 사용할 수 있다고 생각합니다. – TecBrat