有一组非日常的英文词汇,我需要计算在英文文章中出现频次最多的。
于是我最初想到遍历数组,用 substr_count 依次计算每个词汇出现的次数,但这样就会造成对整篇文章多次重复的扫描。或者将文章也拆分成词汇,从中用数组函数计算交集数量,但依然觉得不理想。各位有什么想法吗?这个应用其实也就是关键词提取。

解决方案 »

  1.   

    拆成数组为何不好,英文入数组很方便啊,起码比中文简单多了
    其实不太明白你的需求,纯粹统计 array_count_values 足够方便了
      

  2.   

    就是说你已经有了一个词库,现在需要在文章里检查词库词的出现次数
    如果是的,那么可以使用 trie 算法(我发过的)
    只需扫描文章一遍就可以了,当然要先构造词库
      

  3.   


    词库保存为什么格式比较好?mysql,json,xml,纯数组?如果一篇文章有5kb,词库有1000个单词,那么把这1000个单词逐个foreach,匹配这篇文章,mysql_query,
    json_decode()
    simplexml_load_file()
    数组哪个效率更高,更节省资源(CPU,RAM)?
      

  4.   

    5kb不太可能有1000个单词,全部都是冠词?即使1000个,量也不算很大,去除重复应该就少很多了,一次数组交集就够了我的思路是文章拆分为单词数组,array_count_values 就起到统计和去除重复两个功能
    然后提取次数一定的部分(次数太少没匹配意义吧?),那剩下就很少了,再与现存词库求交集就足够了
      

  5.   

    一个简单的例子include 'TTrie.php';class wordkey extends TTrie {
      function b() {
        $t = array_pop($this->buffer);
        $this->buffer[] = "<b>$t</b>";
      }
    }
    $p = new wordkey;
    $p->set('秦始皇', 'b');
    $p->set('洛阳', 'b');
    $t = $p->match('秦始皇东巡洛阳');
    echo join('', $t);
    <b>秦始皇</b>东巡<b>洛阳</b>