Una técnica que puede considerar es el uso de ZSET en Redis para algo como esto. Si usted tiene muy grandes conjuntos de datos, usted encontrará que usted puede hacer algo como esto:
$words = explode(" ", $input); // Pseudo-code for breaking a block of data into individual words.
$word_count = count($words);
$r = new Redis(); // Owlient's PHPRedis PECL extension
$r->connect("127.0.0.1", 6379);
function process_phrase($phrase) {
global $r;
$phrase = implode(" ", $phrase);
$r->zIncrBy("trending_phrases", 1, $phrase);
}
for($i=0;$i<$word_count;$i++)
for($j=1;$j<$word_count - $i;$j++)
process_phrase(array_slice($words, $i, $j));
Para recuperar las frases principales, que tendría que utilizar esto:
// Assume $r is instantiated like it is above
$trending_phrases = $r->zReverseRange("trending_phrases", 0, 10);
$trending_phrases
será una matriz de las diez mejores frases de tendencia. Para hacer cosas como frases de tendencias recientes (a diferencia de un conjunto persistente de frases globales), duplique todas las interacciones de Redis anteriores. Para cada interacción, use una clave que sea indicativa de, por ejemplo, la marca de tiempo de hoy y la marca de tiempo de mañana (es decir, días desde el 1 de enero de 1970). Al recuperar los resultados con $trending_phrases
, solo recupere las claves de hoy y de mañana (o de ayer) y use array_merge
y array_unique
para encontrar la unión.
Espero que esto ayude!
Realmente depende de lo que va a definir como una "frase" –
¿Qué tal pegar dos/tres/cuatro palabras juntas en una? Todavía sería O (n). –
no creo que encuentres tu respuesta en algunas líneas de código en stackoverflow ... este problema es un tema de tesis probablemente relacionado con la semántica web – pleasedontbelong