【算法原理】

TFIDF由TF和IDF相乘而来,TF是指某个单词在一个文档中出现次数归一化后的结果;IDF是一个单词普遍重要性的度量。它基本原理是单词的重要性随着它在文档中出现的次数而增加,随着它在所有文档中出现的频率而下降

one-hot矩阵是单词编码的一种方式,它先根据单词在所有文档中的出现顺序建立一个词汇表,然后每个文档对应one-hot矩阵的一行,每行长度为词汇表的大小。根据词汇表中每个单词是否出现在某一篇文档中,如果出现,对应的位置就为1,否则为0。

但one-hot矩阵只表示某个单词是否在文档中出现,并不能表示某个单词的出现次数,所以Bag-of-Words在one-hot基础上做出了改进,其中每一行对应一个文档,每个值对应词表的位置上该词语出现的次数。

但Bag-of-Words的统计方法更偏向于长文档,也就是说同一个词语在长文档里可能会比短文件有更高的词频,而不管该词语重要与否,所以TF在此基础上又做出改进,进将各词频归一化以消除文件长度的影响。所以得到TF的公式如下

tfi,d=ni,d∑knk,dtf_{i,d}=\frac{n_{i,d}}{\sum_k{n_{k,d}}}tfi,d​=∑k​nk,d​ni,d​​​

上式中ni,dn_{i,d}ni,d​​是指单词iii在文档ddd中出现的次数,而分母则是文档ddd中所有单词出现的次数之和。

TF虽然能表示一个单词在一个文档中的重要性,但不能表示它和所有文档的关系,因为一个单词的重要性还会随着出现的文档数而下降,因此又引入一个指标IDF(反文档频率)它的公式如下:

idfi=log∣D∣∣j:ti∈dj∣idf_i=log\frac{|D|}{|{j:t_i\in{d_j}}|}idfi​=log∣j:ti​∈dj​∣∣D∣​​​

上式中∣D∣|D|∣D∣​表示总的文档数,分母则表示单词iii​出现的文档总数,如果一个单词出现的次数越少,由于∣D∣|D|∣D∣​是固定的,则∣D∣∣j:ti∈dj∣\frac{|D|}{|{j:t_i\in{d_j}}|}∣j:ti​∈dj​∣∣D∣​​的值越大,则idfiidf_iidfi​​​ 越大,表示该单词越重要,反之亦然。为了进一步改进,会在分母+1,主要为了防止分母出现0,如下式:

idfi=log∣D∣∣j:ti∈dj∣+1idf_i=log\frac{|D|}{|{j:t_i\in{d_j}}|+1}idfi​=log∣j:ti​∈dj​∣+1∣D∣​

至此,我们就可以将反文档频率和词频相乘,作为TFIDF矩阵的一个元素

ifidfi,j=tfi,j×idfiifidf_{i,j}=tf_{i,j}\times idf_iifidfi,j​=tfi,j​×idfi​

【关键代码】

1.定义的全局变量

vector<vector<string>> words;  //存储所有的单词,words[i][j] 表示第i个文档的第j个单词。
unordered_map<string,int> dict; //hash,存储单词表,每个键值对表示<单词,出现顺序> dict[wordd[i][j]]表示第i个文档中第j个单词在单词表中的序号。
vector<int> appear; //appear[i] 表示出现了单词i的文章数,
int index; //记录此时单词出现的次序

2.统计每个单词在文档中出现的次数以及出现的文档数

void get_data (vector<vector<double>>& TFIDF) {for (int i = 0; i < words.size(); i++) {//遍历每个单词for (int j = 0; j < words[i].size(); j++) {if (TFIDF[i][dict[words[i][j]]] == 0) appear[dict[words[i][j]]]++; // 如果words[i][j] 还没有在文档i中出现过,说明该单词在一篇新文章出现了。TFIDF[i][dict[words[i][j]]]++;   //文档i中单词j的出现次数加1;}}
}

3.根据统计结果计算每个tfidf值

void get_TFIDF (vector<vector<double>>& TFIDF) {for (int i = 0; i < words.size(); i++) {  //处理文档ifor (int j = 0; j < dict.size(); j++) { //处理文档i中单词表中顺序为j的单词TFIDF[i][j] = TFIDF[i][j] * log((double)words.size() / (1.0 + (double)appear[j])) / (double) words[i].size();  //根据工式计算每个值}}
}

TFIDF的原理及实现相关推荐

  1. 《Hadoop与大数据挖掘》——2.6 TF-IDF算法原理及Hadoop MapReduce实现

    本节书摘来自华章计算机<Hadoop与大数据挖掘>一书中的第2章,第2.6节,作者 张良均 樊哲 位文超 刘名军 许国杰 周龙 焦正升,更多章节内容可以访问云栖社区"华章计算机& ...

  2. TF-IDF的原理概述

    今天来说一下什么是TF-IDF,我记得这个东西从2017年开始就一直缠绕着我,今天我把它撕扯下来,拼凑着这样的一篇趣文,我想看过之后,大家就算没学过高等数学,那么对于它的原理也会了然于胸了.为了能以一 ...

  3. TF-IDF的原理与实际应用

    TF-IDF的原理与实际应用 一.TF-IDF简介 TF-IDF(term frequency-inverse document frequency) 是一种统计方法,用以评估一个字词对于一个文本集或 ...

  4. SEO技术深度解析(TF-IDF算法原理及公式)

    做为SEO行业老鸟应该听说过TF-IDF算法,TF-IDF算法属于搜索引擎中的核心部分.TF-IDF算法是增加相关词的覆盖率,以及高优布局关键词密度,从而在百度谷歌等搜索引擎内容质量这一项上的排名加分 ...

  5. TF-IDF算法原理介绍

    参考文章链接1 参考文章链接2 TF-IDF算法代码实战

  6. TF-IDF和word2vec原理

    @(NLP) 文本挖掘 文章目录 文本挖掘 1. 分词的基本原理 2. N元模型 3. 维特比算法与分词 4. 常用分词工具 (二)文本挖掘预处理之向量化与Hash Trick 1. 词袋模型 2. ...

  7. jieba tfidf_【NLP】【三】jieba源码分析之关键字提取(TF-IDF/TextRank)

    [一]综述 利用jieba进行关键字提取时,有两种接口.一个基于TF-IDF算法,一个基于TextRank算法.TF-IDF算法,完全基于词频统计来计算词的权重,然后排序,在返回TopK个词作为关键字 ...

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

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

  9. 自然语言处理TF-IDF关键词提取算法

    1.关键词提取简介 关键词是指能反映文本主题或者主要内容的词语.关键词提取就是从文本里面把跟这篇文档意义最相关的一些词抽取出来,是NLP领域的一个重要的子任务.在信息检索中,准确的关键词提取可以大幅提 ...

  10. TF-IDF 算法详解及 Python 实现

    文章目录 前言 1.1 TF-IDF 算法的概念 1.1.1 TF 1.1.2 IDF 1.1.3 TF-IDF 1.2 代码实现 TF-IDF 算法 1.2.1 用 Python 实现 TF-IDF ...

最新文章

  1. 详解深度学习中的Normalization,不只是BN(1)
  2. 内容营销的21条黄金法则
  3. Ubuntu之bashrc:成功解决Ubuntu系统内出现的conda:未找到命令
  4. mysql select 查询选后5个_mysql 查询select语句汇总
  5. 2048. 下一个更大的数值平衡数
  6. POJ-3624 Charm Bracelet dp
  7. BugkuCTF-PWN题pwn1-瑞士军刀
  8. C# using 使用方法
  9. 8192 oracle,ORA-39095: 转储文件空间已耗尽: 无法分配 8192 字节
  10. linux设备模型之tty驱动架构分析,linux设备模型之uart驱动架构分析
  11. avc水平什么意思_5个步骤切实有效地提高你的写作水平
  12. atitit.抽奖活动插件组件设计--结构设计and 抽奖流程建模
  13. Java能用来做什么的?
  14. 概率论笔记5.1大数定律
  15. 墨海醉笔,又流逝了多少华年?
  16. 关于计算机作文的结束语,关于行动的作文结尾
  17. 什么叫html格式化,format是什么意思 格式化自己,只为删除你???
  18. 微信企业号通过token和userId获取用户头像
  19. ArcGIS 要素融合工具(dissolve)使用方法
  20. 恒压供水一拖四(3+1)图纸程序 西门子

热门文章

  1. pytorch使用万能模板
  2. 支持I2S数字音频接口;音频功放芯片NTP8835C
  3. 查看电脑的补丁以及win10如何进入dos系统
  4. Linux网络驱动MDIO及Phy梳理
  5. 系统架构改进--多系统用户整合
  6. cruzer php sandisk 闪迪u盘量产工具_SanDisk Cruzer Micro(U盘量产工具) V1.0 电脑版
  7. 华为vrrp默认优先级_【干货】华为vrrp配置
  8. 最全办公室租赁技巧,让你找到心仪的办公室
  9. 利用MapabcAPI实现基于浏览器的地理定位
  10. Python Pyecharts模块Map绘制中国地图自定义省份名称