У меня есть часть текста (500-1500 символов)
И у меня есть список ключевых слов (1000 записей) ..
Что мне делать, чтобы найти ключевые слова из этого списка, связанные с моим текстом?
Я думал, чтобы искать эти ключевые слова в тексте для каждого ключевого слова в списке, но это немного «дорого», я думаю
благодаря
Я бросаю шляпу в кольцо …
function extractWords($text, $minWordLength = null, array $stopwords = array(), $caseIgnore = true) { $pattern = '/\w'. (is_null($minWordLength) ? '+' : '{'.$minWordLength.',}') .'/'; $matches = array(); preg_match_all($pattern, $text, $matches); $words = $matches[0]; if ($caseIgnore) { $words = array_map('strtolower', $words); $stopWords = array_map('strtolower', $stopwords); } $words = array_diff($words, $stopwords); return $words; } function countKeywords(array $words, array $keywords, $threshold = null, $caseIgnore = true) { if ($caseIgnore) { $keywords = array_map('strtolower', $keywords); } $words = array_intersect($words, $keywords); $counts = array_count_values($words); arsort($counts, SORT_NUMERIC); if (!is_null($threshold)) { $counts = array_filter($counts, function ($count) use ($threshold) { return $count >= $threshold; }); } return $counts; }
Применение:
$text = 'abc a'; // your text $keywords = array('a', 'b'); // keywords from your database $words = extractWords($text); $count = countKeywords($words, $keywords); print_r($count); $total = array_sum($count); var_dump($total); $affinity = ($total == 0 ? 0 : 1 / (count($words) / $total)); var_dump($affinity);
Печать
Массив ([a] => 2 [b] => 1)
Int (3)
Поплавок (0,75)
Если ключевые слова всегда остаются неизменными, вы можете создать индекс над ними, что улучшает скорость поиска (чрезвычайно). Стандартной структурой данных для обработки является trie, но гораздо лучше (!) Альтернатива – это автомат Aho-Corasick или другой алгоритм поиска нескольких шаблонов, такой как многостраничный Horspool (также известный как алгоритм У-Манбера).
Наконец, очень простая альтернатива заключается в том, чтобы объединить все ваши ключевые слова с помощью труб ( |
) и использовать результат как регулярное выражение. Технически это приближается к автомату Aho-Corasick и намного проще для вас реализовать.