本篇博客,主要是描述一种计算文本相似度的算法,基于TF-IDF算法和余弦相似性。算法的描述请务必看阮一峰的博客,不然看不懂本篇博客,地址:
在这里,主要讨论具体的代码的实现。过程如下:
使用TF-IDF算法,找出两篇文章的关键词;
每篇文章各取出若干个关键词(比如20个),合并成一个集合,计算每篇文章对于这个集合中的词的词频(为了避免文章长度的差异,可以使用相对词频);
生成两篇文章各自的词频向量;
计算两个向量的余弦相似度,值越大就表示越相似。
首先,请看此算法代码的文件结构:
接下来,是算法的实现步骤:
第一步:使用TF-IDF算法,找出两篇文章的关键词
/**
* (1)使用TF-IDF算法,找出两篇文章的关键词;
*
* @param uri
* 待比较的文本的路径
* @return 文本被分词后,词的ELementSet集合
* @throws IOException
*/
private static ElementSet getKeyTerms(String uri) throws IOException {
// 分词后,获得ElementMap集合
ElementMap em = null;
String text = Utils.readText(uri);
em = Utils.tokenizer(text);
ElementSet es = em.getElementSetOrderbyTf();
// 计算tf、idf和tf_idf的值
Double de = (double) ConnectKit.countTatolFromTerm("的")+1;
for (Element e : es.getElementSet()) {
// 计算tf
Double tf = e.getTf() / es.getElementSet().size();
e.setTf(tf);
// 计算idf
Double num = (double) ConnectKit.countTatolFromTerm(e.getTerm());
Double idf = Math.log10(de / (num+1));
e.setIdf(idf);
// 计算tf_idf
Double tf_idf = tf * idf;
e.setTf_idf(tf_idf);
}
// 将排序的依据更改为tf_idf
es.orderbyTf_idf();
System.out.println("第一步:计算词的tf、idf和tf_idf");
for (Element e : es.getElementSet()) {
System.out.println(e.getTerm() + "---tf:" + e.getTf() + "---idf:" + e.getIdf()