Php 如何从大量文本中获取最流行的短语?

Php 如何从大量文本中获取最流行的短语?,php,Php,我正在为我的论坛设置一个Twitter风格的“趋势话题”框。我已经有了最流行的/words/,但我甚至不能像推特那样开始思考如何获得流行短语 就目前情况而言,我只是将最后200篇帖子的所有内容整理成一个字符串,然后将它们拆分成单词,然后根据使用最多的单词进行排序。如何将最流行的单词转换为最流行的短语?与其拆分单个单词,不如拆分单个短语,就这么简单 $popular = array(); foreach ($tweets as $tweet) { // split by common p

我正在为我的论坛设置一个Twitter风格的“趋势话题”框。我已经有了最流行的/words/,但我甚至不能像推特那样开始思考如何获得流行短语


就目前情况而言,我只是将最后200篇帖子的所有内容整理成一个字符串,然后将它们拆分成单词,然后根据使用最多的单词进行排序。如何将最流行的单词转换为最流行的短语?

与其拆分单个单词,不如拆分单个短语,就这么简单

$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>';
$popular=array();
foreach($tweets作为$tweet)
{
//按常用标点字符分割
$SESSIONS=preg_split(“~[.!?]+~”,$string);
foreach($句子作为$句子)
{
$SENTION=strtolower(修剪($SENTION));//规范化句子
if(isset($popular[$句子])==false)
//如果(数组\u键\u存在($句子,$popular)==false)
{
$popular[$句子]=0;
}
$popular[$句子]++;
}
}
阿索特(受欢迎);
回声';
印刷(流行);
回声';

如果你把一个短语看成是n个连续单词的集合,那就会慢很多。

你可以考虑的一个技巧是在ReDIS中使用ZStAs来做类似的事情。如果你有非常大的数据集,你会发现你可以这样做:

// Assume $r is instantiated like it is above
$trending_phrases = $r->zReverseRange("trending_phrases", 0, 10);
$trending_短语
将是前十大趋势短语的数组。要做一些事情,比如最近的趋势短语(而不是一组持久的全局短语),请复制上面所有的Redis交互。对于每次交互,使用一个指示今天时间戳和明天时间戳(即:自1970年1月1日起的天数)的键。使用
$trending\u phrases
检索结果时,只需检索今天和明天(或昨天)的键,并使用
array\u merge
array\u unique
查找联合


希望这有帮助

我不确定你在寻找什么类型的答案,但拉科妮卡:

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

也许你可以用部分代码来制作你自己的流行服装


祝你好运

这取决于你将如何定义“短语”,把两个/三个/四个单词粘在一起怎么样?它仍然是O(n)。我不认为你会在stackoverflow的几行代码中找到答案。。这个问题可能是一个与web相关的论文主题semantics@pleasedontbelong虽然我不认为这是一个NP完全问题,但对一个文本块执行简单的“暴力”分析肯定没有那么复杂。就性能而言,
array\u key\u存在($句子,$popular)!=真的
慢整整一个数量级!isset($popular[$句子])
。在这种情况下,功能上的差异并不重要。@mattbasta:的确如此。但是,要慢一个数量级?就像10倍慢?你有没有显示这些结果的基准测试?我手头没有,但我有过使用大型阵列(1000多个元素)的经验,
isset
将在50ms内使用,
array\u key\u存在时
可能需要300-400ms。@mattbasta:我认为这是一个老问题,尽管
isset()
仍然比
array\u key\u exists()快。
差别并不是那么明显。无论如何,我回家后会运行一些基准测试;看起来(正如您所说)对于较新版本的PHP,这并不是什么大问题
array\u key\u exists
大约慢20%,但在一些更极端的情况下,这只相当于大约10毫秒。
// Assume $r is instantiated like it is above
$trending_phrases = $r->zReverseRange("trending_phrases", 0, 10);