java tfidf_Hanlp分词实例:Java实现TFIDF算法
算法介绍
最近要做领域概念的提取,
TFIDF
作为一个很经典的算法可以作为其中的一步处理。
关于
TFIDF
算法的介绍可以参考这篇博客
http://www.ruanyifeng.com/blog/2013/03/tf-idf.html
。
计算公式比较简单,如下:
预处理
由于需要处理的候选词大约后
3w+
,并且语料文档数有
1w+
,直接挨个文本遍历的话很耗时,每个词处理时间都要一分钟以上。
为了缩短时间,首先进行分词,一个词输出为一行方便统计,分词工具选择的是
HanLp
。
然后,将一个领域的文档合并到一个文件中,并用
“$$$”
标识符分割,方便记录文档数。
下面是选择的领域语料(
PATH
目录下):
代码实现
package edu.heu.lawsoutput;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @ClassName: TfIdf
* @Description: TODO
* @author LJH
* @date 2017
年
11
月
12
日 下午
3:55:15
*/
public class TfIdf {
static final String PATH = "E:\\corpus"; //
语料库路径
public static void main(String[] args) throws Exception {
String test = "
离退休人员
"; //
要计算的候选词
computeTFIDF(PATH, test);
}
/**
* @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<>();
// 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 = 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));
}
}
运行结果
测试词为
“
离退休人员
”
,中间结果如下:
最终结果:
结论
可以看到
“
离退休人员
”
在养老保险和社保领域,
tfidf
值比较高,可以作为判断是否为领域概念的一个依据。当然
TF-IDF
算法虽然很经典,但还是有许多不足,不能单独依赖其结果做出判断。很多论文提出了改进方法,本文只是实现了最基本的算法。如果有其他思路和想法欢迎讨论。
java tfidf_Hanlp分词实例:Java实现TFIDF算法相关推荐
- java正则表达式 分词_[Java]使用正则表达式实现分词
手工分词稍嫌麻烦,不好维护,而利用正则表达式就利索多了.Java提供了java.util.regex.Matcher,java.util.regex.Pattern类来帮助我们实现此功能. 例一:以下 ...
- java反射经典实例 Java Reflection Cookbook
Java提供了一套机制来动态执行方法和构造方法,以及数组操作等,这套机制就叫--反射.反射机制是如今很多流行框架的实现基础,其中包括Spring.Hibernate等.原理性的问题不是本文的重点,接下 ...
- java中jcf实例,java 集合框架(JCF)
Java Collection Framework = java 集合框架 (JCF) 集合可理解为一个容器,该容器主要指映射(map),集合(set),列表(list),散列表(hashtable) ...
- java静态多态实例,java多态
市面上对于多态往往有两种说法,一种是多态是通过方法的重载和方法的重写来实现多态,另外一种是父类型的引用指向子类型的对象或者接口类型的引用指向实现接口的类的实例. 其实两种说法都不全面,首先,要从字面上 ...
- java messagepack_MessagePack解析实例Java
一.MessagePack简介 MessagePack是更快,更小的数据传输格式,类似Json,支持多语言,比如Java ,C,C++ , 可以跨平台.比如可以用于Mqtt协议,在物联网和服务平台通讯 ...
- java中事务实例,Java Spring 事务管理器入门例子教程(TranscationManager)
注:阅读本文之前请务必有上文的基础 本文我们使用的事务管理器(TranscationManager)的作用是保证一组数据库操作的原子性.保证在操作时,如果出现异常,事务管理器会将状态恢复到进行本组操作 ...
- 【Java基础】Java基础100实例
[学习参考资料]:菜鸟教程-Java教程 通过菜鸟教程-Java教程的初步学习,现将其教程训练代码汇聚成篇. 菜鸟教程-Java Coding学习笔记 Applet应用程序实例 文档注释演示实例 序列 ...
- java hanlp分词_Hanlp分词实例:Java实现TFIDF算法
算法介绍 最近要做领域概念的提取,TFIDF作为一个很经典的算法可以作为其中的一步处理. 关于TFIDF算法的介绍可以参考这篇博客http://www.ruanyifeng.com/blog/2013 ...
- Hanlp分词实例:Java实现TFIDF算法
2019独角兽企业重金招聘Python工程师标准>>> 算法介绍 最近要做领域概念的提取,TFIDF作为一个很经典的算法可以作为其中的一步处理. 关于TFIDF算法的介绍可以参考这篇 ...
- Jcseg是基于mmseg算法的一个轻量级Java中文分词器
Jcseg是基于mmseg算法的一个轻量级中文分词器,同时集成了关键字提取,关键短语提取,关键句子提取和文章自动摘要等功能,并且提供了一个基于Jetty的web服务器,方便各大语言直接http调用,同 ...
最新文章
- 201621123068 作业08-集合
- openstack整合ceph
- Spring 5.1.13 和 Spring Boot 2.2.3 发布
- java编写简单计算器_编写java程序简单计算器
- 12 Django cooking与session
- Android 系统(78)---《android framework常用api源码分析》之 app应用安装流程
- 最新版python如何安装qt5_Python3 搭建Qt5 环境的方法示例
- ASA 5520配置failover及双出口
- 数字信号处理实验二 IIR数字滤波器设计及软件实现
- Labelimg图像标注
- photoshop下载教程
- Ubuntu16.04cuda8与cuda10共存,同时使用Tensorflow1.13.1(需重装显卡驱动)
- matlab 求留数,基于MATLAB的留数计算方法的探讨
- 北大AI讲座公开课-精华
- 人力资源管理专业知识与实务(初级)【7】
- 初探前端微服务——single-spa
- 软件测试笔记——3.多种多样的测试类型
- 演讲者模式投影到幕布也看到备注_ppt备注怎么用在放映时怎么可以不在投影仪上显示...
- 基于VMware12虚拟机的Hadoop3.1.2伪分布式安装(含各软件百度云下载地址、安装过程中各类问题的解决方案)
- CTeX 自动化学报模板使用
热门文章
- 【HUSTOJ】1051: 字符图形7-星号菱形
- 计算机中ms-dos什么意思,msdos是什么意思
- 如何用photoshop做24色环_如何用PS做色相环?色相环的制作教程
- oracle静默安装集群,Oracle RAC 静默安装实践
- java applet类开始博饼_厦门中秋博饼程序!(JAVA编写)
- GetWindowRect,GetClientRect,ScreenToClient MoveWindow SetWindowPos 用法说明
- 蓝牙、Wi-Fi音箱音频功放
- GPIO模拟MDC/MDIO协议
- 有关费尔防火墙一书TDI代码“网上邻居”不能访问功能的修复
- duplicate from active dg 的 run 脚本 sfile 为完整配置可能导致的一些错误