java 向量相似度计算 tf-idf_文本相似度——基于TF-IDF与余弦相似性

本篇博客,主要是描述一种计算文本相似度的算法,基于TF-IDF算法和余弦相似性。算法的描述请务必看阮一峰的博客,不然看不懂本篇博客,地址:

在这里,主要讨论具体的代码的实现。过程如下:

使用TF-IDF算法,找出两篇文章的关键词;

每篇文章各取出若干个关键词(比如20个),合并成一个集合,计算每篇文章对于这个集合中的词的词频(为了避免文章长度的差异,可以使用相对词频);

生成两篇文章各自的词频向量;

计算两个向量的余弦相似度,值越大就表示越相似。

首先,请看此算法代码的文件结构:

09d78f264dabfd1e205440edb23d2d62.png

接下来,是算法的实现步骤:

第一步:使用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()

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值