自然语言处理NLP:tf-idf原理、参数及实战

news2024/12/24 11:28:07

大家好,tf-idf作为文体特征提取的常用统计方法之一,适合用于文本分类任务,本文将从原理、参数详解和实际处理方面介绍tf-idf,助力tf-idf用于文本数据分类。

1.tf-idf原理

tf 表示词频,即某单词在某文本中的出现次数与该文本中所有词的词数的比值,idf表示逆文本频率(语料库中包含某单词的文本数、倒数、取log),tf-idf则表示词频 * 逆文档频率,tf-idf认为词的重要性随着它在文本中出现的次数成正比增加,但同时会随着它在整个语料库中出现的频率成反比下降。

idf表达式如下,其中k为包含某词的文本数,n为整个语料库的文本数:

idf=log(n/k)

对idf进行平滑处理,避免出现极大/极小值(smooth_idf=True)

idf=log((1+n)/(1+k))+1

2.文本处理方法

sklearn中提供了一些方便的文本处理方法:

CountVectorizer: 将文本文档集合转换为词频/字符频数矩阵,在单个类中实现了 tokenization (字符级+词级分词)、n-grams、剔除停用词、筛选高频词和 occurrence counting (频数统计)

TfidfTransformer:将词频/字符频数矩阵转换为标准化的 tf 或 tf-idf 矩阵,Tf 表示词频、而 tf-idf 表示词频乘以逆文档频率,常用于文本分类。

TfidfVectorizer:将原始文档集合转换为tf-idf 特征矩阵,将 CountVectorizer 和TfidfTransformer的所有功能组合在一个模型中。

实际应用结果如下图(2-grams):

图片

import warnings 
warnings.filterwarnings('ignore')
import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer,TfidfVectorizer

3.初始化词频向量/tf_idf训练参数

由于存在功能组合的问题,TfidfVectorizer参数=CountVectorizer参数+TfidfTransformer参数,因此初始化参数函数将三部分参数汇总,通过设置传参label,用于确定所需要返回的参数字典。

def init_params(label='TfidfVectorizer'):
  params_count={
      'analyzer': 'word',  # 取值'word'-分词结果为词级、'char'-字符级(结果会出现he is,空格在中间的情况)、'char_wb'-字符级(以单词为边界),默认值为'word'
      'binary': False,  # boolean类型,设置为True,则所有非零计数都设置为1.(即,tf的值只有0和1,表示出现和不出现)
      'decode_error': 'strict',
      'dtype': np.float64, # 输出矩阵的数值类型
      'encoding': 'utf-8',
      'input': 'content', # 取值filename,文本内容所在的文件名;file,序列项必须有一个'read'方法,被调用来获取内存中的字节;content,直接输入文本字符串
      'lowercase': True, # boolean类型,计算之前是否将所有字符转换为小写。
      'max_df': 1.0, # 词汇表中忽略文档频率高于该值的词;取值在[0,1]之间的小数时表示文档频率的阈值,取值为整数时(>1)表示文档频数的阈值;如果设置了vocabulary,则忽略此参数。
      'min_df': 1, # 词汇表中忽略文档频率低于该值的词;取值在[0,1]之间的小数时表示文档频率的阈值,取值为整数时(>1)表示文档频数的阈值;如果设置了vocabulary,则忽略此参数。
      'max_features': None, # int或 None(默认值).设置int值时建立一个词汇表,仅用词频排序的前max_features个词创建语料库;如果设置了vocabulary,则忽略此参数。
      'ngram_range': (1, 2),  # 要提取的n-grams中n值范围的下限和上限,min_n <= n <= max_n。
      'preprocessor': None, # 覆盖预处理(字符串转换)阶段,同时保留标记化和 n-gram 生成步骤。仅适用于analyzer不可调用的情况。
      'stop_words': 'english', # 仅适用于analyzer='word'。取值english,使用内置的英语停用词表;list,自行设置停停用词列表;默认值None,不会处理停用词
      'strip_accents': None,
      'token_pattern': '(?u)\\b\\w\\w+\\b', # 分词方式、正则表达式,默认筛选长度>=2的字母和数字混合字符(标点符号被当作分隔符)。仅在analyzer='word'时使用。
      'tokenizer': None, # 覆盖字符串标记化步骤,同时保留预处理和 n-gram 生成步骤。仅适用于analyzer='word'
      'vocabulary': None, # 自行设置词汇表(可设置字典),如果没有给出,则从输入文件/文本中确定词汇表
  }
  params_tfidf={
      'norm': None, # 输出结果是否标准化/归一化。l2:向量元素的平方和为1,当应用l2范数时,两个向量之间的余弦相似度是它们的点积;l1:向量元素的绝对值之和为1
      'smooth_idf': True, # 在文档频率上加1来平滑 idf ,避免分母为0
      'sublinear_tf': False, # 应用次线性 tf 缩放,即将 tf 替换为 1 + log(tf)
      'use_idf': True, # 是否计算idf,布尔值,False时idf=1。
  }
  if label=='CountVectorizer':
      return params_count
  elif label=='TfidfTransformer':
      return params_tfidf
  elif label=='TfidfVectorizer':
      params_count.update(params_tfidf)
      return params_count

4.CountVectorizer训练及应用函数

def CountVectorizer_train(train_data,params):
    cv = CountVectorizer(**params)
    # 输入训练集矩阵,每行表示一个文本
    
    # 训练,构建词汇表以及词项idf值,并将输入文本列表转成VSM矩阵形式
    cv_fit = cv.fit_transform(train_data)
    return tv
def CountVectorizer_apply(model):
    print('词汇表')
    print(model.vocabulary_)
    print('------------------------------')
    
    print('特证名/词汇列表')
    print(model.get_feature_names())
    print('------------------------------')
    
    print('idf_列表')
    print(model.idf_)
    print('------------------------------')
    
    data=['Tokyo Japan Chinese']
    print('{} 文本转化VSM矩阵'.format(data))
    print(model.transform(data).toarray())
    print('------------------------------')
    
    print('转化结果输出为dataframe')
    print(pd.DataFrame(model.transform(data).toarray(),columns=model.get_feature_names()))
    print('------------------------------')

    print('model参数查看')
    print(model.get_params())
    print('------------------------------')

5.CountVectorizer使用

train_data = ["Chinese Beijing Chinese",
              "Chinese Chinese Shanghai",
              "Chinese Macao",
              "Tokyo Japan Chinese"]

params=init_params('CountVectorizer')
cv_model=CountVectorizer_train(train_data,params)
CountVectorizer_apply(cv_model)

查看结果可以发现,VSM矩阵并不是词频统计,其实是tf-idf的结果。

图片

6.TfidfTransformer训练及应用函数

def TfidfTransformer_train(train_data,params):
    tt = TfidfTransformer(**params)
    tt_fit = tt.fit_transform(train_data)
    return tt
def TfidfTransformer_apply(model):
    print('idf_列表')
    print(model.idf_)
    print('------------------------------')
    
    data=[[1, 1, 0, 2, 1, 1, 0, 1]]
    print('词频列表{} 转化VSM矩阵'.format(data))
    print(model.transform(data).toarray())
    print('------------------------------')
    
    print('model参数查看')
    print(model.get_params())
    print('------------------------------')

train_data=[[1, 1, 1, 0, 1, 1, 1, 0],
            [1, 1, 0, 1, 1, 1, 0, 1]]

params=init_params('TfidfTransformer')
tt_model=TfidfTransformer_train(train_data,params)
TfidfTransformer_apply(tt_model)

7.TfidfTransformer训练及应用函数

def TfidfVectorizer_train(train_data,params):
    tv = TfidfVectorizer(**params)
    # 输入训练集矩阵,每行表示一个文本
    
    # 训练,构建词汇表以及词项idf值,并将输入文本列表转成VSM矩阵形式
    tv_fit = tv.fit_transform(train_data)
    return tv
def TfidfVectorizer_apply(tv_model):
    print('tv_model词汇表')
    print(tv_model.vocabulary_)
    print('------------------------------')
    
    print('tv_model特证名/词汇列表')
    print(tv_model.get_feature_names())
    print('------------------------------')
    
    print('idf_列表')
    print(tv_model.idf_)
    print('------------------------------')
    
    data=['Tokyo Japan Chinese']
    print('{} 文本转化VSM矩阵'.format(data))
    print(tv_model.transform(data).toarray())
    print('------------------------------')
    
    print('转化结果输出为dataframe')
    print(pd.DataFrame(tv_model.transform(data).toarray(),columns=tv_model.get_feature_names()))
    print('------------------------------')
    
    print('tv_model参数查看')
    print(tv_model.get_params())
    print('------------------------------')
    

train_data = ["Chinese Beijing Chinese",
              "Chinese Chinese Shanghai",
              "Chinese Macao",
              "Tokyo Japan Chinese"]

params=init_params('TfidfVectorizer')
tv_model=TfidfVectorizer_train(train_data,params)
TfidfVectorizer_apply(tv_model)

  将train_data的tf-idf矩阵转化为dataframe结果:

pd.DataFrame(tv_model.transform(train_data).toarray(),columns=tv_model.get_feature_names())

图片

 

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

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

相关文章

【刷题】双指针进阶

请看入门篇 &#xff1a;双指针入门 送给我们一句话&#xff1a; 如今我努力奔跑&#xff0c;不过是为了追上那个曾经被寄予厚望的自己 —— 约翰。利文斯顿 双指针进阶 Leetcode 611 有效三角形的个数Leetcode LCR179.查找总价格为目标值的两个商品Leetcode 15.三数之和Thanks…

uniapp中人脸识别图片并圈起人脸

效果如上&#xff0c;我用的是阿里云的人脸识别。首先&#xff0c;我们先封装一个阿里云的请求js文件 faceRecognition.js import CryptoJS from crypto-js//SignatureNonce随机数字 function signNRandom() {const Rand Math.random()const mineId Math.round(Rand * 1000…

UE5 android打包

下载安装JDK https://repo.huaweicloud.com/java/jdk/https://repo.huaweicloud.com/java/jdk/ 选择对应的jdk版本 配置环境变量 编辑Path 验证是否成功 java -version 安装Android Studio https://developer.android.google.cn/studio?hlzh-cnhttps://developer.androi…

EMQX 4.0和EMQX 5.0集群架构实现1亿MQTT连接哪些改进

EMQX 5.0水平扩展能力得到了指数级提升&#xff0c;能够更可靠地承载更大规模的物联网设备连接量。 在EMQX5.0正式发布前的性能测试中&#xff0c;我们通过一个23节点的EMQX集群&#xff0c;全球首个达成了1亿MQTT连接每秒100万消息吞吐&#xff0c;这也使得EMQX 5.0成为目前为…

【C++ 设计模式】简单工厂模式

文章目录 前言一、简单工厂模式是什么&#xff1f;二、实现原理三、UML类图四、简单工厂模式具体代码总结 前言 在软件开发中&#xff0c;设计模式是解决特定问题的可复用解决方案。其中&#xff0c;简单工厂模式是一种创建型设计模式&#xff0c;旨在封装对象的创建过程&…

IDEA开启Run Dashboard

1、Run Dashboard是什么&#xff0c;为什么要使用 Run Dashboard 是 IntelliJ IDEA 中的一个工具窗口&#xff0c;用于管理和监视项目中正在运行的应用程序和配置。它提供了一种集中管理运行和调试过程的方式&#xff0c;可以让开发人员更方便地查看和控制正在运行的应用程序。…

2 Redis的安装与配置

这里是要将 Redis 安装到 Linux 系统中。 1.1 Redis 的安装 1.1.1 克隆并配置主机 修改主机名&#xff1a;/etc/hostname修改网络配置&#xff1a;/etc/sysconfig/network-scripts/ifcfg-ens33 1.1.2 安装前的准备工作 &#xff08;1 &#xff09;安装 gcc &#xff08;2…

如何从 Mac 电脑外部硬盘恢复删除的数据文件

本文向您介绍一些恢复 Mac 外置硬盘数据的快速简便的方法。 Mac 的内部存储空间通常不足以存储所有数据。因此&#xff0c;许多用户通过外部驱动器扩展存储或创建数据备份。然而&#xff0c;与几乎所有其他设备一样&#xff0c;从外部硬盘驱动器丢失有价值的数据并不罕见。由于…

数据库是什么?数据库连接、管理与分析工具推荐

一、数据库是什么&#xff1f; 数据库是一种结构化的数据存储系统&#xff0c;用于有效地组织、存储和管理大量的数据。它是一个集中化的数据存储库&#xff0c;通常由一个或多个数据表组成&#xff0c;每个数据表包含多个行和列&#xff0c;用于存储特定类型的数据。数据表中…

SQLiteC/C++接口详细介绍之sqlite3类(七)

上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;六&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍之sqlite3类&#xff08;八&#xff09;&#xff08;未发表&#xff09; 22.sqlite3_create_collation、sqlite3_create_collation16和sqlite3_creat…

【java工具】Maven的下载配置+setting配置(以3.9.6为例)

本人正在学习spring&#xff0c;还是个小白&#xff0c;也是跟着网课和各种资料学&#xff0c;光学习spring项目的各种配置就花了我不少时间QWQ。在学习spring的每个阶段&#xff0c;我会做好技术总结&#xff0c;不定期分享出来&#xff0c;希望对你有所帮助&#xff0c;有问题…

【Node.js从基础到高级运用】十二、身份验证与授权:JWT

身份验证与授权是现代Web应用中不可或缺的部分。了解如何在Node.js应用中实施这些机制&#xff0c;将使你能够构建更安全、更可靠的应用程序。本文将引导你通过使用JWT实现用户注册、登录和权限控制的过程。 JWT&#xff08;Json Web Token&#xff09; JWT是一种用于双方之间…

COX回归影响因素分析的基本过程与方法

在科学研究中&#xff0c;经常遇到分类的结局&#xff0c;主要是二分类结局&#xff08;阴性/阳性&#xff1b;生存/死亡&#xff09;&#xff0c;研究者可以通过logistic回归来探讨影响结局的因素&#xff0c;但很多时候logistic回归方法无法使用。如比较两种手段治疗新冠肺炎…

报表生成器FastReport .Net用户指南:关于脚本(上)

FastReport的报表生成器&#xff08;无论VCL平台还是.NET平台&#xff09;&#xff0c;跨平台的多语言脚本引擎FastScript&#xff0c;桌面OLAP FastCube&#xff0c;如今都被世界各地的开发者所认可&#xff0c;这些名字被等价于“速度”、“可靠”和“品质”,在美国&#xff…

hive-批量导出表结构,导入表结构

1、导出hive表结构 datastudio可以连接hive库&#xff0c;通过show databases 语句可以显示hive下建了多少数据库名。 使用use 数据库名&#xff0c;进入某个数据库下&#xff0c;通过show tables可显示该数据库下建了多少张表。 将所有库的表数据整理成库名.表名的形式放入…

python基于flask考研学习交流系统30vy7附源码django

考研在线学习与交流平台根据实际情况分为前后台两部分&#xff0c;前台部分主要是让用户使用的&#xff0c;包括用户的注册登录&#xff0c;首页&#xff0c;课程信息&#xff0c;在线讨论&#xff0c;系统公告&#xff0c;后台管理&#xff0c;个人中心等功能&#xff1b;后台…

Qt_vc++崩溃日志分析

环境 Clion &#xff1a;2019.3.6 Qt &#xff1a;5.9.6&#xff08;vc2015&#xff09; 编译工具&#xff1a;vs2015 update3 崩溃日志收集 自行百度&#xff0c;会查到很多&#xff0c;一下代码仅供参考&#xff08;来自https://blog.csdn.net/weixin_45571586/article/…

java的23种设计模式02-创建型模式02-抽象工厂方法

一、抽象工厂方法 1-1、抽象工厂方法的定义 抽象工厂模式是一个比较复杂的创建型模式。 抽象工厂模式和工厂方法不太一样&#xff0c;它要解决的问题比较复杂&#xff0c;不但工厂是抽象的&#xff0c;产品是抽象的&#xff0c;而且&#xff1a;有多个产品需要创建&#xff…

HTML案例-2.标签综合练习

目录 效果 知识点 1.图像标签 2.链接标签 3.锚点定位 4.base标签 源码 页面1 页面2 效果 知识点 1.图像标签 <img src="图像URL" /> 单标签 属性 属性值 描述 src URL 图像的路径 alt 文本

导入csv文件表头字符串出现zwnbsp字符(零宽度空白字符)处理

导入csv文件表头字符串出现zwnbsp字符&#xff08;零宽度空白字符&#xff09;处理 【1】现象描述【2】问题分析【3】原因分析【4】问题解决&#xff08;1&#xff09;修改文件的编码格式&#xff08;2&#xff09;在代码中处理 【1】现象描述 通过easyexcel导入csv文件&#…