я делаю текстовую препроцесс по текстовому анализу с большой базой данных, я хочу сделать камуфляжные данные из всей статьи базы данных в массив, но это займет много времени.
$multiMem = memory_get_usage();
$xstart = microtime(TRUE);
$word = "";
$sql = mysql_query("SELECT * FROM tbl_content");
while($data = mysql_fetch_assoc($sql)){
$word = $word."".$data['article'];
}
$preprocess = new preprocess($word);
$word= $preprocess->preprocess($word);
print_r($kata);
$xfinish = microtime(TRUE);
вот мой класс препроцесс
class preprocess {
var $teks;
function preprocess($teks){
/*start process segmentation*/
$teks = trim($teks);
//menghapus tanda baca
$teks = str_replace("'", "", $teks);
$teks = str_replace("-", "", $teks);
$teks = str_replace(")", "", $teks);
$teks = str_replace("(", "", $teks);
$teks = str_replace("=", "", $teks);
$teks = str_replace(".", "", $teks);
$teks = str_replace(",", "", $teks);
$teks = str_replace(":", "", $teks);
$teks = str_replace(";", "", $teks);
$teks = str_replace("!", "", $teks);
$teks = str_replace("?", "", $teks);
//remove HTML tags
$teks = strip_tags($teks);
$teks = preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', $teks);
/*end proses segmentation*/
/*start case folding*/
$teks = strtolower($teks);
$teks = preg_replace('/[0-9]+/', '', $teks);
/*end case folding*/
/*start of tokenizing*/
$teks = explode(" ", $teks);
/*end of tokenizing*/
/*start of filtering*/
//stopword
$file = file_get_contents('stopword.txt', FILE_USE_INCLUDE_PATH);
$stopword = explode("\n", $file);
//remove stopword
$teks = preg_replace('/\b('.implode('|',$stopword).')\b/','',$teks);
/*end of filtering*/
/*start of stemming*/
require_once('stemming.php');
foreach($teks as $t => $value){
$teks[$t] = stemming($value);
}
/*end of stemming*/
$teks = array_filter($teks);
$teks = array_values($teks);
return $teks;
}
}
Кто-нибудь есть идеи, чтобы сделать быстрый процесс на моей программе? Пожалуйста, помогите
спасибо за продвижение
Есть пара вещей, которые могут быть улучшены …
После создания $word
Вы можете освободить результат запроса $sql
и data
$word = '';
$sql = mysql_query("SELECT * FROM tbl_content");
while($data = mysql_fetch_assoc($sql)){
$word = $word . $data['article'];
}
mysql_free_result($sql);
unset($sql, $data);
Этот блок:
$teks = str_replace("'", "", $teks);
$teks = str_replace("-", "", $teks);
$teks = str_replace(")", "", $teks);
$teks = str_replace("(", "", $teks);
$teks = str_replace("=", "", $teks);
$teks = str_replace(".", "", $teks);
$teks = str_replace(",", "", $teks);
$teks = str_replace(":", "", $teks);
$teks = str_replace(";", "", $teks);
$teks = str_replace("!", "", $teks);
$teks = str_replace("?", "", $teks);
можно написать так:
$teks = str_replace(array('(','-',')',',','.','=',';','!','?'), '', $teks);
так как вы позже в коде заменяете числа регулярным выражением, вы можете добавить числа в верхнем str_replace
позвонить или добавить верхние символы к preg_replace
$teks = str_replace(array('0','1','2','3','4','5','6','7','8','9','(','-',')',',','.','=',';','!','?'), '', $teks);
ИЛИ ЖЕ
$teks = preg_replace('/[0-9,\(\)\-\=\.\,\;\!\?]+/', '', $teks);
$teks = strip_tags($teks);
должно быть достаточно. Если это не так, используйте только preg_replace
после, так как он делает то же самое.
использование file
insted of file_get_contentsfollowed by the
взрыватьсяsince the
файлreturns an array directly. Also there is no need to explode the $teks
$stopword = file('stopword.txt');
array_walk($stopword, function(&$item1){
$item1 = '/\b' . $item1 . '\b/';
});
$teks = preg_replace($stopword, '', $teks);
Как правило, не используйте ""
так как процессор будет пытаться оценить контент, и это займет больше времени.
Если stopword.txt
список не меняется, лучше и быстрее иметь его в коде в виде массива напрямую, чем обращаться к файловой системе для его чтения.
Других решений пока нет …