2010-10-13 6 views
6

Ich erstelle eine Twitter-Stil "Trendthemen" Box für mein Forum. Ich habe die populärsten/Wörter /, kann aber nicht einmal anfangen zu denken, wie ich beliebte Phrasen bekomme, wie Twitter es tut.Wie bekomme ich die beliebtesten Sätze aus vielen Texten?

So wie es aussieht, bekomme ich nur den gesamten Inhalt der letzten 200 Beiträge in eine Zeichenfolge und teile sie in Wörter, dann sortiere nach, welche Wörter am häufigsten verwendet werden. Wie kann ich dies von den beliebtesten Wörtern in die beliebtesten Sätze umwandeln?

+0

Wirklich hängt davon ab, was Sie als "Phrase" definieren werden –

+0

Wie wäre es, zwei/drei/vier Wörter zu einem zusammen zu kleben? Es wäre immer noch O (n). –

+0

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

Antwort

2

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!

1

Anstatt einzelne Wörter zu trennen, einzelne Sätze zu trennen, ist es so einfach.

$popular = array(); 

foreach ($tweets as $tweet) 
{ 
    // split by common punctuation chars 
    $sentences = preg_split('~[.!?]+~', $string); 

    foreach ($sentences as $sentence) 
    { 
     $sentence = strtolower(trim($sentence)); // normalize sentences 

     if (isset($popular[$sentence]) === false) 
     //if (array_key_exists($sentence, $popular) === false) 
     { 
      $popular[$sentence] = 0; 
     } 

     $popular[$sentence]++; 
    } 
} 

arsort($popular); 

echo '<pre>'; 
print_r($popular); 
echo '</pre>'; 

Es wird viel langsamer sein, wenn Sie eine Phrase als eine Ansammlung von n aufeinander folgenden Worten in Betracht ziehen.

+0

Aus Performanzgründen ist 'array_key_exists ($ sentence, $ popular)! == true' eine ganze Größenordnung langsamer als'! Isset ($ popular [$ sentence]) '. In dieser Situation sind die funktionalen Unterschiede unwichtig. – mattbasta

+0

@ Mattbasta: In der Tat. Aber, eine Größenordnung langsamer? Wie in 10x langsamer? Haben Sie einen Benchmark, der diese Ergebnisse anzeigt? –

+0

Ich habe keine handlichen, aber ich habe Erfahrung mit größeren Arrays (1000+ Elemente), die 'isset' dauert innerhalb von 50ms,' array_key_exists' kann bis zu 300-400ms dauern. – mattbasta

1

Ich bin nicht sicher, welche Art von Antwort, die Sie suchen, aber Laconica:

http://status.net/?source=laconica

ist ein Open Source Twitter-Klon (eine viel einfachere Version).

Vielleicht könnten Sie einen Teil des Codes verwenden, um Ihre eigenen beliebten Frasen zu erstellen?

Viel Glück!

Verwandte Themen