TF-IDF:概念与python实现

简介: TF-IDF:概念与python实现

1. 基本概念


TF-IDF(Term Frequency - Inverse Document Frequency)表示“词频-逆文本频率”。词频(TF,Term Frequency )表示给定词语在文件或语料中出现的频率(归一化以屏蔽长短文件的差异);逆文本频率(IDF,Inverse Document Frequency)是一个词语重要性的度量。


(1)Term Frequency


当以“人工智能的应用”为关键词进行网页搜索,根据直觉,“人工智能”、“的”、“应用”这三个词出现次数较多的网页相关性也较高。


但由于篇幅较长的网页一般包含较多的关键词,为屏蔽文本篇幅的差异,根据网页长度对关键词的次数进行归一化,就是词频(Term-Frequency)。


此时,度量网页相关性可以直接将关键词的词频相加,假设N 个关键词的词频分别为T  F 1 , TF2   , . . . , T F N  ,该网页的相关性为:


image.png

比如,某个网页的词共1000个,“人工智能”、“的”和“应用”分别出现3次,30次,10次,它们的词频分别为0.003,0.03,0.01,该网页与“人工智能的应用”相关性为


image.png

但是“人工智能”是一个很专业的词,“应用”是一个很普通的词,“的”是一个停止词(Stop Word),但在计算相关行性时候“的”贡献却是最多的,而“人工智能”贡献却最少。因此还需要给每个词赋予相应的权重进行修正,以满足以下设定:


一个词与主题相关性越大,权重越大,反正权重越小。

停止词权重为0。即忽略“的”、“得”、“地”、“是”、“也”这些词。


(2) Inverse Document Frequency


可见如果一个关键词只在少量文本中出现,当它一旦出现时,就很容易锁定该文本的主题,反之亦然;即一个关键词x 在N 个文本中出现,当N 越大时,x 的权重就越小,反之亦然。


上述理念通过定义逆文本频率(IDF,Inverse Document Frequency)实现:


image.png

其中,N 代表语料库中文本的总数,而N ( x )代表语料库中包含词x xx的文本总数。


当某个生僻词未在语料库中出现过,N ( x )=0, 需要进行如下平滑处理:


image.png


IDF反应了一个词在所有文本中出现频率的逆,如果一个词在较少文本中出现,它的IDF值应该高,如“人工智能”这样的专业名词;如果一个词在较多文本中出现,它的IDF值应该低,比如“应用”这样词。极端的情况下,如果一个词在所有(或大多数)文本中都出现,那么它的IDF值应该为0,比如“的”这样的停止词。


上述例子中,假设所有文本语料数量N =  109,“人工智能”出现次105,“应用”出现次108,“的”在所有网页中都出现,则


image.png


此时,相关性可以用TF-IDF度量,假设N 个关键词的词频分别为,该网页与关键词的相T  F 1 , TF 2   , . . . , T F N  关性为:


image.png


上述例子中,“人工智能”的TF-IDF为0.04,“应用”的TF-IDF为0.03,而“的”TF-IDF为0,则该网页与“人工智能的应用”的相关性为0.07,其中“人工智能”贡献了一半以上的相关性。


2. 代码实现


使用sklearn.feature_extraction.text中的TfidfVectorizer类实现,支持传入停止词。


from sklearn.feature_extraction.text import TfidfVectorizer
corpus=["I come to China to travel", 
    "This is a car polupar in China",          
    "I love tea and Apple ",   
    "The work is to write some papers in science"] 
tfidfVec = TfidfVectorizer()
tfidf = tfidfVec.fit_transform(corpus)
print("\n词频矩阵(TF-IDF):")
print(tfidf)
print("\n词袋模型(TF-IDF):")
print(tfidf.toarray())

输出如下:



20200705185138706.png

相关文章
|
1月前
|
测试技术 Python
Python中的装饰器:概念、用法及实例
【2月更文挑战第25天】 装饰器在Python中是一种强大的工具,它允许我们在不修改原始函数代码的情况下,增加函数的功能。本文将深入探讨装饰器的概念,解析其工作原理,并通过实例来展示如何在Python中使用装饰器。
|
1月前
|
Python
请简述Python中的继承、封装和多态的概念。
【2月更文挑战第24天】【2月更文挑战第82篇】请简述Python中的继承、封装和多态的概念。
|
2天前
|
Python
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
Python从入门到精通:深入学习面向对象编程——2.1.2继承、封装和多态的概念
|
30天前
|
存储 Python
Python基础概念学习
Python基础涉及变量、数据类型(如整型、字符串、列表等)、运算符、控制结构(if...else、for/while循环)、函数、输入输出、异常处理、注释和编程规范(PEP 8)。了解这些后,通过实践和使用模块加强理解,参考菜鸟教程和官方文档进行学习。
25 2
|
1月前
|
缓存 程序员 Python
深入理解Python装饰器:从概念到应用
Python装饰器是函数,用于在不修改原代码的情况下为函数添加新功能。它们基于Python的函数一阶对象特性,通过`@decorator`语法应用。装饰器工作原理是接收函数作为参数,创建新函数对象并在调用时执行额外操作。常见应用场景包括日志记录、性能分析、权限校验和缓存。装饰器增强了代码的可读性和可维护性。
|
1月前
|
程序员 开发者 Python
Python中的装饰器:概念、用法和实例
【2月更文挑战第26天】 本文深入探讨了Python中装饰器的核心概念,其运作机制以及在实际编程中的应用。装饰器是Python语言提供的一种强大工具,允许开发者在不修改原始函数代码的情况下,增加函数的功能。文章首先解释了装饰器的基本原理,然后通过示例展示了如何创建和应用装饰器,最后讨论了装饰器的高级用途,包括带参数的装饰器和嵌套装饰器。
19 4
|
1月前
|
缓存 开发者 Python
Python中的装饰器:概念、用法及实例
【2月更文挑战第26天】 本文将深入探讨Python中的一种强大工具——装饰器。我们将首先解释装饰器的概念,然后通过实例说明其用法,最后探讨其高级应用。无论你是Python新手还是有经验的开发者,本文都将帮助你更好地理解和使用装饰器。
18 2
|
1月前
|
Python
Python中的装饰器:概念、实现与应用
【2月更文挑战第25天】 在编程世界中,装饰器是一种强大的工具,特别是在Python语言中。本文将深入探讨Python装饰器的概念,包括其定义、作用以及如何实现。我们将透过实例来了解装饰器的运作机制,并探索其在现实世界中的应用。通过阅读本文,你将对Python装饰器有更深刻的理解,并能将其应用于你的编程实践中。
13 3
|
1月前
|
Python
Python中的装饰器:概念、应用与实例
【2月更文挑战第25天】 装饰器在Python中是一种强大的工具,它允许我们在不修改原始函数代码的情况下,增加函数的功能。本文将深入探讨装饰器的概念,展示如何在Python中使用装饰器,并通过实例来使其更加易于理解。我们将看到装饰器如何使我们的代码更加简洁、可读性更强,以及如何利用装饰器来解决一些常见的编程问题。
|
1月前
|
缓存 Python
Python中的装饰器:概念、实现和应用
【2月更文挑战第25天】 装饰器是Python中一种强大的工具,它允许我们在不修改原始函数代码的情况下,增加或修改函数的行为。本文将深入探讨装饰器的概念、实现方式以及在实际开发中的应用。我们将通过实例来展示如何创建和使用装饰器,以及如何利用装饰器来解决实际问题。
16 5