Задача: выполнить поиск в массиве из десятков тысяч китайских предложений, чтобы найти предложения, содержащие исключительно символы из массива «известных символов».
Например: допустим, мой корпус состоит из следующих предложений: 1) 我去中国。 2) 妳爱他。 3) 你在哪里? Я только «знаю» или хочу предложения, которые содержат исключительно эти символы: 1) 我 2) 中 3) 国 4) 你 5) 在 6) 去 7) 爱 8) 哪 9) 里. В качестве результата будет возвращено первое предложение, потому что все три его символа находятся во втором массиве. Второе предложение было бы отклонено, потому что я не спросил 妳 или 他. В результате будет возвращено третье предложение. Знаки препинания игнорируются (как и любые буквенно-цифровые символы).
У меня есть рабочий скрипт, который это делает (ниже). Мне интересно, эффективный ли это способ или нет. Если вы заинтересованы, пожалуйста, посмотрите и предложите изменения, напишите свои или дайте совет. Я почерпнул кое-что из этого скрипта и проверил несколько вопросов по стеку, но они не рассмотрели этот сценарий.
<?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
}
?>