2010-10-13 29 views
6

我正在为我的论坛设置Twitter风格的“趋势主题”框。我有最受欢迎的/言辞/,但甚至不能开始思考我将如何获得热门词组,比如Twitter。如何从大量文本中获得最流行的短语?

既然这样我只是得到最后的200个职位的所有内容转换为字符串,并将其分割成词,然后排序由哪些词使用最多。我怎样才能从最流行的词汇中把这个变成最流行的词汇呢?

+0

真的取决于你要定义为“短语” – 2010-10-13 20:31:43

+0

如何胶合二/三/四言联到一个什么呢?它仍然是O(n)。 – 2010-10-13 20:34:36

+0

我不认为你会发现对计算器几行代码你的答案..这个问题是一个命题科目可能与网络语义 – pleasedontbelong 2010-10-13 20:43:23

回答

2

一种技术是在Redis的使用ZSETs的这样的事情。如果你有非常大的数据集,你会发现,你可以做这样的事情:

$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)); 

要检索的顶部短语,你会使用这样的:

// Assume $r is instantiated like it is above 
$trending_phrases = $r->zReverseRange("trending_phrases", 0, 10); 

$trending_phrases将成为排名前十的热门词组的一部分。要执行最近的趋势词组(而不是持久的全局词组),请复制上面所有的Redis交互。对于每次交互,请使用指示当前时间戳和明天时间戳(即1970年1月1日以来的天数)的密钥。当用$trending_phrases检索结果时,只需检索今天和明天(或昨天)的密钥,并使用array_mergearray_unique来查找联合。

希望这会有所帮助!

1

而不是分裂个别单词拆分在个别短语,就这么简单。

$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>'; 

如果你考虑一个词组的ñ连续字的聚集这将是慢了很多。你可能会考虑

+0

就性能而言,'array_key_exists($ sentence,$ popular)!== true'比'!isset($ popular [$ sentence])'慢整个数量级。在这种情况下,功能差异并不重要。 – mattbasta 2010-10-14 03:59:09

+0

@mattbasta:确实。但是,一个数量级更慢?如慢10倍?你有任何显示这些结果的基准吗? – 2010-10-14 09:25:53

+0

我没有什么好用的,但是我有更大阵列(1000多个元素)的经验,'isset'需要50ms以内,'array_key_exists'可能需要300-400ms。 – mattbasta 2010-10-14 14:00:09

1

林不知道你在找什么类型的答案的,但Laconica:

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

是一个开源的Twitter克隆(更简单的版本)。

也许你可以使用代码的一部分,使自己的流行frases?

祝你好运!