2012-04-20 2 views
1

목표 : "알려진 문자"배열의 문자 만 포함하는 문장을 찾기 위해 수만개의 중국어 문장 배열을 검색합니다. 예를 들어특정 문자만을 포함하는 문장에 대한 중국어 텍스트 코퍼스 검색

: 이의 나의 신체는 다음과 같은 문장으로 구성되어 있다고 가정 해 봅시다 : 1) 我 去 中国 2) 妳 爱 他 3) 你 在 哪里 난 단지 "알고"또는 독점적으로이 문자가 포함 된 문장을 원한다..? : 1) 我 2) 中 3) 国 4) 你 5) 在 6) 去 7) 愛 8) 哪 9) 里. 첫 번째 문장은 세 개의 문자가 모두 두 번째 배열에 있기 때문에 결과로 반환됩니다. 두 번째 문장은 내가 妳 또는 다른 것을 요구하지 않았기 때문에 거절 될 것이다. 세 번째 문장은 결과로 반환됩니다. 구두점은 무시됩니다 (영숫자 문자는 제외).

나는 (아래)이 작업 스크립트가 있습니다. 이것이 효율적인 방법인지 아닌지 궁금합니다. 관심이 있으시면 살펴보고 변경 제안을하거나 직접 작성하거나 조언을 해주십시오. 나는 this script에서 일부를 모으고 일부 stackoverflow 질문을 체크 아웃했지만이 시나리오를 해결하지 못했습니다. 그것은 나에게 나타납니다

<?php 
$known_characters = parse_file("FILENAME") // retrieves target characters 
$sentences = parse_csv("FILENAME"); // retrieves the text corpus 

$number_wanted = 30; // number of sentences to attempt to retrieve 

$found = array(); // stores results 
$number_found = 0; // number of results 
$character_known = false; // assume character is not known 
$sentence_known = true; // assume sentence matches target characters 

foreach ($sentences as $s) { 

    // retrieves an array of the sentence 
    $sentence_characters = mb_str_split($s->ttext); 

    foreach ($sentence_characters as $sc) { 
     // check to see if the character is alpha-numeric or punctuation 
     // if so, then ignore. 
     $pattern = '/[a-zA-Z0-9\s\x{3000}-\x{303F}\x{FF00}-\x{FF5A}]/u'; 
     if (!preg_match($pattern, $sc)) { 
      foreach ($known_characters as $kc) {; 
       if ($sc==$kc) { 
        // if character is known, move to next character 
        $character_known = true; 
        break; 
       } 
      } 
     } else { 
      // character is known if it is alpha-numeric or punctuation 
      $character_known = true; 
     } 
     if (!$character_known) { 
      // if character is unknown, move to next sentence 
      $sentence_known = false; 
      break; 
     } 
     $character_known = false; // reset for next iteration 
    } 
    if ($sentence_known) { 
     // if sentence is known, add it to results array 
     $found[] = $s->ttext; 
     $number_found = $number_found+1; 
    } 
    if ($number_found==$number_wanted) 
     break; // if required number of results are found, break 

    $sentence_known = true; // reset for next iteration 
} 
?> 

답변

0

이 그것을 수행해야합니다

$pattern = '/[^a-zA-Z0-9\s\x{3000}-\x{303F}\x{FF00}-\x{FF5A}我中国你在去爱哪里]/u'; 
if (preg_match($pattern, $sentence) { 
    // the sentence contains characters besides a-zA-Z0-9, punctuation 
    // and the selected characters 
} else { 
    // the sentence contains only the allowed characters 
} 

UTF-8로 소스 코드 파일을 저장해야합니다.

+0

단순함에 감사드립니다. 정규식이 너무 길어지는 시점이 있습니까? 예를 들어, 2000 개의 다른 문자 세트의 문자 만 포함하는 문장을 검색하는 경우 그 문자를 밀지 않을까요? – tsroten

+0

기술적으로 정상적으로 작동해야합니다. 반복적으로 2000자를 반복하는 것보다 낫습니다. 하지만 리터럴 정규 표현식을 저장하고 싶지는 않지만 동적으로 작성해야합니다. – deceze

+0

굉장, 대답 주셔서 감사합니다, 잘 작동합니다. 나는 정규식을하기보다는 오히려 그것이 할 수있는 것에 대해 무지하다는 점에서 새로운 것이다. – tsroten

관련 문제