Я предлагаю рассматривать ваш массив ключевых слов как хеш-таблицу. Строчный текст статьи, разнесение по пробелам, затем цикл по каждому слову в разобранном массиве. Если слово существует в вашей хеш-таблице, переместите его в новый массив, отслеживая количество раз, которое оно было просмотрено.
В этом сценарии я провел быстрый сравнительный тест, сравнивающий регулярное выражение с хеш-таблицами. Чтобы запустить его с регулярным выражением 1000 раз, потребовалось 17 секунд. Чтобы запустить его с хэш-таблицей 1000 раз, потребовалось 0,4 секунды. Это должен быть процесс O (n + m).
$keywords = array("computer", "dog", "sandwich");
$article = "This is a test using your computer when your dog is being a dog";
$arr = explode(" ", strtolower($article));
$tracker = array();
foreach($arr as $word){
if(in_array($word, $keywords)){
if(isset($tracker[$word]))
$tracker[$word]++;
else
$tracker[$word] = 1;
}
}
Массив $ tracker выведет: "computer" => 1, "dog" => 2. Затем вы можете выполнить процесс, чтобы решить, какие теги использовать. Или, если вам не важно, сколько раз ключевое слово появляется, вы можете пропустить часть трекера и добавить теги в качестве ключевых слов.
РЕДАКТИРОВАТЬ: Может потребоваться, чтобы массив ключевых слов был массивом инвертированных индексов, чтобы обеспечить быстрый поиск. Я не уверен, как работает in_array (), но если он ищет, то это не так быстро, как должно быть. Инвертированный индексный массив будет выглядеть как
array("computer" => 1, "dog" => 1, "sandwich" => 1); // "1" can be any value
Тогда вы должны выполнить isset ($words [$ word]), чтобы проверить, соответствует ли слово ключевому слову, а не in_array (), что должно дать вам O (1). Кто-то еще может объяснить это мне.