文章目录

  • 1、TF-IDF算法介绍
    • (1)TF是词频(Term Frequency)
    • (2) IDF是逆向文件频率(Inverse Document Frequency)
    • (3)TF-IDF实际上是:TF * IDF
  • 2、TF-IDF应用
  • 3、Python3实现TF-IDF算法
  • 4、NLTK实现TF-IDF算法
  • 5、Sklearn实现TF-IDF算法
  • 6、Jieba实现TF-IDF算法
  • 7、TF-IDF算法的不足
  • 8、TF-IDF算法改进——TF-IWF算法

1、TF-IDF算法介绍

TF-IDF(term frequency–inverse document frequency,词频-逆向文件频率)是一种用于信息检索(information retrieval)与文本挖掘(text mining)的常用加权技术。

TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

TF-IDF的主要思想是:如果某个单词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

(1)TF是词频(Term Frequency)

词频(TF)表示词条(关键字)在文本中出现的频率。

这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。

公式:

即:

其中 ni,j 是该词在文件 dj 中出现的次数,分母则是文件 dj 中所有词汇出现的次数总和;

(2) IDF是逆向文件频率(Inverse Document Frequency)

逆向文件频率 (IDF) :某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目再将得到的商取对数得到

如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。

公式:

其中,|D| 是语料库中的文件总数|{j:ti∈dj}| 表示包含词语 ti 的文件数目(即 ni,j≠0 的文件数目)。如果该词语不在语料库中,就会导致分母为零,因此一般情况下使用 1+|{j:ti∈dj}|

即:

(3)TF-IDF实际上是:TF * IDF

某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。

公式:

注:TF-IDF算法非常容易理解,并且很容易实现,但是其简单结构并没有考虑词语的语义信息,无法处理一词多义与一义多词的情况。

2、TF-IDF应用

(1)搜索引擎;(2)关键词提取;(3)文本相似性;(4)文本摘要

3、Python3实现TF-IDF算法

注意:该代码tf计算使用的是整个语料,这里只是举个简单的例子,大家在写的时候按文档计算词频即可!我这里就不做修改了

# -*- coding: utf-8 -*-
from collections import defaultdict
import math
import operator"""
函数说明:创建数据样本
Returns:dataset - 实验样本切分的词条classVec - 类别标签向量
"""
def loadDataSet():dataset = [ ['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],    # 切分的词条['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],['stop', 'posting', 'stupid', 'worthless', 'garbage'],['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],['quit', 'buying', 'worthless', 'dog', 'food', 'stupid'] ]classVec = [0, 1, 0, 1, 0, 1]  # 类别标签向量,1代表好,0代表不好return dataset, classVec"""
函数说明:特征选择TF-IDF算法
Parameters:list_words:词列表
Returns:dict_feature_select:特征选择词字典
"""
def feature_select(list_words):#总词频统计doc_frequency=defaultdict(int)for word_list in list_words:for i in word_list:doc_frequency[i]+=1#计算每个词的TF值word_tf={}  #存储没个词的tf值for i in doc_frequency:word_tf[i]=doc_frequency[i]/sum(doc_frequency.values())#计算每个词的IDF值doc_num=len(list_words)word_idf={} #存储每个词的idf值word_doc=defaultdict(int) #存储包含该词的文档数for i in doc_frequency:for j in list_words:if i in j:word_doc[i]+=1for i in doc_frequency:word_idf[i]=math.log(doc_num/(word_doc[i]+1))#计算每个词的TF*IDF的值word_tf_idf={}for i in doc_frequency:word_tf_idf[i]=word_tf[i]*word_idf[i]# 对字典按值由大到小排序dict_feature_select=sorted(word_tf_idf.items(),key=operator.itemgetter(1),reverse=True)return dict_feature_selectif __name__=='__main__':data_list,label_list=loadDataSet() #加载数据features=feature_select(data_list) #所有词的TF-IDF值print(features)print(len(features))

运行结果:

4、NLTK实现TF-IDF算法

from nltk.text import TextCollection
from nltk.tokenize import word_tokenize#首先,构建语料库corpus
sents=['this is sentence one','this is sentence two','this is sentence three']
sents=[word_tokenize(sent) for sent in sents] #对每个句子进行分词
print(sents)  #输出分词后的结果
corpus=TextCollection(sents)  #构建语料库
print(corpus)  #输出语料库#计算语料库中"one"的tf值
tf=corpus.tf('one',corpus)    # 1/12
print(tf)#计算语料库中"one"的idf值
idf=corpus.idf('one')      #log(3/1)
print(idf)#计算语料库中"one"的tf-idf值
tf_idf=corpus.tf_idf('one',corpus)
print(tf_idf)

运行结果:

5、Sklearn实现TF-IDF算法

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformerx_train = ['TF-IDF 主要 思想 是','算法 一个 重要 特点 可以 脱离 语料库 背景','如果 一个 网页 被 很多 其他 网页 链接 说明 网页 重要']
x_test=['原始 文本 进行 标记','主要 思想']#该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
vectorizer = CountVectorizer(max_features=10)
#该类会统计每个词语的tf-idf权值
tf_idf_transformer = TfidfTransformer()
#将文本转为词频矩阵并计算tf-idf
tf_idf = tf_idf_transformer.fit_transform(vectorizer.fit_transform(x_train))
#将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
x_train_weight = tf_idf.toarray()#对测试集进行tf-idf权重计算
tf_idf = tf_idf_transformer.transform(vectorizer.transform(x_test))
x_test_weight = tf_idf.toarray()  # 测试集TF-IDF权重矩阵print('输出x_train文本向量:')
print(x_train_weight)
print('输出x_test文本向量:')
print(x_test_weight)

运行结果:

6、Jieba实现TF-IDF算法

import jieba.analysetext='关键词是能够表达文档中心内容的词语,常用于计算机系统标引论文内容特征、
信息检索、系统汇集以供读者检阅。关键词提取是文本挖掘领域的一个分支,是文本检索、
文档比较、摘要生成、文档分类和聚类等文本挖掘研究的基础性工作'keywords=jieba.analyse.extract_tags(text, topK=5, withWeight=False, allowPOS=())
print(keywords)

运行结果:

注:

  • ieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
  • sentence 为待提取的文本
  • topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
  • withWeight 为是否一并返回关键词权重值,默认值为 False
  • allowPOS 仅包括指定词性的词,默认值为空,即不筛选

7、TF-IDF算法的不足

TF-IDF 采用文本逆频率 IDF 对 TF 值加权取权值大的作为关键词,但 IDF 的简单结构并不能有效地反映单词的重要程度和特征词的分布情况,使其无法很好地完成对权值调整的功能,所以 TF-IDF 算法的精度并不是很高,尤其是当文本集已经分类的情况下。

在本质上 IDF 是一种试图抑制噪音的加权,并且单纯地认为文本频率小的单词就越重要,文本频率大的单词就越无用。这对于大部分文本信息,并不是完全正确的。IDF 的简单结构并不能使提取的关键词, 十分有效地反映单词的重要程度和特征词的分布情 况,使其无法很好地完成对权值调整的功能。尤其是在同类语料库中,这一方法有很大弊端,往往一些同类文本的关键词被盖。

TF-IDF算法实现简单快速,但是仍有许多不足之处:

(1)没有考虑特征词的位置因素对文本的区分度,词条出现在文档的不同位置时,对区分度的贡献大小是不一样的。

(2)按照传统TF-IDF,往往一些生僻词的IDF(反文档频率)会比较高、因此这些生僻词常会被误认为是文档关键词。

(3)传统TF-IDF中的IDF部分只考虑了特征词与它出现的文本数之间的关系,而忽略了特征项在一个类别中不同的类别间的分布情况。

(4)对于文档中出现次数较少的重要人名、地名信息提取效果不佳。

8、TF-IDF算法改进——TF-IWF算法

详细改进方法参看论文:改进的 TF-IDF 关键词提取方法

本人NLP学习内容目录:

  • 1、用通俗易懂的方式讲解:NLP 这样学习才是正确路线

用通俗易懂的方式讲解:TF-IDF算法介绍及实现相关推荐

  1. 用通俗易懂的方式讲解:CatBoost 算法原理及案例

    文章目录 知识汇总 解惑答疑 1.梯度提升概述 2.什么是 CatBoost 3.CatBoost 的主要特点 01 对称树 FloatFeature OneHotFeature OnlineCtr ...

  2. 用通俗易懂的方式讲解:主成分分析(PCA)算法及案例(Python 代码)

    文章目录 知识汇总 加入方式 一.引入问题 二.数据降维 三.PCA基本数学原理 3.1 内积与投影 3.2 基 3.3 基变换的矩阵表示 3.4 协方差矩阵及优化目标 3.5 方差 3.6 协方差 ...

  3. 关键词提取算法—TF/IDF算法

    关键词提取算法一般可分为有监督学习和无监督学习两类. 有监督的关键词提取方法可以通过分类的方式进行,通过构建一个较为完善的词表,然后判断每个文档与词表中的每个词的匹配程度,以类似打标签的方式,达到关键 ...

  4. 随笔_从《芳华》影评到TF/IDF算法

     前两天看好多<芳华>的影评说:为什么好人没好报?于是感叹一堆世态炎凉,人性丑陋什么的.我觉得这问题是:为什么中央空调(对谁都温暖)往往不被看好.  先说说TF/IDF算法,这是一种信息处 ...

  5. 搜索引擎:文本分类——TF/IDF算法

    原理 TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类.TFIDF实际上是:TF * IDF,TF ...

  6. 用通俗易懂的方式讲解:决策树模型及案例(Python 代码)

    文章目录 1 决策树模型简介 2 Gini系数(CART决策树) 3 信息熵.信息增益 4 决策树模型代码实现 4.1 分类决策树模型(DecisionTreeClassifier) 4.2 回归决策 ...

  7. 用通俗易懂的方式讲解:逻辑回归模型及案例(Python 代码)

    目录 1 简介 2 优缺点 3 适用场景 加入方式 4 案例:客户流失预警模型 4.1 读取数据 4.2 划分特征变量和目标变量 4.3 模型搭建与使用 4.3.1 划分训练集与测试集 4.3.2 模 ...

  8. 同级中断可以嵌套吗_这可能是最通俗易懂的方式讲解ARM中断原理以及中断嵌套...

    几天前一个学生问我ARM中断嵌套的问题,我才发现原来在我心中理所当然的事对学生来说理解实属不易. ARM有七种模式,我们这里只讨论SVC.IRQ和FIQ模式. 我们可以假设ARM核心有两根中断引脚(实 ...

  9. 用通俗易懂的方式讲解Transformers

    多年来,我们一直在使用RNN,LSTM和GRU解决顺序问题,您突然希望我们将其全部丢弃吗? 嗯,是!! 所有这三种架构的最大问题是它们进行顺序处理. 而且它们也不擅长处理长期依赖关系(即使使用LSTM ...

最新文章

  1. centos6一键安装vsftpd脚本
  2. mysql的慢查询日志
  3. 4、使用PreparedStatement接口实现增,删,改操作(常用)
  4. openresty开发系列21--lua的模块
  5. mysql 手机号 字段_2021-01-06:mysql中,我存十亿个手机号码,考虑存储空间和查询效率,用什么类型的字段去存?...
  6. Android之解决NestedScrollView嵌套ViewPager导致出现左右页面滑动冲突
  7. Java架构师必须知道的 6 大设计原则
  8. android 广播 event,无法接收android.intent.action.EVENT_REMINDER广播
  9. 深入浅出交换类排序算法(冒泡排序,快速排序)
  10. Oracle递归sql
  11. 双线性插值实现图像放大算法 matlab,FPGA/verilog实现双线性插值图像放大
  12. html文字浮雕效果不起作用,ps浮雕效果 怎么把文字弄成浮雕效果
  13. 要出发周边游APP产品体验报告
  14. Ajax提交Form表单的两种简单方式
  15. HR人力资源系统管理源码
  16. 电池管理系统(BMS)软硬件介绍
  17. js获取当天0点时间戳
  18. echarts 5.4 版本 map 地图下钻,显示南沙群岛缩略图,海南三沙市编辑隐藏
  19. 文献检索工具 | 计算机类英文文献检索数据库DBLP
  20. selenium最大化窗口,刷新网页,及退出

热门文章

  1. xquery_使用XQuery处理XML
  2. 腰间盘突出怎么解决?
  3. 正确理解 clear:both
  4. 乐视网的视频看不了了,说抱歉,你所访问的视频不存在
  5. 2018年蓝桥杯省赛B组题解
  6. ABP天坑--UOW自动保存修改
  7. 彩电市场竞争格局巨变, 创维“修炼内功”逆势增长
  8. 关于调整部分车站互联网、电话订票起售时间的公告(火车票放票时间)
  9. Vue双向数据绑定和Vue响应式
  10. MES系统中生产计划模块的重要作用