tf idf java实现_自然语言处理系列二》Java代码实现TF-IDF

该博客展示了如何使用Java编程实现TF-IDF算法。通过读取语料库文件,计算候选词在每个领域的词频、总文档数、总词数,并最终计算TF-IDF值。示例代码详细解释了每个步骤,适用于自然语言处理和信息检索场景。
摘要由CSDN通过智能技术生成

package com.chongdianleme.job;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileReader;

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

/**

* Created by 充电了么App - 陈敬雷

* 充电了么App官网:http://chongdianleme.com/

* 充电了么App - 专注上班族职业技能提升充电学习的在线教育平台

* 词频-逆文档频率(TF-IDF)

*/

public class TfIdfDemo {

public static void main(String[] args) throws Exception {

String str = "充电了么App"; // 要计算的候选词

String path = "D:\\充电了么TFIDF"; // 语料库路径

computeTFIDF(path, str);

}

/**

* @param @param path 语料路经

* @param @param word 候选词

* @param @throws Exception

* @return void

*/

static void computeTFIDF(String path, String word) throws Exception {

File fileDir = new File(path);

File[] files = fileDir.listFiles();

// 每个领域出现候选词的文档数

Map containsKeyMap = new HashMap<>();

// 每个领域的总文档数

Map totalDocMap = new HashMap<>();

// TF = 候选词出现次数/总词数

Map tfMap = new HashMap<>();

// 扫描目录下的文件

for (File f : files) {

// 候选词词频

double termFrequency = 0;

// 文本总词数

double totalTerm = 0;

// 包含候选词的文档数

int containsKeyDoc = 0;

// 词频文档计数

int totalCount = 0;

int fileCount = 0;

// 标记文件中是否出现候选词

boolean flag = false;

FileReader fr = new FileReader(f);

BufferedReader br = new BufferedReader(fr);

String s = "";

// 计算词频和总词数

while ((s = br.readLine()) != null) {

if (s.equals(word)) {

termFrequency++;

flag = true;

}

// 文件标识符

if (s.equals("$$$")) {

if (flag) {

containsKeyDoc++;

}

fileCount++;

flag = false;

}

totalCount++;

}

// 减去文件标识符的数量得到总词数

totalTerm += totalCount - fileCount;

br.close();

// key都为领域的名字

containsKeyMap.put(f.getName(), containsKeyDoc);

totalDocMap.put(f.getName(), fileCount);

tfMap.put(f.getName(), (double) termFrequency / totalTerm);

System.out.println("----------" + f.getName() + "----------");

System.out.println("该领域文档数:" + fileCount);

System.out.println("候选词出现词数:" + termFrequency);

System.out.println("总词数:" + totalTerm);

System.out.println("出现候选词文档总数:" + containsKeyDoc);

System.out.println();

}

//计算TF*IDF

for (File f : files) {

// 其他领域包含候选词文档数

int otherContainsKeyDoc = 0;

// 其他领域文档总数

int otherTotalDoc = 0;

double idf = 0;

double tfidf = 0;

System.out.println("~~~~~" + f.getName() + "~~~~~");

Set> containsKeyset = containsKeyMap.entrySet();

Set> totalDocset = totalDocMap.entrySet();

Set> tfSet = tfMap.entrySet();

// 计算其他领域包含候选词文档数

for (Map.Entry entry : containsKeyset) {

if (!entry.getKey().equals(f.getName())) {

otherContainsKeyDoc += entry.getValue();

}

}

// 计算其他领域文档总数

for (Map.Entry entry : totalDocset) {

if (!entry.getKey().equals(f.getName())) {

otherTotalDoc += entry.getValue();

}

}

// 计算idf

idf = log((float) otherTotalDoc / (otherContainsKeyDoc + 1), 2);

// 计算tf*idf并输出

for (Map.Entry entry : tfSet) {

if (entry.getKey().equals(f.getName())) {

tfidf = (double) entry.getValue() * idf;

System.out.println("tfidf:" + tfidf);

}

}

}

}

static float log(float value, float base) {

return (float) (Math.log(value) / Math.log(base));

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值