Intereting Posts
Laravel упорядочивает отношение по методу на модели Попытка вставить текст в файл ВЫШЕ определенную строку Может ли вредоносный пользователь в веб-приложении манипулировать входами (помимо данных формы), которые отправляются передним интерфейсом веб-приложения? Спецификация на странице PHP, созданной WordPress PHP скачать .jpg или .avi Найти все файлы с пустым или WS на BOF или EOF Класс «App \ Providers \ AppServiceProvider» не найден MySQL и PHP – как отображать все строки, где значение поля равно x? Поиск существующей электронной почты и имени пользователя в базе данных Любой preg_match, чтобы проверить, является ли URL-ссылка для youtube / vimeo / dailymotion? Как запросить сводную таблицу с несколькими внешними ключами Laravel 5 Eloquent Как захватить значения из ячеек таблицы HTML с помощью JavaScript Как получить значение выбранного элемента внутри datalist в javascript? не удается получить сообщения чата изображение не извлекается из базы данных с использованием пути

Сродство между текстом и списком ключевых слов?

У меня есть часть текста (500-1500 символов)

И у меня есть список ключевых слов (1000 записей) ..

Что мне делать, чтобы найти ключевые слова из этого списка, связанные с моим текстом?

Я думал, чтобы искать эти ключевые слова в тексте для каждого ключевого слова в списке, но это немного «дорого», я думаю

благодаря

Solutions Collecting From Web of "Сродство между текстом и списком ключевых слов?"

Я бросаю шляпу в кольцо …

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 и намного проще для вас реализовать.