自然语言处理系列三十七》词频-逆文档频率TF-IDF》Java代码实现
注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】
文章目录
- 自然语言处理系列三十七
- Java代码实现词频-逆文档频率(TF-IDF)
- TF-IDF的Python代码实现
- 总结
自然语言处理系列三十七
Java代码实现词频-逆文档频率(TF-IDF)
上篇文章讲了算法原理,这篇文章通过Java实现TF-IDF,再下一篇文章使用Python代码实现。
TF-IDF基于Java实现如代码9.1所示。
【代码9.1】 TfIdfDemo.java
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 充电了么 - 陈敬雷* 充电了么 - 专注上班族职业培训提升职业能力充电学习的在线教育平台* 词频-逆文档频率(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<String, Integer> containsKeyMap = new HashMap<>();// 每个领域的总文档数Map<String, Integer> totalDocMap = new HashMap<>();// TF = 候选词出现次数/总词数Map<String, Double> 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*IDFfor (File f : files) {// 其他领域包含候选词文档数int otherContainsKeyDoc = 0;// 其他领域文档总数int otherTotalDoc = 0;double idf = 0;double tfidf = 0;System.out.println("~~~~~" + f.getName() + "~~~~~");Set<Map.Entry<String, Integer>> containsKeyset = containsKeyMap.entrySet();Set<Map.Entry<String, Integer>> totalDocset = totalDocMap.entrySet();Set<Map.Entry<String, Double>> tfSet = tfMap.entrySet();// 计算其他领域包含候选词文档数for (Map.Entry<String, Integer> entry : containsKeyset) {if (!entry.getKey().equals(f.getName())) {otherContainsKeyDoc += entry.getValue();}}// 计算其他领域文档总数for (Map.Entry<String, Integer> entry : totalDocset) {if (!entry.getKey().equals(f.getName())) {otherTotalDoc += entry.getValue();}}// 计算idfidf = log((float) otherTotalDoc / (otherContainsKeyDoc + 1), 2);// 计算tf*idf并输出for (Map.Entry<String, Double> 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));}
}
TF-IDF的Python代码实现
下一篇文章详细介绍Python实现TF-IDF,敬请关注!
总结
此文章有对应的配套新书教材和视频:
【配套新书教材】
《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】
新书特色:本书从自然语言处理基础开始,逐步深入各种NLP热点前沿技术,使用了Java和Python两门语言精心编排了大量代码实例,契合公司实际工作场景技能,侧重实战。
全书共分为19章,详细讲解中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注、文本相似度算法、语义相似度计算、词频-逆文档频率(TF-IDF)、条件随机场、新词发现与短语提取、搜索引擎Solr Cloud和Elasticsearch、Word2vec词向量模型、文本分类、文本聚类、关键词提取和文本摘要、自然语言模型(Language Model)、分布式深度学习实战等内容,同时配套完整实战项目,例如对话机器人实战、搜索引擎项目实战、推荐算法系统实战。
本书理论联系实践,深入浅出,知识点全面,通过阅读本书,读者不仅可以理解自然语言处理的知识,还能通过实战项目案例更好地将理论融入实际工作中。
【配套视频】
自然语言处理NLP原理与实战 视频教程【陈敬雷】
视频特色:《自然语言处理NLP原理与实战》包含了互联网公司前沿的热门算法的核心原理,以及源码级别的应用操作实战,直接讲解自然语言处理的核心精髓部分,自然语言处理从业者或者转行自然语言处理者必听视频!
上一篇:自然语言处理系列三十六》词频-逆文档频率TF-IDF算法原理
下一篇:自然语言处理系列三十八》词频-逆文档频率TF-IDF》Python代码实现
