字典特征提取、文本特征提取、jieba分词处理、tf-idf文本特征提取概念及代码实现

news2025/7/4 19:23:57

一、特征提取

特征提取:将任意数据(如文本或图像)转换为可用于机器学习的数字特征,特征值化是为了计算机更好的去理解数据

特征提取api:sklearn.feature_extraction

特征提取分类

  1. 字典特征提取(特征离散化)
  2. 文本特征提取
  3. 图像特征提取

二、字典特征提取

  • sklearn.feature_extraction.DictVectorizer(sparse=True,…):对字典数据进行特征值化
    • DictVectorizer.fit_transform(X):返回sparse矩阵,X为字典或包含字典的迭代器返回值
    • DictVectorizer.get_feature_names_out():返回类别名称
from sklearn.feature_extraction import DictVectorizer
def dict_demo():
    """
    对字典类型的数据进行特征抽取
    :return: None
    """
    data = [{'city': '北京', 'temperature': 100},
            {'city': '上海', 'temperature': 60},
            {'city': '深圳', 'temperature': 30}]
    transfer = DictVectorizer()  # 实例化一个转换器类
    # transfer = DictVectorizer(sparse=False)  # 实例化一个转换器类
    data = transfer.fit_transform(data)  # 调用fit_transform方法输入数据并转换(注意返回格式)
    print("返回的结果:\n", data)
    print("特征名字:", transfer.get_feature_names_out())     # 打印特征名字
    return None
if __name__ == '__main__':
    dict_demo()

输出:
返回的结果:
   (0, 1)	1.0
  (0, 3)	100.0
  (1, 0)	1.0
  (1, 3)	60.0
  (2, 2)	1.0
  (2, 3)	30.0
特征名字: ['city=上海' 'city=北京' 'city=深圳' 'temperature']
-----------------------------
指定sparse=False后的输出:
返回的结果:
 [[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]
特征名字: ['city=上海' 'city=北京' 'city=深圳' 'temperature']

one-hot热编码,为每个类别生成一个布尔值,对于特征当中存在类别信息的一般都会做one-hot编码处理

三、文本特征提取

  • sklearn.feature_extraction.text.CountVectorizer(stop_words=[]):对文本数据进行特征值化,返回词频矩阵,stop_words为停用词,即不想统计的词,单个字母和标点符号不做统计

    • CountVectorizer.fit_transform(X):X为文本或包含文本字符串的可迭代对象,返回sparse矩阵
    • CountVectorizer.get_feature_names_out():返回值单词列表
  • sklearn.feature_extraction.text.TfidfVectorizer

应用举例如下

from sklearn.feature_extraction.text import CountVectorizer

def text_count_demo():
    data = ["life is short,i like like python", "life is too long,i dislike python"]
    # 实例化一个转换器类
    # transfer = CountVectorizer(sparse=False) # 注意,没有sparse这个参数
    transfer = CountVectorizer()
    # 调用fit_transform方法输入数据并转换 (注意返回格式,利用toarray()进行sparse矩阵转换array数组)
    transfer_data = transfer.fit_transform(data)
    print('transfer_data值为:\n', transfer_data)
    print("文本特征抽取的结果:\n", transfer_data.toarray())
    print("返回特征名字:\n", transfer.get_feature_names_out())
    return None
if __name__ == '__main__':
    text_count_demo()

输出:
transfer_data值为:
   (0, 2)	1
  (0, 1)	1
  (0, 6)	1
  (0, 3)	2
  (0, 5)	1
  (1, 2)	1
  (1, 1)	1
  (1, 5)	1
  (1, 7)	1
  (1, 4)	1
  (1, 0)	1
文本特征抽取的结果:
 [[0 1 1 2 0 1 1 0]
 [1 1 1 0 1 1 0 1]]
返回特征名字:
 ['dislike' 'is' 'life' 'like' 'long' 'python' 'short' 'too']

--------------------------------中文----------------------------------
将data改为: data = ["人 生 苦短,我喜欢 Python", "人生太长,我不喜欢Python"]
输出如下:
transfer_data值为:
   (0, 4)	1
  (0, 3)	1
  (0, 0)	1
  (1, 1)	1
  (1, 2)	1
文本特征抽取的结果:
 [[1 0 0 1 1]
 [0 1 1 0 0]]
返回特征名字:
 ['python' '人生太长' '我不喜欢python' '我喜欢' '苦短']

由上可知,英文默认以空格分隔来达到分词效果,中文以逗号或空格分隔,且不统计单个中文字符,即不支持中文分词

四、jieba分词处理

安装命令:pip install jieba
  • jieba.cut():返回词语组成的生成器
  • 使用
    • 准备句子,利用jieba.cut进行分词
    • 实例化CountVectorizer
    • 将分词结果变成字符串当作fit_transform的输入值

举例如下

from sklearn.feature_extraction.text import CountVectorizer
import jieba

def cut_words(text):
    result = list(jieba.cut(text))
    print('list(jieba.cut(text))结果为:', result)
    txt = ' '.join(result)
    return txt
def text_count_demo():  # 对中文进行特征提取
    data = ["愿中国青年都能摆脱冷气,只是向上走,不必听自暴自弃者流的话。能做事的做事,能发声的发声。", "有一分热,发一分光,就令萤火一般,也可以在黑暗里发一点光,不必等候炬火。此后如竟没有炬火:我便是唯一的光。"]
    txt_list = []
    for i in data:
        txt_list.append(cut_words(i))
    print('txt_list列表为:', txt_list)
    # 实例化一个转换器类
    # transfer = CountVectorizer(sparse=False) # 注意,没有sparse这个参数
    transfer = CountVectorizer()
    # 调用fit_transform方法输入数据并转换 (注意返回格式,利用toarray()进行sparse矩阵转换array数组)
    transfer_data = transfer.fit_transform(txt_list)
    # print('transfer_data值为:\n', transfer_data)
    print("文本特征抽取的结果:\n", transfer_data.toarray())
    print("返回特征名字:\n", transfer.get_feature_names_out())
    return None
if __name__ == '__main__':
    text_count_demo()

输出:
list(jieba.cut(text))结果为: ['愿', '中国', '青年', '都', '能', '摆脱', '冷气', ',', '只是', '向上', '走', ',', '不必', '听', '自暴自弃', '者', '流', '的话', '。', '能', '做事', '的', '做事', ',', '能', '发声', '的', '发声', '。']
list(jieba.cut(text))结果为: ['有', '一分', '热', ',', '发一分光', ',', '就', '令', '萤火', '一般', ',', '也', '可以', '在', '黑暗', '里发', '一点', '光', ',', '不必', '等候', '炬火', '。', '此后', '如竟', '没有', '炬火', ':', '我', '便是', '唯一', '的', '光', '。']
txt_list列表为: ['愿 中国 青年 都 能 摆脱 冷气 , 只是 向上 走 , 不必 听 自暴自弃 者 流 的话 。 能 做事 的 做事 , 能 发声 的 发声 。', '有 一分 热 , 发一分光 , 就 令 萤火 一般 , 也 可以 在 黑暗 里发 一点 光 , 不必 等候 炬火 。 此后 如竟 没有 炬火 : 我 便是 唯一 的 光 。']
文本特征抽取的结果:
 [[0 0 0 1 1 0 2 1 0 2 1 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0]
 [1 1 1 1 0 1 0 0 1 0 0 1 0 1 1 0 1 1 2 0 1 0 1 1 0 1]]
返回特征名字:
 ['一分' '一点' '一般' '不必' '中国' '便是' '做事' '冷气' '发一分光' '发声' '只是' '可以' '向上' '唯一'
 '如竟' '摆脱' '此后' '没有' '炬火' '的话' '等候' '自暴自弃' '萤火' '里发' '青年' '黑暗']

五、tf-idf文本特征提取

  • TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类
  • TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度
  • 重要性:分类机器学习算法进行文章分类中前期数据处理方式
  • 公式
    • 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
    • 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量,某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到

 \operatorname{tfidf}_{\mathrm{i}, \mathrm{j}}=\mathrm{tf}_{\mathrm{i}, \mathrm{j}} \times \operatorname{idf}_{\mathrm{i}}

其得出结果可以理解为重要程度 

举例:如一篇文章的总词语数是100个,而词语"非常"出现了5次,那么"非常"一词在该文件中的词频就是5/100=0.05。而计算文件频率(IDF)的方法是以文件集的文件总数,除以出现"非常"一词的文件数。所以,如果"非常"一词在1,0000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是lg(10,000,000 / 1,0000)=3。最后"非常"对于这篇文档的tf-idf的分数为0.05 * 3=0.15

举例

from sklearn.feature_extraction.text import TfidfVectorizer
import jieba

def cut_words(text):
    result = list(jieba.cut(text))
    print('list(jieba.cut(text))结果为:', result)
    txt = ' '.join(result)
    return txt
def text_count_demo():  # 对中文进行特征提取
    data = ["愿中国青年都能摆脱冷气,只是向上走,不必听自暴自弃者流的话。能做事的做事,能发声的发声。", "有一分热,发一分光,就令萤火一般,也可以在黑暗里发一点光,不必等候炬火。此后如竟没有炬火:我便是唯一的光。"]
    txt_list = []
    for i in data:
        txt_list.append(cut_words(i))
    print('txt_list列表为:', txt_list)
    # 实例化一个转换器类
    transfer = TfidfVectorizer()
    # 调用fit_transform方法输入数据并转换 (注意返回格式,利用toarray()进行sparse矩阵转换array数组)
    transfer_data = transfer.fit_transform(txt_list)
    # print('transfer_data值为:\n', transfer_data)
    print("文本特征抽取的结果百分占比为:\n", transfer_data.toarray())
    print("返回特征名字:\n", transfer.get_feature_names_out())
    return None
if __name__ == '__main__':
    text_count_demo()

输出:
list(jieba.cut(text))结果为: ['愿', '中国', '青年', '都', '能', '摆脱', '冷气', ',', '只是', '向上', '走', ',', '不必', '听', '自暴自弃', '者', '流', '的话', '。', '能', '做事', '的', '做事', ',', '能', '发声', '的', '发声', '。']
list(jieba.cut(text))结果为: ['有', '一分', '热', ',', '发一分光', ',', '就', '令', '萤火', '一般', ',', '也', '可以', '在', '黑暗', '里发', '一点', '光', ',', '不必', '等候', '炬火', '。', '此后', '如竟', '没有', '炬火', ':', '我', '便是', '唯一', '的', '光', '。']
txt_list列表为: ['愿 中国 青年 都 能 摆脱 冷气 , 只是 向上 走 , 不必 听 自暴自弃 者 流 的话 。 能 做事 的 做事 , 能 发声 的 发声 。', '有 一分 热 , 发一分光 , 就 令 萤火 一般 , 也 可以 在 黑暗 里发 一点 光 , 不必 等候 炬火 。 此后 如竟 没有 炬火 : 我 便是 唯一 的 光 。']
文本特征抽取的结果百分占比为:
 [[0.         0.         0.         0.17512809 0.24613641 0.
  0.49227283 0.24613641 0.         0.49227283 0.24613641 0.
  0.24613641 0.         0.         0.24613641 0.         0.
  0.         0.24613641 0.         0.24613641 0.         0.
  0.24613641 0.        ]
 [0.23245605 0.23245605 0.23245605 0.1653944  0.         0.23245605
  0.         0.         0.23245605 0.         0.         0.23245605
  0.         0.23245605 0.23245605 0.         0.23245605 0.23245605
  0.4649121  0.         0.23245605 0.         0.23245605 0.23245605
  0.         0.23245605]]
返回特征名字:
 ['一分' '一点' '一般' '不必' '中国' '便是' '做事' '冷气' '发一分光' '发声' '只是' '可以' '向上' '唯一'
 '如竟' '摆脱' '此后' '没有' '炬火' '的话' '等候' '自暴自弃' '萤火' '里发' '青年' '黑暗']

学习导航:http://xqnav.top

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

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

相关文章

小蓝本 第一本《因式分解技巧》 第九章 待定系数法 笔记 (第九天)

小蓝本 第一本《因式分解技巧》 第九章 待定系数法 笔记 (第九天)前言待定系数法二次因式一次因式分解缺陷二次因式分解方法注意既约的情况拓展习题9题目题解前言 已经进行了9天,第八章有一点烧脑,但感觉还是很不错的&#xff0c…

Python类继承:深入了解

引言 前段时间刚好学习了,C中类方面的内容,发现和Python中有许多不同之处,尤其是在类的继承这一块,今天有空,正好写篇文章,记录一下有兴趣的东西,也算是对Python的一个复习。 1 C中的构造析构函…

设计模式学习(二):Observer观察者模式

一、什么是Observer模式在Observer模式中,当观察对象的状态发生变化时,会通知给观察者。Observer模式适用于根据对象状态进行相应处理的场景。简单一句话概况就是:观察者会发送观察对象状态变化的通知。二、Observer模式示例代码下面示例程序…

10种顶流聚类算法Python实现(附完整代码)

目录 前言 一、聚类 二、聚类算法 三、聚类算法示例 1、库安装 2、聚类数据集 3、亲和力传播 4、聚合聚类 5、BIRCH 6、DBSCAN 7、K均值 8、Mini-Batch K-均值 9、均值漂移聚类 10、OPTICS 11、光谱聚类 12、高斯混合模型 三、总结 前言 今天给大家分享一篇关…

虚幻五引擎的出现会不会导致技术美术需求的下降?

先来结论:不会,虚幻五引擎的出现反而会致使技术美术需求的增加。 UE5主要引入的两大新技术 Nanite ​ 渲染技术Nanite,能够直接在游戏里表现出影视级别的超高精度模型。在演示中有一个古代雕塑的镜头,使用的模型超过3300万多边形…

Spring MVC阶段测试

Spring MVC阶段测试 1.新建Maven项目,静态资源文件,如JS、CSS、图片应存放在( C )目录下。 A、src/main/java B、src/test/java C、src/main/resources/static D、src/main/resources/templates 2.新建Maven项目&#xff0c…

无风扇工控主机支持一路CAN总线

CAN 接口如图所示,输入如下命令: ifconfig -a //查看所有网卡 如果 FlexCAN 驱动工作正常的话就会看到 CAN 对应的网卡接口,如图。从图中可 以看出,有一个名为“can0”的网卡,这个就是 BL302 板上的 CAN1 接口对应的 c…

Selenium用法详解【设置元素等待】【JAVA爬虫】

简介本文主要介绍如何使用java代码利用Selenium操作浏览器,某些网页元素加载慢,如何操作元素就会把找不到元素的异常,此时需要设置元素等待,等待元素加载完,再操作。设置元素等待很多页面都使用 ajax 技术,…

Python - Flask 整合 UEditor

1. 引言 UEditor 是由百度「FEX前端研发团队」开发的所见即所得富文本 web 编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码 官方文档地址:http://fex.baidu.com/ued…

软件构造与与体系结构习题

软件构造与与体系结构习题第一章第二章第三章第一章 1.下面关于类的描述正确的是?A A、类是一组相似事物的统称。 B、一个事物可以称为一类。 C、两个完全相同的事物可以称为一类。 D、“奥巴马”和“特朗普”可以统称为“奥巴马”。 解析: 类&am…

【Python笔记】课时01:Python3+Pip环境配置(python安装)

1. 不同环境下安装python windows(不好安装相关python包,不推荐)anaconda(科学计算环境 python 相关python包)(推荐)linux(如 ubuntu)macos 2.1. windows 安装 pytho…

前端性能优化(五):webpack构建优化

目录 一:webpack的优化配置 1.1.Tree-shaking 1.2.JS压缩 1.3.作用域提升 1.4.Babel 优化配置 二:webpack的依赖优化 2.1.noParse(不解析) 2.2.DllPlugin 三:webpack 细节优化 四:webpack的资源压…

Linux和windows文件互传

文章目录一、方法1:设置共享剪切版二、方法2:使用FileZilla软件1.开启 Ubuntu 下的 FTP 服务2.查看Ubuntu的ip地址2.windows安装FileZilla注意一、方法1:设置共享剪切版 在Ubuntu20版本中好像已经自动实现 本人使用的是旧版18.4&#xff0c…

【每日十分钟前端】基础篇21,为什么HTTPS更安全(SSL原理)、单行/多行文本溢出的省略样式、DOM常见的操作有哪些

1、[HTML]为什么HTTPS更安全(SSL原理):对称加密、非对称加密、摘要、数字签名、数字证书。 2、[CSS]单行/多行文本溢出的省略样式。 3、[JS]DOM常见的操作有哪些? 1、[HTML]为什么HTTPS更安全(SSL原理): 对称加密:协商密钥对数据…

异常检测实战应用案例精讲-【工具篇】时序异常检测TODS

前言 时间序列异常值检测旨在识别数据中意外或罕见的实例。作为数据分析最重要的任务之一,异常值检测在时间序列数据上有多种应用,例如欺诈检测、故障检测和网络安全攻击检测。例如,雅虎 和微软 已经建立了自己的时间序列异常值检测服务来监控他们的业务数据并触发异常值…

Hudi、Iceberg底层索引Z-Order

目录 第一部分 数据库领域的Z-Order 1.1 最左匹配原则 1.2 Z-Order动机 1.3 OLTP 1.4 OLAP 第二部分 Z-Order效率分析 2.1 按照A进行查询 2.2 按照B进行查询 2.3 总结 第三部分 Z-Order缺陷 第四部分 总结及建议 参考文章 Z-Order最早是1966提出的一项将多维数据映…

数据分析-深度学习 Day1

目录:第一节 机器学习&深度学习介绍第二节 机器学习攻略一、机器学习的框架二、模型训练攻略三、针对Optimization Issue的优化,类神经网络训练不起来怎么办(一) 局部最优点和鞍点(二) 批处理和momentum(三) 自动调节学习率Learning rate(四) 损失函…

cmake的常用语法

cmake 的注释 # 注释 #[[大段注释 第二行注释 第三行注释]]cmake的log -message cmake messagemessage(arg1 arg2 arg3 arg4) # 会自动连起message 多级别输出 message(FATAL_ERROR,"abc") # 最严重的错误,直接停止执行 message(SEND_ERROR,"aba…

NOP+终于来了,看看蔚来随NOP+释放的数据和思考

1. 行驶数据 ADAS功能累计用户行驶里程4.9亿公里;NT1的NOP功能累计行驶2.3亿公里;NT2的Pilot功能累计行驶了1700万公里。2. 统一辅助驾驶软件架构原来NOP将直路行驶和匝道作为两个场景开发,场景分割思路了城区和低速就变得无穷无尽。新NOP是以…

K_A11_001 基于STM32等单片机驱动DHT11 串口与OLED0.96双显示

K_A11_001 基于STM32等单片机驱动DHT11 串口与OLED0.96双显示一、资源说明二、基本参数1.参数2.引脚说明三、驱动说明时序对应程序:四、部分代码说明1、接线说明1.1、STC89C52RCDHT11模块1.2、STM32F103C8T6DHT11模块五、基础知识学习与相关资料下载六、视频效果展示与程序资料…