2012-04-20 17 views
1

目的:「既知の文字」配列の文字を排他的に含む文章を検索するために、数万件の中国語文を検索します。例えば特定の文字のみを含む文章の中国語テキストコーパスの検索

: のは、私のコーパスは、以下の文章で構成されて言ってみましょう:。。?1)我去中国2)妳爱他3)你在哪里 私は排他的にこれらの文字が含まれている文章を "知っている" またはたい:1)我2)中3)国4)你5)在6)去7)愛8)哪9)里。 3つの文字がすべて第2の配列にあるため、最初の文が結果として返されます。私は妳やその他を求めなかったので、2番目の文は拒否されます。結果として3番目の文が返されます。句読記号は無視されます(英数字も含まれます)。

私はこれを行う作業スクリプトを持っています(下記)。私はこれが効率的な方法かどうか疑問に思っています。興味があれば、見てみて、変更を提案したり、自分で書いたり、アドバイスをしてください。私は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

関連する問題