【NLP模型】文本建模(2)TF-IDF关键词提取原理

news2024/11/24 3:28:27

一、说明

        tf-idf是个可以提取文章关键词的模型;他是基于词频,以及词的权重综合因素考虑的词价值刻度模型。一般地开发NLP将包含三个层次单元:最大数据单元是语料库、语料库中有若干文章、文章中有若干词语。这样从词频上说,就有词在文章的频率,词在预料库的频率,文章在预料库的频率等概念,合理用这些概念,提取词的真实价值,起到提取关键词的目的。        

二、TF-IDF基本概念

2.1 预料库、文章、单词的关系

        一般地开发NLP将包含三个层次单元:最大数据单元是语料库、语料库中有若干文章、文章中有若干词语。这里先对这个数据结构进行说明:

  • 语料库:预料库由海量的文章组成,并且各领域的文章的分布不能太偏。
  • 文章:每个文章都属于一个领域,不同领域的文章高频高频词汇是不同的。
  • 词汇:每个文章都由词汇构成,每个词汇的出现频率可以用对应直方图表示。

2.2 什么是tf,什么是idf

        假设文库中有两本书《金陵税负考》、《宇宙能量分析》词频高在文章中往往是停用词,“的”,“是”,“了”等,这些在文档中最常见但对结果毫无帮助、需要过滤掉的词,用TF可以统计到这些停用词并把它们过滤。当高频词过滤后就只需考虑剩下的有实际意义的词。

但这样又会遇到了另一个问题,我们可能发现"量化"、"系统"、"架构"这三个词的出现次数一样多。这是不是意味着,作为关键词,它们的重要性是一样的?事实上系统应该在其他文章比较常见,所以在关键词排序上,“量化”和“架构”应该排在“系统”前面,这个时候就需要IDF,IDF会给常见的词较小的权重,它的大小与一个词的常见程度成反比。

      TF-IDF 代表记录的词频逆文档频率。它可以定义为计算系列或语料库中的单词与文本的相关程度。含义与单词在文本中出现的次数成比例地增加,但由语料库(数据集)中的单词频率补偿。

1)TF-术语频率

        术语频率:在文档 d 中,频率表示给定单词 t 的实例数。因此,我们可以看到当一个词出现在文本中时,它变得更相关,这是合理的。由于术语的顺序并不重要,我们可以使用向量来描述术语模型包中的文本。 

        什么是 TF(词频)?
        术语频率的工作原理是查看您关注的特定术语相对于文档的频率。有多种定义频率的度量或方法:

  • 单词在文档中出现的次数(原始计数)。
  • 根据文档长度调整的词频(原始出现次数除以文档中的单词数)。
  • 对数标度频率(例如 log(1 + raw count))。
  • 布尔频率(例如,如果该术语出现,则为 1;如果该术语未出现,则为 0,在文档中)。

        文档中出现的术语的权重与术语频率成正比。举个例子:

下图表示8篇文章组成语料库,其中“能量”这个词在【1,3,4】文章中频率较高,说明对于【1,3,4】“能量”是该文章的特征,可以视其为关键词。

2)DF-文档频率

  • Document Frequency:测试整个语料库中文本的含义,与TF非常相似。唯一的区别是在文档d中,TF是词条t的频率计数器,而df是词条t在文档集合N中出现的次数。换句话说,出现该词的论文的数量是 DF。

        df(t) = 有N篇文章出现 t关键词

        下图的蓝色区域表示”但是“这个词分布很广,全部9个文章中都出现,

                df(t="但是")=9

        显然,单词”但是“既然分布在各种各样的文章中,因此它与文章的特征无关,不能作为关键词,应该删除。

3)IDF-反向文档频率

反向文档频率:这个概念是用来模拟语言的使用环境。这时需要一个语料库(corpus)。

        如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。log表示对得到的值取对数。

2.4  计算TF-IDF

Tf-idf :是确定术语对系列或语料库中的文本有多重要的最佳指标之一。

         tf-idf 是一种加权系统,它根据词频 (tf) 和倒数文档频率 (tf) (idf) 为文档中的每个词分配权重。权重较高的词被认为更重要。

        通常,tf-idf 权重由两项组成

  • 归一化词频 (tf)
  • 反向文档频率 (idf)
       

三、TF-IDF的python实验

3.1 基本调用方法

        在 python 中,可以使用 sklearn 模块中的 TfidfVectorizer() 方法计算 tf-idf 值。

        1)句法格式

        sklearn.feature_extraction.text.TfidfVectorizer(input)

        2)参数说明

                input:指传递的参数文档,可以是文件名,文件或内容本身。
                属性:

                        vocabulary_:它返回一个术语字典作为键和值作为特征索引。
                        idf_:它返回作为参数传递的文档的逆文档频率向量。
        3)返回说明return

                        fit_transform():它返回一组术语以及 tf-idf 值。
                        get_feature_names():它返回特征名称列表。

3.2 循序渐进的方法:

1)导入Python3模块

# import required module

from sklearn.feature_extraction.text import TfidfVectorizer

  • 从文档中收集字符串并创建一个语料库,其中包含文档 d0、d1 和 d2 中的字符串集合。

  • Python3

# assign documents

d0 = 'Geeks for geeks'

d1 = 'Geeks'

d2 = 'r2j'

# merge documents into a single corpus

string = [d0, d1, d2]

2) 从 fit_transform() 方法获取 tf-idf 值

# create object

tfidf = TfidfVectorizer()

# get tf-df values

result = tfidf.fit_transform(string)

3)显示语料库中出现的单词的 idf 值

# get idf values

print('\nidf values:')

for ele1, ele2 in zip(tfidf.get_feature_names(), tfidf.idf_):

    print(ele1, ':', ele2)

Output:

4)显示 tf-idf 值以及索引

# get indexing

print('\nWord indexes:')

print(tfidf.vocabulary_)

# display tf-idf values

print('\ntf-idf value:')

print(result)

# in matrix form

print('\ntf-idf values in matrix form:')

print(result.toarray())

Output:

        结果变量由独特的单词和 tf-if 值组成。可以使用下图对其进行详细说明:

从上图可以生成下表:

文章单词文章序号单词序号tf-idf值
d0for000.549
d0geeks010.8355
d1geeks111.000
d2r2j221.000

四、计算语料库中单词的 tf-idf 值的示例 

4.1 示例 1:

下面是基于上述方法的完整程序:

Python3

# import required module

from sklearn.feature_extraction.text import TfidfVectorizer

# assign documents

d0 = 'Geeks for geeks'

d1 = 'Geeks'

d2 = 'r2j'

# merge documents into a single corpus

string = [d0, d1, d2]

# create object

tfidf = TfidfVectorizer()

# get tf-df values

result = tfidf.fit_transform(string)

# get idf values

print('\nidf values:')

for ele1, ele2 in zip(tfidf.get_feature_names(), tfidf.idf_):

    print(ele1, ':', ele2)

# get indexing

print('\nWord indexes:')

print(tfidf.vocabulary_)

# display tf-idf values

print('\ntf-idf value:')

print(result)

# in matrix form

print('\ntf-idf values in matrix form:')

print(result.toarray())

Output:

4.2 示例 2:

此处,tf-idf 值是根据具有唯一值的语料库计算得出的。

Python3

# import required module

from sklearn.feature_extraction.text import TfidfVectorizer

# assign documents

d0 = 'geek1'

d1 = 'geek2'

d2 = 'geek3'

d3 = 'geek4'

# merge documents into a single corpus

string = [d0, d1, d2, d3]

# create object

tfidf = TfidfVectorizer()

# get tf-df values

result = tfidf.fit_transform(string)

# get indexing

print('\nWord indexes:')

print(tfidf.vocabulary_)

# display tf-idf values

print('\ntf-idf values:')

print(result)

Output:

4.3 示例 3:

在此程序中,tf-idf 值是根据具有相似文档的语料库计算的。

Python3

# import required module

from sklearn.feature_extraction.text import TfidfVectorizer

# assign documents

d0 = 'Geeks for geeks!'

d1 = 'Geeks for geeks!'

# merge documents into a single corpus

string = [d0, d1]

# create object

tfidf = TfidfVectorizer()

# get tf-df values

result = tfidf.fit_transform(string)

# get indexing

print('\nWord indexes:')

print(tfidf.vocabulary_)

# display tf-idf values

print('\ntf-idf values:')

print(result)

Output:

4.4 示例 4:

下面是我们尝试计算单个单词 geeks 在多个文档中重复多次的 tf-idf 值的程序。

Python3

# import required module

from sklearn.feature_extraction.text import TfidfVectorizer

# assign corpus

string = ['Geeks geeks']*5

# create object

tfidf = TfidfVectorizer()

# get tf-df values

result = tfidf.fit_transform(string)

# get indexing

print('\nWord indexes:')

print(tfidf.vocabulary_)

# display tf-idf values

print('\ntf-idf values:')

print(result)

Output:

4.5 另一个文本分析例子TF-IDF

        """ sklearn > feature_extraction > text > TfidfTransformer 将计数矩阵转换为标准化的 tf 或 tf-idf 表示 Tf 表示词频(即出现的原始频率) Tf-idf 表示术语频率乘以逆文档频率 Tf-idf 的目标是减少频繁出现的标记的影响 参数 范数:l1、l2 或无。用于规范化术语向量的范数 use_idf :布尔值。启用反向文档频率重新加权 smooth_idf :布尔值。平滑 idf 权重并防止零划分 sublienar_tf :布尔值。应用次线性 tf 缩放(即替换 tf 用 1 + log(tf)) 方法 fit(X[,y]) :学习 idf 向量(全局项权重) fit_transform(X[,y]) :适合数据,然后转换 get_params([deep]) :获取此估计器的参数 set_params(**params) : 设置这个估计器的参数 transform(X[,copy]) :将计数矩阵转换为 tf 或 tf-df 表示

import numpy as np
import pandas as pd 
from sklearn.feature_extraction.text import TfidfTransformer  
from sklearn.feature_extraction.text import CountVectorizer

corpus = [ '原子弹 芒果 应用', '芒果 应用', '原子弹 应用', '应用']

vectorizer = CountVectorizer()          
transformer = TfidfTransformer()       
X = vectorizer.fit_transform(corpus)   

tfidf = transformer.fit_transform(X)  
word = vectorizer.get_feature_names() 
weight = tfidf.toarray()               
for i in range(len(weight)):      
    print("-------第", i+1, "段文本的词语tf-idf权重------")
    for j in range(len(word)):
        print(word[j], weight[i][j])

                

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

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

相关文章

华为OD机试真题 JavaScript 实现【最小传输时延】【2023 B卷 100分】,附详细解题思路

一、题目描述 某通信网络中有N个网络节点,用1到N进行标识。 网络通过一个有向无环图表示,其中图的边的值表示结点之间的消息传递时延。 现给定相连节点之间的时延列表times[i] {u,v,w},u表示源节点,v表示目的节点,…

C++入门攻略

C补足C语言部分缺陷 1.命名空间:1.1 命名空间namespace关键字1.命名空间中可以定义变量、函数、类型2.命名空间可以嵌套3.相同命名空间共存 1.2 命名空间的使用方式:1.名称加用域作用限定符的方式访问(同上)2.使用using引入某个空…

现在学大数据还来得及么

种一棵树最好的时机是十年前,其次是现在。如果你想学,那么就一定来的及。 Python 已成利器 在大数据领域中大放异彩 Python,成为职场人追求效率的利器,因为不管什么工作,数据都会是工作的一部分,有数据的…

学习【菜鸟教程】【C++ 继承】

链接 1. 教程原文 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。 当创建一个类时,您不需要重新编写新的…

精通postman教程(一)下载及安装详解

作为一名测试工程师,那么Postman绝对是大伙必备的工具之一。 在这个系列教程中,我将为大伙详细讲解如何使用Postman进行API测试。 今天我将先为大伙介绍Postman的下载安装方法,让你们快速上手这款工具。 一、下载 下载地址:Do…

基于Java学院党员管理系统设计与实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

Java学习笔记(视频:韩顺平老师)4.0

如果你喜欢这篇文章的话,请给作者点赞哟,你的支持是我不断前进的动力。 因为作者能力水平有限,欢迎各位大佬指导。 目录 如果你喜欢这篇文章的话,请给作者点赞哟,你的支持是我不断前进的动力。 控制结构 顺序 分…

【面试系列】2023金三银四面经

🐱 个人主页:不叫猫先生,公众号:前端舵手 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步…

深入浅出RTA广告投放

一、RTA诞生背景 广告主在媒体投放广告时,往往需要将数据回传给DSP或媒体平台,供他们进行针对性优化。但是随着很多公司对数据隐私性的重视和保护,导致广告主不能或者不愿意将数据回传给DSP或媒体平台,但这样做又必然导致投放模型…

Lightroom Classic 2023(版本 12.3)主要新增功能

macw发布了Adobe Lightroom Classic 2023(版本 12.3)软件,该版本新增了哪些功能呢?随着小编一起了解一下吧! 主要新增功能概述 轻松消除图像中的杂色 借助 AI 支持的降噪功能,可以轻松、有效地消除 RAW 图像中的杂色&#xff0c…

抽象工厂模式(六)

过气的,终究是过气了 上一章简单介绍了工厂方法模式(五), 如果没有看过,请观看上一章 一. 抽象工厂模式 引用 菜鸟教程里面的单例模式介绍: https://www.runoob.com/design-pattern/abstract-factory-pattern.html 抽象工厂模式(Abstract Factory Pat…

记Gitlab备份与设置自动备份

今天给Gitlab做了一个备份,并且设置了每天自动备份,记录一下。 一、导出全部项目 由于Gitlab Web页面并没有自动备份的相关设置,只有各个项目有一个“导出项目”功能。为了保证安全,先把所有项目全部使用“导出项目”功能导出一…

Redis实战案例1-短信登录

Redis的共享session应用 1. 项目的相关工作 导入sql文件 找到对应的sql文件即可 基本表的信息 基本架构 导入对应的项目文件,启动相关的service服务; 在nginx-1.18.0目录下启动命令行start nginx.exe; 2. 基于session实现登录的流程 这里利用到Javaweb中…

脚踩Midjourney、Stable Diffusion,谷歌StyleDrop真要杀疯了!

脚踩Midjourney、Stable Diffusion,谷歌StyleDrop真要杀疯了 导语StyleDrop组件MuseMuse架构Muse图像生成实现流程 适配器微调Adapter TuningMuse中的Adapter Tuning 反馈迭代训练 最近,谷歌发布了一款引人瞩目的AI绘画工具——StyleDrop。这个工具通过学…

ZYNQ - 以太网远程更新贴片SD卡应用程序【SD NAND应用】

写在前面 对于ZYNQ系列的板卡固化,可以通过JTAG接口,使用SDK固化到FLASH中,或者可将SD卡取出将SD卡中保存的固化工程进行修改,但在很多情况下,离线更新会很不方便,本文借鉴网上常见的远程更新QSPI FLASH的…

解析Java异常机制:捕获编程中的错误,保障代码稳定性

工作中,程序遇到的情况不可能完美。比如:程序要打开某个文件,这个文件可能不存在或者文件格式不对;程序在运行着,但是内存或硬盘可能满了等等。 软件程序在运行过程中,非常可能遇到刚刚提到的这些问题&…

java OpenCSV自定义列标题和列位置

背景:最近使用csv进行数据导出,提高导出性能 问题:CsvBindByName和CsvBindByPosition不能同时用,要么是没标题要么是不是指定的排序规则 实现思路: 自定义排序规则,HeaderNameBaseMappingStrategy的writeOrder 属性可…

C++基于jrtp实现rtp发送与接收代码实现(附源码)

C++常用功能源码系列 文章目录 C++常用功能源码系列前言一、jrtp是什么二、rtp sender源码三、rtp receive源码总结前言 本文是C/C++常用功能代码封装专栏的导航贴。部分来源于实战项目中的部分功能提炼,希望能够达到你在自己的项目中拿来就用的效果,这样更好的服务于工作实…

Mininet拓扑构建与命令使用

实验目的: 1、通过命令模拟创建SDN网络。 2、深入了解Mininet的命令使用。 3、学会使用网络构建启动参数、内部交互命令及外部运行参数。 实验环境: 设备名称软件环境硬件环境主机Mininet_2.2.0_desktop_cv1.1CPU:1核 内存:2G 磁…

【MySQL数据库】MySQL数据库管理

MySQL数据库管理 一、数据库简述1.1简介1.2数据库基本概念1.3数据库的发展史1.3主流的数据库介绍1.4数据库的类型1.4.1关系型数据库特点1.4.2非关系型数据库介绍 1.5SQL语言分类 二、数据库基础应用2.1查看数据库2.2创建新的库、表2.3删除库、表2.4管理表中的数据记录2.4.1插入…