分词的算法的实践---文档聚合

写好了分词的基本算法, 让我们看看他的基本应用吧-----如何比较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;
            }
        }


太晚了, 明天继续写, 哈哈。


你可能感兴趣的:(html,数据结构,算法,Google,D语言)