Как мне получить наиболее популярные слова из нескольких таблиц контента в PHP / MySQL.
Например, у меня есть таблица forum_post с сообщением форума; это содержит тему и содержание. Кроме того, у меня есть несколько других таблиц с разными полями, которые также могут содержать контент для анализа.
Я, вероятно, сам пойду за всем содержимым, strip (возможно) html взорвут строку в пробелах. удалять кавычки и запятую и т. д. и просто подсчитывать слова, которые не являются общими, сохраняя массив во время пробега по всем словам.
Мой главный вопрос: если кто-то знает способ, который может быть проще или быстрее.
Кажется, я не нашел полезных ответов об этом, это могут быть неправильные шаблоны поиска.
Магия, которую вы ищете, – это php-функция, называемая str_word_count () .
В приведенном ниже примере кода, если вы получите много лишних слов из этого, вам нужно будет написать пользовательскую дескрипцию, чтобы удалить их. Кроме того, вы захотите снять все теги html со слов и других символов.
Я использую что-то похожее на это для генерации ключевых слов (очевидно, что код является собственностью). Короче говоря, мы берем предоставленный текст, мы проверяем частоту слов, и если слова появляются в порядке, мы сортируем их в массиве на основе приоритета. Поэтому наиболее часто встречающиеся слова будут первыми на выходе. Мы не учитываем слова, которые встречаются только один раз.
<?php $text = "your text."; //Setup the array for storing word counts $freqData = array(); foreach( str_word_count( $text, 1 ) as $words ){ // For each word found in the frequency table, increment its value by one array_key_exists( $words, $freqData ) ? $freqData[ $words ]++ : $freqData[ $words ] = 1; } $list = ''; arsort($freqData); foreach ($freqData as $word=>$count){ if ($count > 2){ $list .= "$word "; } } if (empty($list)){ $list = "Not enough duplicate words for popularity contest."; } echo $list; ?>
Я вижу, что вы приняли ответ, но я хочу дать вам альтернативу, которая может быть более гибкой в некотором смысле: (Решите для себя :-)) Я не тестировал код, но думаю, вы получите картину. $ dbh – объект соединения PDO. Это зависит от того, что вы хотите сделать с результирующим $ words массивом.
<?php $words = array(); $tableName = 'party'; //The name of the table countWordsFromTable($words, $tableName) $tableName = 'party2'; //The name of the table countWordsFromTable($words, $tableName) //Example output array: /* $words['word'][0] = 'happy'; //Happy from table party $words['wordcount'][0] = 5; $words['word'][1] = 'bulldog'; //Bulldog from table party2 $words['wordcount'][1] = 15; $words['word'][2] = 'pokerface'; //Pokerface from table party2 $words['wordcount'][2] = 2; */ $maxValues = array_keys($words, max($words)); //Get all keys with indexes of max values of $words-array $popularIndex = $maxValues[0]; //Get only one value... $mostPopularWord = $words[$popularIndex]; function countWordsFromTable(&$words, $tableName) { //Get all fields from specific table $q = $dbh->prepare("DESCRIBE :tableName"); $q->execute(array(':tableName' = > $tableName)); $tableFields = $q->fetchAll(PDO::FETCH_COLUMN); //Go through all fields and store count of words and their content in array $words foreach($tableFields as $dbCol) { $wordCountQuery = "SELECT :dbCol as word, LENGTH(:dbCol) - LENGTH(REPLACE(:dbCol, ' ', ''))+1 AS wordcount FROM :tableName"; //Get count and the content of words from every column in db $q = $dbh->prepare($wordCountQuery); $q->execute(array(':dbCol' = > $dbCol)); $wrds = $q->fetchAll(PDO::FETCH_ASSOC); //Add result to array $words foreach($wrds as $w) { $words['word'][] = $w['word']; $words['wordcount'][] = $w['wordcount']; } } } ?>