java tfidf_Java实现TFIDF算法

packageedu.heu.lawsoutput;importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.File;importjava.io.FileReader;importjava.io.FileWriter;importjava.util.HashMap;importjava.util.Map;importjava.util.Set;/*** @ClassName: TfIdf

* @Description: TODO

*@authorLJH

* @date 2017年11月12日 下午3:55:15*/

public classTfIdf {static final String PATH = "E:\\corpus"; //语料库路径

public static void main(String[] args) throwsException {

String test= "离退休人员"; //要计算的候选词

computeTFIDF(PATH, test);

}/***@param @parampath 语料路经

*@param @paramword 候选词

*@param @throwsException

*@returnvoid*/

static void computeTFIDF(String path, String word) throwsException {

File fileDir= newFile(path);

File[] files=fileDir.listFiles();//每个领域出现候选词的文档数

Map containsKeyMap = new HashMap<>();//每个领域的总文档数

Map totalDocMap = new HashMap<>();//TF = 候选词出现次数/总词数

Map tfMap = new HashMap<>();//scan files

for(File f : files) {//候选词词频

double termFrequency = 0;//文本总词数

double totalTerm = 0;//包含候选词的文档数

int containsKeyDoc = 0;//词频文档计数

int totalCount = 0;int fileCount = 0;//标记文件中是否出现候选词

boolean flag = false;

FileReader fr= newFileReader(f);

BufferedReader br= newBufferedReader(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.Entryentry : containsKeyset) {if (!entry.getKey().equals(f.getName())) {

otherContainsKeyDoc+=entry.getValue();

}

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

for (Map.Entryentry : totalDocset) {if (!entry.getKey().equals(f.getName())) {

otherTotalDoc+=entry.getValue();

}

}//计算idf

idf = log((float) otherTotalDoc / (otherContainsKeyDoc + 1), 2);//计算tf*idf并输出

for (Map.Entryentry : tfSet) {if(entry.getKey().equals(f.getName())) {

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

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

}

}

}

}static float log(float value, floatbase) {return (float) (Math.log(value) /Math.log(base));

}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值