Eine Technik, die Sie in Betracht ziehen könnten, ist die Verwendung von ZSETs in Redis für so etwas. Wenn Sie sehr große Datenmengen haben, werden Sie feststellen, dass Sie etwas tun können:
$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));
die besten Sätze abzurufen, dann würden Sie verwenden diese:
// Assume $r is instantiated like it is above
$trending_phrases = $r->zReverseRange("trending_phrases", 0, 10);
$trending_phrases
wird ein Array der Top-Ten Trend Phrasen sein. Um Dinge wie die letzten Trend-Phrasen (im Gegensatz zu einem persistenten, globalen Satz von Phrasen) zu tun, duplizieren Sie alle obigen Redis-Interaktionen. Verwenden Sie für jede Interaktion einen Schlüssel, der beispielsweise den heutigen Zeitstempel und den Zeitstempel von morgen angibt (z. B. Tage seit dem 1. Januar 1970). Wenn Sie die Ergebnisse mit $trending_phrases
abrufen, rufen Sie einfach den heutigen und den morgigen (oder gestern) Schlüssel ab und verwenden Sie array_merge
und array_unique
, um die Verbindung zu finden.
Hoffe, das hilft!
Wirklich hängt davon ab, was Sie als "Phrase" definieren werden –
Wie wäre es, zwei/drei/vier Wörter zu einem zusammen zu kleben? Es wäre immer noch O (n). –
Ich denke nicht, dass Sie Ihre Antwort auf ein paar Codezeilen auf stackoverflow finden werden. Dieses Problem ist eine These Thema wahrscheinlich im Zusammenhang mit Web-Semantik – pleasedontbelong