TF-IDF理解及其Java实现

TF-IDF

前言

前段时间,又具体看了自己以前整理的TF-IDF,这里把它发布在博客上,知识就是需要不断的重复的,否则就感觉生疏了。

TF-IDF理解

TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与资讯探勘的常用加权技术, TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TFIDF实际上是:TF * IDF,TF词频(Term Frequency),IDF反文档频率(Inverse Document Frequency)。TF表示词条在文档d中出现的频率。IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力。如果某一类文档C中包含词条t的文档数为m,而其它类包含t的文档总数为k,显然所有包含t的文档数n=m + k,当m大的时候,n也大,按照IDF公式得到的IDF的值会小,就说明该词条t类别区分能力不强。但是实际上,如果一个词条在一个类的文档中频繁出现,则说明该词条能够很好代表这个类的文本的特征,这样的词条应该给它们赋予较高的权重,并选来作为该类文本的特征词以区别与其它类文档。这就是IDF的不足之处.

TF公式:

\mathrm{tf_{i,j}} = \frac{n_{i,j}}{\sum_k n_{k,j}}       

以上式子中 n_{i,j} 是该词在文件d_{j}中的出现次数,而分母则是在文件d_{j}中所有字词的出现次数之和。

IDF公式:

\mathrm{idf_{i}} =  \log \frac{|D|}{|\{j: t_{i} \in d_{j}\}|}  

  • |D|:语料库中的文件总数
  • |\{ j: t_{i} \in d_{j}\}|:包含词语t_{i}的文件数目(即n_{i,j} \neq 0的文件数目)如果该词语不在语料库中,就会导致被除数为零,因此一般情况下使用1 + |\{j : t_{i} \in d_{j}\}|

然后

\mathrm{tf{}idf_{i,j}} = \mathrm{tf_{i,j}} \times  \mathrm{idf_{i}}

TF-IDF案例

案例:假如一篇文件的总词语数是100个,而词语“母牛”出现了3次,那么“母牛”一词在该文件中的词频就是3/100=0.03。一个计算文件频率 (DF) 的方法是测定有多少份文件出现过“母牛”一词,然后除以文件集里包含的文件总数。所以,如果“母牛”一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是 lg(10,000,000 / 1,000)=4。最后的TF-IDF的分数为0.03 * 4=0.12。

TF-IDF实现(Java)

这里采用了外部插件IKAnalyzer-2012.jar,用其进行分词,插件和测试文件可以从这里下载点击

具体代码如下:

package tfidf;import java.io.*;
import java.util.*;import org.wltea.analyzer.lucene.IKAnalyzer;public class ReadFiles {/*** @param args*/    private static ArrayList<String> FileList = new ArrayList<String>(); // the list of file//get list of file for the directory, including sub-directory of itpublic static List<String> readDirs(String filepath) throws FileNotFoundException, IOException{try{File file = new File(filepath);if(!file.isDirectory()){System.out.println("输入的[]");System.out.println("filepath:" + file.getAbsolutePath());}else{String[] flist = file.list();for(int i = 0; i < flist.length; i++){File newfile = new File(filepath + "\\" + flist[i]);if(!newfile.isDirectory()){FileList.add(newfile.getAbsolutePath());}else if(newfile.isDirectory()) //if file is a directory, call ReadDirs
                    {readDirs(filepath + "\\" + flist[i]);}                    }}}catch(FileNotFoundException e){System.out.println(e.getMessage());}return FileList;}//read filepublic static String readFile(String file) throws FileNotFoundException, IOException{StringBuffer strSb = new StringBuffer(); //String is constant, StringBuffer can be changed.InputStreamReader inStrR = new InputStreamReader(new FileInputStream(file), "gbk"); //byte streams to character streamsBufferedReader br = new BufferedReader(inStrR); String line = br.readLine();while(line != null){strSb.append(line).append("\r\n");line = br.readLine();    }return strSb.toString();}//word segmentationpublic static ArrayList<String> cutWords(String file) throws IOException{ArrayList<String> words = new ArrayList<String>();String text = ReadFiles.readFile(file);IKAnalyzer analyzer = new IKAnalyzer();words = analyzer.split(text);return words;}//term frequency in a file, times for each wordpublic static HashMap<String, Integer> normalTF(ArrayList<String> cutwords){HashMap<String, Integer> resTF = new HashMap<String, Integer>();for(String word : cutwords){if(resTF.get(word) == null){resTF.put(word, 1);System.out.println(word);}else{resTF.put(word, resTF.get(word) + 1);System.out.println(word.toString());}}return resTF;}//term frequency in a file, frequency of each wordpublic static HashMap<String, Float> tf(ArrayList<String> cutwords){HashMap<String, Float> resTF = new HashMap<String, Float>();int wordLen = cutwords.size();HashMap<String, Integer> intTF = ReadFiles.normalTF(cutwords); Iterator iter = intTF.entrySet().iterator(); //iterator for that get from TFwhile(iter.hasNext()){Map.Entry entry = (Map.Entry)iter.next();resTF.put(entry.getKey().toString(), Float.parseFloat(entry.getValue().toString()) / wordLen);System.out.println(entry.getKey().toString() + " = "+  Float.parseFloat(entry.getValue().toString()) / wordLen);}return resTF;} //tf times for filepublic static HashMap<String, HashMap<String, Integer>> normalTFAllFiles(String dirc) throws IOException{HashMap<String, HashMap<String, Integer>> allNormalTF = new HashMap<String, HashMap<String,Integer>>();List<String> filelist = ReadFiles.readDirs(dirc);for(String file : filelist){HashMap<String, Integer> dict = new HashMap<String, Integer>();ArrayList<String> cutwords = ReadFiles.cutWords(file); //get cut word for one file
            dict = ReadFiles.normalTF(cutwords);allNormalTF.put(file, dict);}    return allNormalTF;}//tf for all filepublic static HashMap<String,HashMap<String, Float>> tfAllFiles(String dirc) throws IOException{HashMap<String, HashMap<String, Float>> allTF = new HashMap<String, HashMap<String, Float>>();List<String> filelist = ReadFiles.readDirs(dirc);for(String file : filelist){HashMap<String, Float> dict = new HashMap<String, Float>();ArrayList<String> cutwords = ReadFiles.cutWords(file); //get cut words for one file
            dict = ReadFiles.tf(cutwords);allTF.put(file, dict);}return allTF;}public static HashMap<String, Float> idf(HashMap<String,HashMap<String, Float>> all_tf){HashMap<String, Float> resIdf = new HashMap<String, Float>();HashMap<String, Integer> dict = new HashMap<String, Integer>();int docNum = FileList.size();for(int i = 0; i < docNum; i++){HashMap<String, Float> temp = all_tf.get(FileList.get(i));Iterator iter = temp.entrySet().iterator();while(iter.hasNext()){Map.Entry entry = (Map.Entry)iter.next();String word = entry.getKey().toString();if(dict.get(word) == null){dict.put(word, 1);}else {dict.put(word, dict.get(word) + 1);}}}System.out.println("IDF for every word is:");Iterator iter_dict = dict.entrySet().iterator();while(iter_dict.hasNext()){Map.Entry entry = (Map.Entry)iter_dict.next();float value = (float)Math.log(docNum / Float.parseFloat(entry.getValue().toString()));resIdf.put(entry.getKey().toString(), value);System.out.println(entry.getKey().toString() + " = " + value);}return resIdf;}public static void tf_idf(HashMap<String,HashMap<String, Float>> all_tf,HashMap<String, Float> idfs){HashMap<String, HashMap<String, Float>> resTfIdf = new HashMap<String, HashMap<String, Float>>();int docNum = FileList.size();for(int i = 0; i < docNum; i++){String filepath = FileList.get(i);HashMap<String, Float> tfidf = new HashMap<String, Float>();HashMap<String, Float> temp = all_tf.get(filepath);Iterator iter = temp.entrySet().iterator();while(iter.hasNext()){Map.Entry entry = (Map.Entry)iter.next();String word = entry.getKey().toString();Float value = (float)Float.parseFloat(entry.getValue().toString()) * idfs.get(word); tfidf.put(word, value);}resTfIdf.put(filepath, tfidf);}System.out.println("TF-IDF for Every file is :");DisTfIdf(resTfIdf);}public static void DisTfIdf(HashMap<String, HashMap<String, Float>> tfidf){Iterator iter1 = tfidf.entrySet().iterator();while(iter1.hasNext()){Map.Entry entrys = (Map.Entry)iter1.next();System.out.println("FileName: " + entrys.getKey().toString());System.out.print("{");HashMap<String, Float> temp = (HashMap<String, Float>) entrys.getValue();Iterator iter2 = temp.entrySet().iterator();while(iter2.hasNext()){Map.Entry entry = (Map.Entry)iter2.next(); System.out.print(entry.getKey().toString() + " = " + entry.getValue().toString() + ", ");}System.out.println("}");}}public static void main(String[] args) throws IOException {// TODO Auto-generated method stubString file = "D:/testfiles";HashMap<String,HashMap<String, Float>> all_tf = tfAllFiles(file);System.out.println();HashMap<String, Float> idfs = idf(all_tf);System.out.println();tf_idf(all_tf, idfs);}}

结果如下图:

常见问题

没有加入lucene jar包

 

 

lucene包和je包版本不适合

转载于:https://www.cnblogs.com/ywl925/p/3275878.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261302.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL 9.2迁移到9.3

Netkiller PostgreSQL 手札 Mr. Neo Chan, 陈景峰(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地51813186 1311366889086 755 29812080<netkillermsn.com> 文档始创于2012-11-16 版权 © 2010, 2011, 2012, 2013 Netkiller(Neo Chan). All rights reserved. 版…

C#原型模式之深复制实现

SYSTEM空间有ICONEALBE接口。。。因为其太常用。 1 /*2 * Created by SharpDevelop.3 * User: home4 * Date: 2013/4/215 * Time: 22:206 * 7 * To change this template use Tools | Options | Coding | Edit Standard Headers.8 */9 using System;10 11 namespace Res…

python flask框架教程_Flask框架从入门到实战

Flask简介&#xff1a;Flask是一个使用 Python 编写的轻量级 Web 应用框架&#xff0c;基于 WerkzeugWSGI工具箱和 Jinja2模板引擎。使用 BSD 授权。Flask也被称为 “microframework” &#xff0c;因为它使用简单的核心&#xff0c;用 extension 增加其他功能。Flask没有默认使…

iphone开发中数据持久化之——属性列表序列化(一)

数据持久化是应用程序开发过程中的一个基本问题&#xff0c;对应用程序中的数据进行持久化存储&#xff0c;有多重不同的形式。本系列文章将介绍在iphone开发过程中数据持久化的三种主要形式&#xff0c;分别是属性列表序列号、对象归档化以及iphone的嵌入式关系数据库SQLite。…

对话jQuery之父John Resig:JavaScript的开发之路

在参加完CSDN组织的TUP对话大师系列演讲活动后&#xff0c;27岁的jQuery之父John Resig接受了本刊总编刘江的深度访谈&#xff0c;这篇对话文章&#xff0c;让我们一窥这位著名程序员的人生及技术感悟。 编程初体验 《程序员》&#xff1a;你是如何开始编程的&#xff1f; John…

互联网产品研发的典型流程

这张图是互联网产品研发的一种最佳实践&#xff0c;这张图中没有包含异常流的处理。通常异常出现在进入开发甚至测试阶段了还在变更需求&#xff0c;进入封版发版阶段了还在修改代码&#xff0c;所以在这两个时间点都有需求冻结和代码冻结。 转载于:https://www.cnblogs.com/mo…

vscode 预览图片 插件_真的动手写的VSCode的插件(图片浏览)之1

由于本职工作中经常做图像处理&#xff0c;于时大量的图片浏览是不可避免的。怎么样不离开最近经常使用的VSCode&#xff0c;同时去看大量的图像对我来讲就是个不错的需求&#xff0c;尤其是某个目录下的文件。先谈基本的需求吧&#xff0c;显示一个目标下的所有图像&#xff0…

四十三 常用内建模块 base64

Base64是一种用64个字符来表示任意二进制数据的方法。 用记事本打开exe、jpg、pdf这些文件时&#xff0c;我们都会看到一大堆乱码&#xff0c;因为二进制文件包含很多无法显示和打印的字符&#xff0c;所以&#xff0c;如果要让记事本这样的文本处理软件能处理二进制数据&#…

Spring中IoC的入门实例[转]

Spring的模块化是很强的&#xff0c;各个功能模块都是独立的&#xff0c;我们可以选择的使用。这一章先从Spring的IoC开始。所谓IoC就是一个用XML来定义生成对象的模式&#xff0c;我们看看如果来使用的。  数据模型  1、如下图所示有三个类&#xff0c;Human&#xff08;人…

方向gravity_逆转重力方向,更加自由翱翔——GNZ48 - 《gravity》

第二期给大家带来的这首歌出自GNZ48 第二套原创公演《双面偶像》&#xff0c;也是GNZ48 team g 在这套公演中的队歌&#xff0c;一首气势恢宏的歌曲。开头的小提琴就带入我们进入了一种紧张的情绪&#xff0c;随着第一个鼓点敲下&#xff0c;歌词也渐渐揭开面纱&#xff1a;“泥…

06-BCD计数器设计与应用——小梅哥FPGA设计思想与验证方法视频教程配套文档

芯航线——普利斯队长精心奉献 实验目的&#xff1a;1.掌握BCD码的原理、分类以及优缺点 2.设计一个多位的8421码计数器并进行验证 3.学会基本的错误定位以及修改能力 实验平台&#xff1a;无 实验原理&#xff1a; BCD码&#xff08;Binary-Coded Decimal&#xff09;又…

Flash基本工具练习

练习一、按钮 练习二、卡通脸 练习三、图标 转载于:https://www.cnblogs.com/staceydesign/p/3313229.html

mysql_query 资源标识符_借助PHP的mysql_query()函数来创建MySQL数据库的教程

以mysql_query()函数作为教程的基础前提&#xff0c;我们先来看一下mysql_query()的用法&#xff1a;mysql_query()函数PHP MySQL 函数库中&#xff0c;mysql_query() 函数用于向 MySQL 发送并执行 SQL 语句。对于没有数据返回结果集的 SQL &#xff0c;如 UPDATE、DELETE 等在…

ios PNG Crush error (PNG图片错误)

我是这么解决的&#xff1a; I had the same problem. How to fix : Open up image with Preview -> File > Export > Format change to PNG and you are done 其他被采纳的方法&#xff1a; 12 Answers activeoldestvotes up vote41down voteaccepted Did you check …

设计模式之十(外观模式)

前言 外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一系统更加容易使用. 结构图 SubSystem Class 子系统类集合 实现子系统的功能&#xff0c;处理Facade对象指派的任务&#xff0c;注意子类中没有Facade的任何信息&#xff0c;即…

sunday java_Sunday算法:最快的字符串匹配算法

之前被KMP的next数组搞的头昏脑胀说不上也是比较烦人的&#xff0c;今天看到还有这么有趣而且高效的算法(比KMP还快)&#xff0c;看来有必要做一点笔记了Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配算法&#xff0c;其简单、快速的特点非常好&#xff01;思路其核…

小波分析实验: 实验1 连续小波变换

实验目的&#xff1a; 在理解连续小波变换原理的基础上&#xff0c;通过编程实现对一维信号进行连续小波变换&#xff0c;&#xff08;实验中采用的是墨西哥帽小波&#xff09;&#xff0c;从而对连续小波变换增加了理性和感性的认识&#xff0c;并能提高编程能力&#xff0c;为…

java axmlprinter_安卓xml配置文件解析工具-AXMLPrinter2.jar(androidmanifest.xml 反编译)下载官方最新版-西西软件下载...

AXMLPrinter2.jar apk分析APK文件&#xff0c;取得APK文件中的 包名、版本号及图标&#xff0c;很强大的工具&#xff0c;再一次感受到了批处理的牛逼。可以将android安卓编译过的二进制XML文件(binary xml file)反编译明文输出保存。是apk反编译修改的必备工具之一。例如需要查…

UML用例图说明

转自&#xff1a;http://www.360doc.com/content/10/1206/23/3123_75672033.shtml 前些时间参加了潘加宇老师的技术讲座&#xff0c;UML建模技术受益匪浅。我也把平时的一些积累和上次的收获总结在这篇文章中&#xff0c;主要讲解用例图相关的知识。 用例图是软件需求分析…

Android 布局学习之——Layout(布局)详解一

layout&#xff08;布局&#xff09;定义了用户界面的可视化结构&#xff08;visual structure&#xff09;,如Activity的UI,应用窗口的UI。 有两种方式声明layout: 1.在xml文件中声明UI组件。 2.在运行时&#xff0c;实例化布局元素。我们可以以编码的方式创建View或ViewGroup…