分詞的算法的實踐---文檔聚合

寫好了分詞的基本算法, 讓我們看看他的基本應用吧-----如何比較2個文本的相似程度。大家先看下, google 吳軍的科普文章(http://www.googlechinablog.com/2006/07/12.html , http://googlechinablog.com/2006/06/blog-post_27.html )。 很有意思的文章。不過還是很簡單, 不足夠實現代碼。


看上面的公式, 如何計算TF/IDF. 仔細體會下這個公式, 是不是上面公式的翻啊, 哈哈。。。。

        Map<Integer, Word> src = (Map<Integer, Word>) srcDoc.getData();
        Map<Integer, Word> dest = (Map<Integer, Word>) destDoc.getData();
        Word w1, w2;

        double tf = 0;
        double idf_x = 0;
        double idf_y = 0;
        double count = 0;
        Set<Integer> set = src.keySet().size() > dest.keySet().size() ? dest.keySet() : src.keySet();
        for (Integer i : set) {
            w1 = src.get(i);
            if (w1 != null) {
                w2 = dest.get(i);
                if (w2 != null) {
                    tf += w1.eigenvalue * w2.eigenvalue; // d1*c1
                    idf_x += w1.eigenvalue * w1.eigenvalue; // |d1|
                    idf_y += w2.eigenvalue * w2.eigenvalue;// |c1|
                    count += 1;
                }
            }
        }      
        idf_x = Math.sqrt(idf_x);
        idf_y = Math.sqrt(idf_y);
        return (tf / (idf_x * idf_y));
  
這個代碼其他參數可以,或者數據結構,你都不用關心, w.eigenvalue     你肯定很關心這個值是怎麼得到的。這是個分詞後得到的一種特徵值。 該詞根據統計語言模型計算出來的一個值。 其實是個詞的信息熵。   TF/IDF也是一個信息熵。不過是2個文本的差異。 特徵值得計算:(如何來的, 可以去查看一些資料, 不列覺了)

        double n1, n2;
        for (Word w : words) {
            if (w.position != -1) {
                n1 = (double) w.frequency / (double) textLen;
                n2 = Math.abs(Math.log(((double) D) / ((double) w.dicFrequency)));
                w.eigenvalue = n1 * n2;
            }
        }


太晚了, 明天繼續寫, 哈哈。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章