写好了分词的基本算法, 让我们看看他的基本应用吧-----如何比较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;
}
}
太晚了, 明天继续写, 哈哈。
看上面的公式, 如何计算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;
}
}
太晚了, 明天继续写, 哈哈。