我正在为我的论坛设置Twitter风格的“趋势主题”框。我有最受欢迎的/言辞/,但甚至不能开始思考我将如何获得热门词组,比如Twitter。如何从大量文本中获得最流行的短语?
既然这样我只是得到最后的200个职位的所有内容转换为字符串,并将其分割成词,然后排序由哪些词使用最多。我怎样才能从最流行的词汇中把这个变成最流行的词汇呢?
我正在为我的论坛设置Twitter风格的“趋势主题”框。我有最受欢迎的/言辞/,但甚至不能开始思考我将如何获得热门词组,比如Twitter。如何从大量文本中获得最流行的短语?
既然这样我只是得到最后的200个职位的所有内容转换为字符串,并将其分割成词,然后排序由哪些词使用最多。我怎样才能从最流行的词汇中把这个变成最流行的词汇呢?
一种技术是在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_merge
和array_unique
来查找联合。
希望这会有所帮助!
而不是分裂个别单词拆分在个别短语,就这么简单。
$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>';
如果你考虑一个词组的ñ连续字的聚集这将是慢了很多。你可能会考虑
就性能而言,'array_key_exists($ sentence,$ popular)!== true'比'!isset($ popular [$ sentence])'慢整个数量级。在这种情况下,功能差异并不重要。 – mattbasta 2010-10-14 03:59:09
@mattbasta:确实。但是,一个数量级更慢?如慢10倍?你有任何显示这些结果的基准吗? – 2010-10-14 09:25:53
我没有什么好用的,但是我有更大阵列(1000多个元素)的经验,'isset'需要50ms以内,'array_key_exists'可能需要300-400ms。 – mattbasta 2010-10-14 14:00:09
林不知道你在找什么类型的答案的,但Laconica:
http://status.net/?source=laconica
是一个开源的Twitter克隆(更简单的版本)。
也许你可以使用代码的一部分,使自己的流行frases?
祝你好运!
真的取决于你要定义为“短语” – 2010-10-13 20:31:43
如何胶合二/三/四言联到一个什么呢?它仍然是O(n)。 – 2010-10-13 20:34:36
我不认为你会发现对计算器几行代码你的答案..这个问题是一个命题科目可能与网络语义 – pleasedontbelong 2010-10-13 20:43:23