我正在为我的论坛设置一个Twitter风格的“趋势主题”框。我有最受欢迎/单词/,但甚至不能开始思考如何获得像Twitter这样的流行短语。
目前我只是将最后200个帖子的所有内容都分成一个字符串并将它们分成单词,然后根据哪些单词的使用次数排序。如何将这一点从最流行的单词转换为最流行的短语?
答案 0 :(得分:2)
您可能会考虑的一种技术是在Redis中使用ZSET来实现这样的功能。如果你有非常大的数据集,你会发现你可以这样做:
$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_merge
和array_unique
查找联合。
希望这有帮助!
答案 1 :(得分: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>';
如果您将短语视为 n 连续单词的聚合,那么速度会慢得多。
答案 2 :(得分:1)
我不确定你在寻找什么类型的答案,但Laconica:
http://status.net/?source=laconica
是一个开源的twitter克隆(更简单的版本)。
也许你可以使用部分代码来制作自己的流行歌曲?
祝你好运!