算法介绍

最近要做领域概念的提取,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算法虽然很经典,但还是有许多不足,不能单独依赖其结果做出判断。很多论文提出了改进方法,本文只是实现了最基本的算法。如果有其他思路和想法欢迎讨论。

文章转载自http://www.cnblogs.com/justcooooode  没课割绿地 的博客

Java实现TFIDF算法

算法介绍 最近要做领域概念的提取,TFIDF作为一个很经典的算法可以作为其中的一步处理. 关于TFIDF算法的介绍可以参考这篇博客http://www.ruanyifeng.com/blog/2013 ...

NLP自然语言处理中的hanlp分词实例

本篇分享的依然是关于hanlp的分词使用,文章内容分享自 gladosAI 的博客,本篇文章中提出了一个问题,hanlp分词影响了实验判断结果.为何会如此,不妨一起学习一下 gladosAI 的这篇文 ...

Java-Runoob-高级教程-实例-方法:03&period; Java 实例 – 汉诺塔算法-un

ylbtech-Java-Runoob-高级教程-实例-方法:03. Java 实例 – 汉诺塔算法 1.返回顶部 1. Java 实例 - 汉诺塔算法  Java 实例 汉诺塔(又称河内塔)问题是源 ...

基于结构化平均感知机的分词器Java实现

基于结构化平均感知机的分词器Java实现 作者:hankcs 最近高产似母猪,写了个基于AP的中文分词器,在Bakeoff-05的MSR语料上F值有96.11%.最重要的是,只训练了5个迭代:包含语料 ...

吴裕雄--天生自然HADOOP操作实验学习笔记:tf-idf算法

实验目的 通过实验了解tf-idf算法原理 通过实验了解mapreduce的更多组件 学会自定义分区,读写缓存文件 了解mapreduce程序的设计方法 实验原理 1.TF-IDF简介 TF-IDF( ...

HanLP分词命名实体提取详解

HanLP分词命名实体提取详解   分享一篇大神的关于hanlp分词命名实体提取的经验文章,文章中分享的内容略有一段时间(使用的hanlp版本比较老),最新一版的hanlp已经出来了,也可以去看看新版 ...

HanLP分词研究

这篇文章主要是记录HanLP标准分词算法整个实现流程. HanLP的核心词典训练自人民日报2014语料,语料不是完美的,总会存在一些错误.这些错误可能会导致分词出现奇怪的结果,这时请打开调试模式排查问 ...

hanlp分词工具应用案例:商品图自动推荐功能的应用

本篇分享一个hanlp分词工具应用的案例,简单来说就是做一图库,让商家轻松方便的配置商品的图片,最好是可以一键完成配置的. 先看一下效果图吧: 商品单个推荐效果:匹配度高的放在最前面 这个想法很好,那 ...

Java常用排序算法&plus;程序员必须掌握的8大排序算法&plus;二分法查找法

Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...

随机推荐

python常用模块

os模块 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd os ...

js 数组&comma;字符串&comma;json互相转换

数组转字符串 var arr = [1,2,3,4,'巴德','merge']; var str = arr.join(','); console.log(str); // 1,2,3,4,巴德,me ...

iOS - 发送邮件

IOS系统框架提供的两种发送Email的方法:openURL 和 MFMailComposeViewController.借助这两个方法,我们可以轻松的在应用里加入如用户反馈这类需要发送邮件的功能. ...

OGRE插件设计-Texture与GLTexture

背景: 学习OGRE,在OGRE中 Core是最小的精简逻辑集合,而真正的功能则需要插件来实现,但是作为插件应该与Core保持最小的连接,同时Core不会调用插件的接口,而动态链接库又不能直接把类连接 ...

paip&period;tree 生成目录树到txt后的折叠查看

paip.tree 生成目录树到txt后的折叠查看 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn.ne ...

Jmeter 新手

转载:http://www.cnblogs.com/TankXiao/p/4059378.html 什么是压力测试 顾名思义:压力测试,就是  被测试的系统,在一定的访问压力下,看程序运行是否稳定/服 ...

PN结加正向偏置电压 其空间电荷区为何变窄

理论基础:导体是内部具有较多可以自由移动的电荷的物体. 绝缘体是内部没有或者有很少可以自由移动的电荷的物体. +代表空穴带正电 -代表电子带负电 两竖线之间表示无自由移动电子或空穴部分,相当于绝缘体 ...

CSS中默认被继承的属性

在CSS中,所有属性都可以被继承,只需要显式的设置属性值为inherit即可.如果不设置该属性,CSS大部分属性默认不会从父元素继承而是设置初始值(initial value),但是有一部分属性,默认 ...

Your branch is ahead of &&num;39&semi;origin&sol;master&&num;39&semi; by 2 commits&period;

遇到这种问题,表示在你之前已经有2个commit而没有push到远程分支上,所以需要先git push origin **将本地分支提到远程仓库.也可以直接git reset --hard HEAD~ ...

&lbrack;SDOI2015&rsqb; 寻宝游戏

传送门:>Here< 题意:给出一棵树(有边权),刚开始键值全部为0.每次对其中一个键值进行异或,问每一次修改之后:选择任意一个点出发走到所有为1的点再走回来的最短路 解题思路 由于N,M ...

java hanlp分词_Hanlp分词实例:Java实现TFIDF算法相关推荐

  1. java综合案例_综合实例 - Java House - BlogJava

    packagebedeck; publicclassBedeckDome { /* * 实例变量 * */ //类中不能实例化对象 publicStringstr1;//无初始值,可以被任何类访问 p ...

  2. Java.io.File.getPath()方法实例

    转载自  Java.io.File.getPath()方法实例 java.io.File.getPath() 方法将抽象路径名到路径名字符串.为了分离名称的序列所产生的字符串使用默认名称分隔符. 声明 ...

  3. workflow java_workflow java实现的activity工作流实例 Develop 238万源代码下载- www.pudn.com...

    文件名称: workflow下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 134 KB 上传时间: 2014-09-18 下载次数: 3 提 供 者: 张华 详 ...

  4. Hanlp分词实例:Java实现TFIDF算法

    2019独角兽企业重金招聘Python工程师标准>>> 算法介绍 最近要做领域概念的提取,TFIDF作为一个很经典的算法可以作为其中的一步处理. 关于TFIDF算法的介绍可以参考这篇 ...

  5. Java培训学习之分词工具之HanLP介绍

    HanLP 是由一系列模型和算法组成的Java工具包.目标是普及自然语言处理在生产环境中的应用.它不仅是分词,还提供了词法分析.句法分析.语义理解等完整的功能.HanLP 具有功能齐全.性能高效.结构 ...

  6. ictclas4j java_ictclas4j 中科院中文分词系统完成的java源码,能很好的实现 的 ,为文本挖掘提供基础。 Develop 238万源代码下载- www.pudn.com...

    文件名称: ictclas4j下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 6617 KB 上传时间: 2013-12-06 下载次数: 4 提 供 者: 黄倩 ...

  7. java调用solr的分词查询结果

    java调用solr的分词查询结果 https://www.jianshu.com/p/cb4cc151d23c

  8. 【原创】中文分词系统 ICTCLAS2015 的JAVA封装和多线程执行(附代码)

    本文针对的问题是 ICTCLAS2015 的多线程分词,为了实现多线程做了简单的JAVA封装.如果有需要可以自行进一步封装其它接口. 首先ICTCLAS2015的传送门(http://ictclas. ...

  9. java 调用 ictclas50_中科院分词ICTCLAS5.0_JNI 使用方法

    1.简介 中国科学院计算技术研究所在多年研究基础上,耗时一年研制出了基于多层隐码模型的汉语词法分析系统 ICTCLAS(Institute of Computing Technology, Chine ...

最新文章

  1. Spring Cloud微服务版本灰度发布新神器
  2. oracle数据库定时任务
  3. 嵌入式开发笔记-存储控制器
  4. Vue 兼容 ie9 的全面解决方案
  5. js画布组件(canvas/canvas)
  6. java和python哪个好就业2020-python和java自学哪个好?
  7. JS函数表达式——函数递归、闭包
  8. python开发自动化创建一个任务下发到手机_如何利用Fabric自动化你的任务
  9. Go并发编程里的数据竞争以及解决之道
  10. 我被产品小姐姐的笔记本深深吸引了....
  11. 艾伟:自己实现memcached客户端库
  12. mathematica 如何在数组中等间隔插入元素
  13. 创建一个超链接,点击这个超链接,显示数据库中的数据信息:MVC模式查询
  14. 超全面!完全没有设计基础的新手如何做好PPT配色?(附神器)
  15. 绕过cdn探测真实ip方法大全
  16. T9 PDF如何转存为高清图片
  17. 免费开源网管软件cacti,nagios,zabbix,WeADMIN ITOSS亲测分享
  18. win10 修改c盘用户文件夹名称
  19. mysql存特殊符号失败_mysql存储符号表情失败
  20. 心碎的图案怎么用c语言编出来,教案实验2用c语言编写简单程序.doc

热门文章

  1. 数据结构算法 二进制转十进制_数据结构 - 栈
  2. 来,看看这20个常用的宏定义!
  3. 计算机发展最新趋势素材,计算机方面论文范文素材,与关于计算机科学与技术的趋势探究相关论文网...
  4. python从入门到实践笔记_Python编程 从入门到实践 #笔记#
  5. c语言将一个已知头结点的单链表逆序_C语言实现单链表逆序与逆序输出实例
  6. java jmf 视屏监控的核心代码_JMF(Java Media Framework)使用摄像头
  7. python小括号表示什么数据类型_Python3中小括号()、中括号[]、花括号{}的区别详解...
  8. 移动端去除横向滚动条
  9. 第4课 - 深入浅出处理器(续)
  10. android 通过webview调起支付宝app支付