Java实现 TF-IDF算法

TF-IDF算法java实现【转载】 本文参考自: 原文地址 文章原地址:https://blog.youkuaiyun.com/lionel_fengj/article/details/53699903(侵权立删) TF-IDF算法 TF-IDF(词频-逆文档频率)算法是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反... 阅读详情

0写在前面:

前些天研究所有个处理文本的任务,将文本分完词然后利用tfidf计算每个文档中单词的tfidf值,其中文本(是一些舆情的新闻)已经有特定标签,表示是正向、负向还是中性的文本。后续使用这些处理好的文档来做一些舆情的情感预测。
在网上查找了一些有关java编写的tfidf程序,发现有的写的很混乱,而且没有相关的注释,阅读起来有很大的不方便,遂自己重写编写了一下tfidf,大神轻喷代码。

1.TFIDF的思想

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的不足之处. 在一份给定的文件里,词频(term frequency,TF)指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(term count)的归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。

2.程序实现

首先是计算tf的代码:我们使用map来存储tf的结果,这个地方需要注意的是,我们先通过分词软件将所有的文档读成一个map,Map< String,String >其中key是每个文档的文档名,对应的value是分完词后的文档内容,单词以空格分割。这里我们定义tf的方法传的参数是map中的value值(也就是一个String),然后计算单词的tf值。

举例:参数wordAll=“合肥 工业 大学 简称 合 工大 位于 安徽省 省会 合肥市 创建 1945年 秋 1960年 10月 22日 中共中央 批准 全国 重点 大学 教育部 直属 高校 工程 工程 优势 学科 创新 平台 项目 建设 高校 工科 主要 特色 工 理 文 经 管 法 教育 多 学科 综合性 高等院校”

/**
     * 计算每个文档的tf值
     * @param wordAll
     * @return Map<String,Float> key是单词 value是tf值
     */
    public static Map<String,Float> tfCalculate(String wordAll){
        //存放(单词,单词数量)
        HashMap<String, Integer> dict = new HashMap<String, Integer>();
        //存放(单词,单词词频)
        HashMap<String, Float> tf = new HashMap<String, Float>();
        int wordCount=0;

        /**
         * 统计每个单词的数量,并存放到map中去
         * 便于以后计算每个单词的词频
         * 单词的tf=该单词出现的数量n/总的单词数wordCount
         */
        for(String word:wordAll.split(" ")){
            wordCount++;
            if(dict.containsKey(word)){
                dict.put(word,  dict.get(word)+1);
            }else{
                dict.put(word, 1);
            }
        }

        for(Map.Entry<String, Integer> entry:dict.entrySet()){
            float wordTf=(float)entry.getValue()/wordCount;
            tf.put(entry.getKey(), wordTf);
        }
        return tf;
    } 

然后计算tfidf的值:这里需要说明的是,在计算idf的时候会涉及到包含某个单词的文档数,所以这里,会将分完词后的map传输进来。
最后用一个Map来存储最后的结果,Map< String>

/**
     * 
     * @param D 总文档数
     * @param doc_words 每个文档对应的分词
     * @param tf 计算好的tf,用这个作为基础计算tfidf
     * @return 每个文档中的单词的tfidf的值
     * @throws IOException 
     * @throws FileNotFoundException 
     */
    public static Map<String,Float> tfidfCalculate(int D, Map<String,String> doc_words,Map<String,Float> tf) throws FileNotFoundException, IOException{

        HashMap<String,Float> tfidf=new HashMap<String, Float>();
        for(String key:tf.keySet()){
            int Dt=0;
            for(Map.Entry<String, String> entry:doc_words.entrySet()){

                String[] words=entry.getValue().split(" ");

                List<String> wordlist=new ArrayList<String>();
                for(int i=0;i<words.length;i++){
                    wordlist.add(words[i]);                }
                if(wordlist.contains(key)){
                    Dt++;
                }
            }
            float idfvalue=(float) Math.log(Float.valueOf(D)/Dt);
            tfidf.put(key, idfvalue * tf.get(key));

        }       
        return tfidf;  
  }


3.最后
tfidf的githup地址:https://github.com/xudongMk/tfidfkdong

TF-IDF算法讲解和Java实现 一、 TF-IDF算法原理TF-IDF是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。TF-IDF是一种统计方法,用以评估某个字词对于一个语料库中的其中一份文本的重要程度。字词的重要性随着它在文本中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜寻引擎应用,作为文件与用户查询之间相 阅读详情

相关推荐

TF-IDF(java实现)

0写在前面:前些天研究所有个处理文本的任务,将文本分完词然后利用tfidf计算每个文档中单词的tfidf值,其中文本(是一些舆情的新闻)已经有特定标签,表示是正向、负向还是中性的文本。后续使用这些处理好的文档来做一些舆情的情感预测。

徐先森的博客 8882

Java实现TF-IDF算法

Java实现TF-IDF算法 TF-IDF是一种用于信息检索与数据挖掘的常用加权技术。TF是词频,IDF是逆文本频率指数。 原理: 简单来说就是一个词语在一篇文章中出现的次数TF,和该词语在语料库中所出现的频率IDF。 TF = 文章中该词出现次数/文章总词数 IDF = log(语料库中所有文章 / (语料库中出现该词汇的文章+1)) TF-IDF == TF*IDF,这个值越大,就说明这个词汇越可能是该文章的关键字,统计这类关键字以便于文章提出主旨。 Java代码实现: 首先我在写自己毕设的时候需要

qq_43965934的博客 3923

tfidf算法 java代码

tfidf算法 java代码/** * Docs : (docId, (word, tf-idf)*) */ public Map<Integer, Map> docs = new HashMap<Integer, Map>(); /** * Words: (word, idf) */ public Map wordIdf = new HashMap();

TFIDF算法java实现

转载自: http://xwrwc.blog.163.com/blog/static/46320003201010634132451/   一、算法简介         TF-IDF(term frequency–inverse document frequency)。         TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为...

maqianmaqian的专栏 600

TF-IDF理解及其Java实现代码实例

主要介绍了TF-IDF理解及其Java实现代码实例,简单介绍了tfidf算法及其相应公式,然后分享了Java实现代码,具有一定参考价值,需要的朋友可以了解下。

VIO实战前传:手把手教你解读Kalibr双目IMU标定报告与参数应用

本文详细解析Kalibr双目IMU联合标定报告的核心参数与应用方法,涵盖重投影误差分析、IMU误差指标解读、关键变换矩阵原理及VINS-Fusion实战配置。通过手把手教学帮助开发者准确理解标定结果,解决VIO算法落地中的参数配置难题,提升视觉惯性里程计的系统稳定性与精度。

weixin_42699679的博客 331

自然语言处理系列二》Java代码实现TF-IDF

此文章有对应的陈敬雷老师的清华大学出版社配套书籍教材 【自然语言处理原理与实战(人工智能科学与技术丛书)】 https://item.jd.com/13951851.html 和【分布式机器学习实战(人工智能科学与技术丛书)】,对应京东自营链接地址: https://item.jd.com/12743009.html

weixin_52610848的博客 1714

进阶数据结构——链式前向星

链式前向星是一种进阶的数据结构,主要用于图的存储。我希望大家先看这个视频(蓝色字体点进去) 不然你很难理解的。在图论中,图的存储方式主要有邻接矩阵和邻接表两种。邻接矩阵虽然建图简单方便,但占内存较大,节点数量稍微大点的题目就难以使用(适合稠密图);而邻接表虽然节省空间,但其指针形式难写易错,且vector形式的读取速度较慢,易导致大数据下的超时(TLE)。针对上述问题,链式前向星作为一种折中的方式应运而生。链式前向星本质上是一种静态链表,它将数据以链表形式连接在一起。

ycs66的博客 2134

Java计算TF-IDF值

在自然语言处理中,TF-IDF模型的计算是一种很基础的方式,在很多地方都会去使用。但是由于TF-IDF的计算一般涉及到的是一个稀疏矩阵的计算,本部分使用Map来完成对TF-IDF的构建。计算完成后,可以通过类的get方法来对计算所得的TF以及IDF的值。其中 tf格式:( 文件路径名 : ( 单词 : 词频 ) ) idf格式:( 单词 : IDF ) import java.i

l648940683的博客 1601

从SGX到TDX:英特尔机密计算的技术演进与选型指南

本文深入解析了英特尔两代机密计算技术SGX与TDX的核心差异与选型策略。SGX提供应用级飞地隔离,安全等级高但开发复杂;TDX提供虚拟机级信任域保护,兼容性好且易于部署。文章结合金融与医疗行业实战案例,为开发者提供了清晰的选型指南,帮助根据代码可改性、安全需求、部署规模及生态成本选择最合适的机密计算方案。

java5的博客 419

用Python+OpenCV搞定线激光相机标定:从棋盘格到3D点云的保姆级实战

本文详细介绍了使用Python和OpenCV进行线激光相机标定的全流程实战,从硬件准备到3D点云重建。涵盖相机内参标定、激光平面方程拟合、三维重建等关键技术,提供完整的代码实现和工程优化建议,帮助开发者实现毫米级精度的工业检测和三维测量系统。

weixin_29227425的博客 281

java实现 tf-idf

  1、前言     TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF意思是词频(Term Frequency),IDF意思是逆向文件频率(Inverse Document Frequency)。     TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程...

weixin_33831196的博客 314

RK平台MPP编解码实战:从源码编译到性能测试全解析

本文详细解析了在RK(瑞芯微)平台上进行MPP(Media Process Platform)多媒体编解码实战的全过程。从源码获取、交叉编译环境搭建、常见编译问题排查,到测试程序的修改调试与性能测试分析,提供了从零到一的完整指南。文章通过实测数据展示了MPP硬件编解码在嵌入式设备上的高性能与低功耗优势,帮助开发者快速掌握这一关键技术,应用于智能摄像头、视频会议终端等产品开发。

weixin_28273593的博客 542

TF-IDF算法的java实现

转载地址:http://xwrwc.blog.163.com/blog/static/46320003201010634132451/ 一、算法简介         TF-IDF(term frequency–inverse document frequency)。         TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词

快乐的鱼儿学敲码 3478

LCD驱动芯片——BL55072A驱动程序

初始化子程序: START 0x7C; I2C子地址 0xEA;ICSET,软件复位芯片 0xC0;MODSET,关显示 0xF0;BLKCTL,关闪烁 0xA3;DISCTL,80Hz Line inversion,High Power mode 0xE8;ICSET,清复位bit1 STOP 显示刷新子程序: START 0x7C;I2C子地址 0xF0;BLKCTL,关闪烁 0xA3;DISCTL,80Hz Line inversion,High Power mode 0xE8或0xEC;ICSE

love421的博客 3174

2026年医疗AI的可信革命全栈实现(上)

医疗AI可信化:贝叶斯网络与向量数据库的协同架构 本文探讨2026年医疗AI发展的关键转折点——从追求生成能力转向构建可信决策系统。核心观点认为,医疗AI下一阶段的竞争焦点在于不确定性量化和错误传播约束,而非单纯的问答流畅度。研究提出以Python为开发语言、结合向量数据库与贝叶斯网络的混合架构: 技术分层 语言层(LLM):处理自然语言交互与工具调用 证据层(Milvus/Qdrant):实现可审计的临床知识检索 概率层(pgmpy/PyMC):执行贝叶斯推理与风险路由 治理层:确保权限控制与人工复核机制

AllenLV的博客 1148

如何用Java实现NLP的经典关键词算法 TF-IDF

面对一篇文章,我们如何提取他的关键词呢。如果是我们自己去提取,那只需要读一遍,然后大脑中就会有一定的印象了,但是对于计算机来说,他没有人那样的思考能力啊,那怎么办,只能依靠算法了。今天分享的内容呢是如何用Java语言实现NLP(自然语言处理)领域中一个非常著名的算法 TF-IDF(Term Frequency–Inverse Document Frequency 词频-逆向文档频率算法)。

老区的自留地 4511

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

tf idf算法 java_Hanlp分词实例:Java实现TFIDF算法

算法介绍最近要做领域概念的提取,TFIDF作为一个很经典的算法可以作为其中的一步处理。关于TFIDF算法的介绍可以参考这篇博客http://www.ruanyifeng.com/blog/2013/03/tf-idf.html。计算公式比较简单,如下:预处理由于需要处理的候选词大约后3w+,并且语料文档数有1w+,直接挨个文本遍历的话很耗时,每个词处理时间都要一分钟以上。为了缩短时间,首先进行分词...

weixin_39927683的博客 111

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JAVA学习-练习试用Java实现“TF-IDF算法 :用于文本特征提取。”

在上面的代码中,我们首先定义了一个'TFIDF'类,它有三个主要的方法:'calculateTF'计算词频(TF),'calculateIDF'计算逆文档频率(IDF),以及'calculateTFIDF'计算TF-IDF值。我们还有一个'addDocument'方法来添加文档到语料库中,并更新词频和文档频率。在'main'方法中,我们创建了两个文档的列表,初始化了一个'TFIDF'对象,并添加了这些文档到语料库中。然后,我们计算了第一个文档的TF,IDF,以及TF-IDF值,并将结果打印出来。

weixin_69763181的博客 473

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

TFIDF算法java实现(TF/IDF选取高频词)

一、算法简介         TF-IDF(term frequency–inverse document frequency)。         TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TFIDF实际上是:TF*IDF,TF词频(Term Frequency),IDF反文档频率(I

特依依|专注J2ee开发、Solr、Solr4、Slorcloud、Lucene和大数据的挖掘技术 1万+

tf-idf算法的基本实现,java

声明  以下代码只是对tf-idf算法思想的基本实现,因此许多地方需待完善,总结如下:   1.实现逻辑问题:特殊位置、比如段首或者名词(相对于动词),应该有更大的权重;   2.分词前应该对文本进行基本处理:去掉标点,合适的方式调用分词接口,使得文本内容变大时能够分两次调用,但结果相同;   3.速度有待提升:总文本数一星期更新一次就行,关键词所在的文本现测量方式;实现 package de

beirdu的专栏 646

java hanlp分词_Hanlp分词实例:Java实现TFIDF算法

算法介绍最近要做领域概念的提取,TFIDF作为一个很经典的算法可以作为其中的一步处理。关于TFIDF算法的介绍可以参考这篇博客http://www.ruanyifeng.com/blog/2013/03/tf-idf.html。计算公式比较简单,如下:预处理由于需要处理的候选词大约后3w+,并且语料文档数有1w+,直接挨个文本遍历的话很耗时,每个词处理时间都要一分钟以上。为了缩短时间,首先进行分词...

weixin_31220971的博客 1072

tf idf算法 java_求TF-IDF算法的C++或java源码。

展开全部之前写过的,请加分。#include#include#include#include#include#include#include#includeusingnamespacestd;mapIDFTable;structWords{stringwd;floatfreq;floatweight;};boolcmp(Words&w1,Words&w2...

weixin_39575937的博客 174

TF-IDF理解及其Java实现

转自:http://www.cnblogs.com/ywl925/archive/2013/08/26/3275878.html 前言 前段时间,又具体看了自己以前整理的TF-IDF,这里把它发布在博客上,知识就是需要不断的重复的,否则就感觉生疏了。 TF-IDF理解 TF-IDF(term frequency–inverse document freque

Rome was not built in one day 903
上一篇: 有经验JAVA程序员如何提升自己?
下一篇: Java版本雪花算法的原理和实现
shadow_zed
博客等级 码龄10年 6289粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值