Una tecnica che si potrebbe considerare è l'uso di ZSET in Redis per qualcosa di simile. Se hai molto grandi insiemi di dati, ci si accorge che si può fare qualcosa di simile:
$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));
Per recuperare le frasi migliori, devi usare questo:
// Assume $r is instantiated like it is above
$trending_phrases = $r->zReverseRange("trending_phrases", 0, 10);
$trending_phrases
sarà una matrice delle prime dieci frasi di tendenza. Per fare cose come le frasi di tendenza recenti (al contrario di un insieme di frasi persistenti e globali), duplica tutte le interazioni di Redis qui sopra. Per ogni interazione, utilizza una chiave indicativa, ad esempio, del timestamp di oggi e del timestamp di domani (cioè giorni dal 1 ° gennaio 1970). Quando recuperi i risultati con $trending_phrases
, recupera solo la chiave di oggi e di domani (o di ieri) e usa array_merge
e array_unique
per trovare l'unione.
Spero che questo aiuti!
Dipende davvero da cosa si intende definire una "frase" –
Come si fa a incollare due/tre/quattro parole insieme a una? Sarebbe ancora O (n). –
non penso che troverai la tua risposta su poche righe di codice su StackOverflow .. questo problema è un argomento di tesi probabilmente correlato alla semantica web – pleasedontbelong