用Python开始机器学习(5:文本特征抽取与向量化)

NLP文本信息向量化之特征提取 TF-IDF 信息检索中最常用的一种文本关键信息表示法 基本思想:若在一个文档中出现的频率高,且在语料库中其它文本中很少出现,则人文这个词库有很好的区分能力。 词频TF:Term Frequency,衡量一个term在文档中出现的有多频繁,越频繁,其重要性可能越高。 考虑到文章长度差异,需要对词频做标准化: TF(t)=(t出现在文档中的次数)/(文档中term总数) TF(t)=(t出现在文... 阅读详情

假设我们刚看完诺兰的大片《星际穿越》,设想如何让机器来自动分析各位观众对电影的评价到底是“赞”(positive)还是“踩”(negative)呢?

这类问题就属于情感分析问题。这类问题处理的第一步,就是将文本转换为特征。

因此,这章我们只学习第一步,如何从文本中抽取特征,并将其向量化。

由于中文的处理涉及到分词问题,本文用一个简单的例子来说明如何使用Python的机器学习库,对英文进行特征提取。

1、数据准备

Python的sklearn.datasets支持从目录读取所有分类好的文本。不过目录必须按照一个文件夹一个标签名的规则放好。比如本文使用的数据集共有2个标签,一个为“net”,一个为“pos”,每个目录下面有6个文本文件。目录如下所示:
neg
    1.txt
    2.txt
    ......

pos
    1.txt
    2.txt
    ....

12个文件的内容汇总起来如下所示:

neg:
	shit.
	waste my money.
	waste of money.
	sb movie.
	waste of time.
	a shit movie.
pos:
	nb! nb movie!
	nb!
	worth my money.
	I love this movie!
	a nb movie.
	worth it!

2、文本特征

如何从这些英文中抽取情感态度而进行分类呢?

最直观的做法就是抽取单词。通常认为,很多关键词能够反映说话者的态度。比如上面这个简单的数据集,很容易发现,凡是说了“shit”的,就一定属于neg类。

当然,上面数据集是为了方便描述而简单设计的。现实中一个词经常会有穆棱两可的态度。但是仍然有理由相信,某个单词在neg类中出现的越多,那么他表示neg态度的概率越大。

同样我们注意到有些单词对情感分类是毫无意义的。比如上述数据中的“of”,“I”之类的单词。这类词有个名字,叫“Stop_Word“(停用词)。这类词是可以完全忽略掉不做统计的。显然忽略掉这些词,词频记录的存储空间能够得到优化,而且构建速度也更快。

把每个单词的词频作为重要的特征也存在一个问题。比如上述数据中的”movie“,在12个样本中出现了5次,但是出现正反两边次数差不多,没有什么区分度。而”worth“出现了2次,但却只出现在pos类中,显然更具有强烈的刚晴色彩,即区分度很高。

因此,我们需要引入TF-IDF(Term Frequency-Inverse Document Frequency,词频和逆向文件频率)对每个单词做进一步考量。

TF(词频)的计算很简单,就是针对一个文件t,某个单词Nt 出现在该文档中的频率。比如文档“I love this movie”,单词“love”的TF为1/4。如果去掉停用词“I"和”it“,则为1/2。

IDF(逆向文件频率)的意义是,对于某个单词t,凡是出现了该单词的文档数Dt,占了全部测试文档D的比例,再求自然对数。

比如单词“movie“一共出现了5次,而文档总数为12,因此IDF为ln(5/12)。

很显然,IDF是为了凸显那种出现的少,但是占有强烈感情色彩的词语。比如“movie”这样的词的IDF=ln(12/5)=0.88,远小于“love”的IDF=ln(12/1)=2.48。

TF-IDF就是把二者简单的乘在一起即可。这样,求出每个文档中,每个单词的TF-IDF,就是我们提取得到的文本特征值。

3、向量化

有了上述基础,就能够将文档向量化了。我们先看代码,再来分析向量化的意义:

# -*- coding: utf-8 -*-
import scipy as sp
import numpy as np
from sklearn.datasets import load_files
from sklearn.cross_validation import train_test_split
from sklearn.feature_extraction.text import  TfidfVectorizer

'''加载数据集,切分数据集80%训练,20%测试'''
movie_reviews = load_files('endata')  
doc_terms_train, doc_terms_test, y_train, y_test\
    = train_test_split(movie_reviews.data, movie_reviews.target, test_size = 0.3)
    
'''BOOL型特征下的向量空间模型,注意,测试样本调用的是transform接口'''
count_vec = TfidfVectorizer(binary = False, decode_error = 'ignore',\
                            stop_words = 'english')
x_train = count_vec.fit_transform(doc_terms_train)
x_test  = count_vec.transform(doc_terms_test)
x       = count_vec.transform(movie_reviews.data)
y       = movie_reviews.target
print(doc_terms_train)
print(count_vec.get_feature_names())
print(x_train.toarray())
print(movie_reviews.target)
运行结果如下:

[b'waste of time.', b'a shit movie.', b'a nb movie.', b'I love this movie!', b'shit.', b'worth my money.', b'sb movie.', b'worth it!']
['love', 'money', 'movie', 'nb', 'sb', 'shit', 'time', 'waste', 'worth']
[[ 0.          0.          0.          0.          0.          0.   0.70710678  0.70710678  0.        ]
 [ 0.          0.          0.60335753  0.          0.          0.79747081   0.          0.          0.        ]
 [ 0.          0.          0.53550237  0.84453372  0.          0.          0.   0.          0.        ]
 [ 0.84453372  0.          0.53550237  0.          0.          0.          0.   0.          0.        ]
 [ 0.          0.          0.          0.          0.          1.          0.   0.          0.        ]
 [ 0.          0.76642984  0.          0.          0.          0.          0.   0.          0.64232803]
 [ 0.          0.          0.53550237  0.          0.84453372  0.          0.   0.          0.        ]
 [ 0.          0.          0.          0.          0.          0.          0.   0.          1.        ]]
[1 1 0 1 0 1 0 1 1 0 0 0]

python输出的比较混乱。我这里做了一个表格如下:


从上表可以发现如下几点:

1、停用词的过滤。

初始化count_vec的时候,我们在count_vec构造时传递了stop_words = 'english',表示使用默认的英文停用词。可以使用count_vec.get_stop_words()查看TfidfVectorizer内置的所有停用词。当然,在这里可以传递你自己的停用词list(比如这里的“movie”)

2、TF-IDF的计算。

这里词频的计算使用的是sklearn的TfidfVectorizer。这个类继承于CountVectorizer,在后者基本的词频统计基础上增加了如TF-IDF之类的功能。

我们会发现这里计算的结果跟我们之前计算不太一样。因为这里count_vec构造时默认传递了max_df=1,因此TF-IDF都做了规格化处理,以便将所有值约束在[0,1]之间。

3、count_vec.fit_transform的结果是一个巨大的矩阵。我们可以看到上表中有大量的0,因此sklearn在内部实现上使用了稀疏矩阵。本例子数据较小。如果读者有兴趣,可以试试机器学习科研工作者使用的真实数据,来自康奈尔大学:http://www.cs.cornell.edu/people/pabo/movie-review-data/。这个网站提供了很多数据集,其中有几个2M左右的数据库,正反例700个左右。这样的数据规模也不算大,1分钟内还是可以跑完的,建议大家试一试。不过要注意这些数据集可能存在非法字符问题。所以在构造count_vec时,传入了decode_error = 'ignore',以忽略这些非法字符。

上表的结果,就是训练8个样本的8个特征的一个结果。这个结果就可以使用各种分类算法进行分类了。

第09章 文本特征向量化 本章详细介绍了特征词转文本向量的方法、词袋模型与词集模型的计算方法、词频与逆词频的计算方法等内容。由于原始数据往往并不是数值型的(如字词列表),为满足数学模型的处理要求,这样就需要将文本特征词的数据进行向量化处理,即转换为数值向量格式。假设现有如下文档需转换为数字向量形式。文档1:“我来到成都,成都春熙路很开心”文档2:“今天在宽窄巷子耍了一天”文档1:[2, 0, 0, 1, 1, 0, 1]文档2:[0, 1, 1, 0, 0, 1, 0]... 阅读详情

相关推荐

从BOSS直聘到薪资预测:Python爬虫与机器学习实战

在数据驱动的招聘决策中,如何从公开平台高效获取职位信息并转化为薪资洞察,是很多数据分析师与HR面临的现实问题。爬虫技术负责从网页中提取结构化数据,机器学习模型则从历史数据中学习规律,预测未知样本的目标值。通过requests与XPath实现轻量级数据采集,配合特征工程把文本信息转为数值特征,再用随机森林算法训练回归模型,即可构建一套从数据采集到薪资预测的完整链路。此类方法可应用于招聘市场行情分析、企业薪酬对标、个人求职定价等场景,帮助用户快速摸清岗位薪资分布。以BOSS直聘数据分析师职位为例,详解爬虫抓取、

weixin_34416649的博客 620

【Python机器学习】文本特征提取及文本向量化讲解和实战(图文解释 附源码)

【Python机器学习】文本特征提取及文本向量化讲解和实战(图文解释 附源码)

showswoller的博客 5254

Python文本特征抽取与向量化算法学习

主要为大家详细介绍了Python文本特征抽取与向量化算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

了解一下Sklearn中的文本特征提取

文本特征提取 基于词袋的向量化 要知道,原始文本是不能直接被机器学习到的,因为机器通常需要以数值型的、定长的数据作为输入。 原始文本是字符串或字符串集合。 数值型、定长的数据是浮点型或整型的向量。 为了让原始为本转化成数值型地、定长的向量,sklearn提供了三种常用的工具: 令牌化字符串 基于词频的向量化 进行正则化或加权,使向量化的文本能包含一定的上下文信息。 以上三种工具存在一种递...

hustqb的博客 3532

(6)NUC980 SPI Nand 启动

方式一:下载到SPI-NAND-Flash中,这种方式可以将程序固化到SPIflash中,可以掉电保存。第二种方式下载到DDR中程序掉电丢失,但是DDR调试方便,时候调试的时候使用。之前的设置都是基于SD卡启动,今天测试一下是用SPI flash启动。方式二: 下载到DDR中,①设置为USB启动②下载到DDR中③运行。1:烧写BootLoader。

卤煮小鱼的博客 1754

深度解析中国支付清算体系

说起国之重器,不仅仅有 东风快递、渔16、渔17、渔18,还有另外一个国之重器-CNAPS2(中国支付清算体系)。 中国国内支付行业的发达水平、繁荣程度,不客气的讲,在全世界都是数一数二的,世界上最大的银行卡组织银联在中国,世界上交易量最大的网络零售支付清算体网联在中国。可以说现在我国经济的高速发展,离不开CNAPS2。

银行信息系统应用架构详解 2514

NLP自然语言处理——文本分类之特征提取

特征提取参考文献 参考文献 1、sklearn——CountVetorizer详解

Little_Yu的博客 4291

别再只会按按钮了!用NanoStat开源项目学ESP32硬件设计:BOOT与自动下载电路的避坑指南

本文通过NanoStat开源项目深入解析ESP32硬件设计中BOOT与自动下载电路的关键技术。从启动机制、电路设计陷阱到三极管选型,提供了一套完整的避坑指南和优化方案,帮助开发者提升设计可靠性和烧录效率。特别适合中级开发者学习ESP32硬件设计的精髓。

weixin_30296405的博客 440

用Python开始机器学习(5:文本特征抽取与向量化) sklearn

http://blog.youkuaiyun.com/lsldd/article/details/41520953 假设我们刚看完诺兰的大片《星际穿越》,设想如何让机器来自动分析各位观众对电影的评价到底是“赞”(positive)还是“踩”(negative)呢? 这类问题就属于情感分析问题。这类问题处理的第一步,就是将文本转换为特征。 因此,这章我们只学习第一步,如何从文本中抽取特征,并将其向量化

sherri_du的博客 3958

Seurat 单细胞转录组测序数据分析教程(三)——python(scanpy)

文章参考至,做了一个更详细的解读。本教程探讨了 scanpy 的可视化可能性,分为三个部分:嵌入的散点图(例如 UMAP、t-SNE)使用已知标记基因鉴定簇差异表达基因的可视化在本教程中,我们将使用来自 10x 的数据集,其中包含来自PBMC的 68k 个细胞。Scanpy 在其分布中包括该数据集的简化样本,该数据集仅包含 700 个细胞和 765 个高度可变的基因。该数据集已经过预处理和 UMAP 计算。在本教程中,我们还将使用以下文献标记:B细胞:CD79A、MS4A1。

coffeeii的博客 5828

深入解析FastDDS:SHM与DATA-SHARING传输层的性能对比与实现细节

本文深入对比了FastDDS中SHM与DATA-SHARING两种传输层的实现机制与性能差异。SHM采用端口化共享内存模型,存在两次数据拷贝;而DATA-SHARING通过共享历史实现真正的零拷贝,大幅降低延迟与CPU占用。文章结合实战测试数据,为机器人、自动驾驶等高实时性场景提供了关键的性能优化选型与配置指南。

weixin_28358083的博客 232

Python开始机器学习(文本特征抽取与向量化)

文本特征抽取与向量化假设我们刚看完沈腾主演的《夏洛特烦恼》,设想如何让机器来自动分析各位观众对电影的评价到底是“赞”(positive)还是“踩”(negative)呢?这类问题就属于情感分析问题。这类问题处理的第一步,就是将文本转换为特征。因此,这章我们只学习第一步,如何从文本中抽取特征,并将其向量化。由于中文的处理涉及到分词问题,本文用一个简单的例子来说明如何使用Python的机器学习库,对英文

perfectmanman的博客 3309

jetson nano网络配置(有线、无线、USB)

注意:本节内容使用Jetson nano B01 版本或Jetson nano ALT 版本安装方式相同,在安装无线网卡等设备时,由于线材和设备比较脆弱,需要轻拿轻放,接口连接不上时,需要重新对准接口在进行连接,不要强行连接。Jetson nano 需要连接网络来进行更多的操作,本节就来讲解Jetson nano 的三种网络连接方法。有线:我们可以使用网线连接Jetson nano 的RJ45 接口,实现联网。

m0_73841621的博客 1万+

NLP文本向量化技术选型指南:从BoW到BERT的实战决策逻辑

文本向量化是自然语言处理的基础环节,其本质是将离散语言符号映射为连续语义空间中的稠密向量,从而支撑相似度计算、分类、聚类等下游任务。核心原理在于利用词共现统计(如TF-IDF)、上下文预测(如Word2Vec)或深层双向注意力(如BERT),建模词汇间的语义关系与语境依赖。该技术直接决定模型对多义词(如‘苹果’)、反讽表达、专业术语等语言现象的理解能力,具有显著的技术价值。广泛应用于电商标题分类、客服情感分析、法律条款抽取、生物医学实体识别、谣言检测及跨语言文档聚类等真实场景。本文聚焦五种主流方法——Bag

weixin_30838873的博客 434

基于机器学习的网络入侵检测系统设计与实现

本文设计并实现了一个基于机器学习的网络入侵检测系统,采用随机森林模型结合KMM算法优化,使用CICIDS2017数据集进行训练。系统包含完整的数据预处理流程、特征工程、模型调优和远程部署方案。实验结果表明,该系统能有效识别多种网络攻击类型,在检测准确率和误报率方面表现优异。研究为网络安全防护提供了新的技术思路和实用工具,具有重要的应用价值。

huanghm88的专栏 318

试读源码在这里下载

试读文章的源码在这里下载。源码不做任何修改,重点重点重点:为了代码运行不报错,安装matlab 版本为 2021 及以上版本。matlab安装教程大家可以参考这个教程:手把手教你安装matlab软件。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 4306

Python机器学习:从零基础到项目实战

当您翻开此书,您正踏入一场数据与智慧的修行。机器学习,并非冰冷的符码,而是机器模拟人类洞察世界的法门。本书将带您,以Python为舟,泛游于算法之海。我们不只传授“术”,更探求其后的“道”——从数据的生灭流转中观照规律,于模型的迭代演进里体悟得失。愿您合上书卷时,收获的不仅是驾驭数据的技能,更有一双洞悉复杂、化繁为简的“智慧之眼”。现在,让我们一同启程。

YunWisdom 970

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Python数据预处理

Python数据预处理技术与实践 1. 概述 数据预处理: 数据清理 数据集成 数据规约 数据变换(按照预先设计好的规则对抽取的数据进行转换,如把数据压缩到0.0~1.0区间) 数据降维 原始数据存在数据不完整、数据偏态、数据噪声、数据特征维度高、数据缺失值、数据错误值等问题 搜索引擎是中文分词的一个应用 相关度排序:把最相关的结果排在最前面。受中文分词的准确度影响。 2. Python科学计算工具 NumPy SciPy Pandas 3. 数据采集与存储 数据形式:

sssurprise的博客 2836

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MATLAB文本预处理实战:从原始文本到机器可读特征向量的完整流程

在自然语言处理(NLP)和机器学习领域,文本预处理是将非结构化文本数据转化为结构化数值特征的关键步骤。其核心原理在于原始文本包含大量噪声(如大小写不一致、标点符号、停用词等),这些噪声会直接影响后续模型的性能。通过清洗、标准化、精简和向量化等操作,文本预处理能够显著提升特征质量,为情感分析、主题建模等高级任务奠定基础。在工程实践中,MATLAB的NL Text Analytics Toolbox提供了tokenizedDocument、bagOfWords等工具,帮助开发者高效构建预处理流水线。特别是在处理

weixin_30664615的博客 365

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

从零构建语义搜索引擎:基于Sentence-BERT的文本向量化与相似度匹配实践

文本向量化是自然语言处理(NLP)和机器学习领域的一项基础技术,其核心原理是将非结构化的文本数据转换为计算机可处理的数值向量。通过词袋模型、TF-IDF等统计方法,再到能够捕捉深层语义的词嵌入与句子嵌入技术,文本向量化实现了从表面词频到语义理解的跨越。这项技术的核心价值在于为下游任务如信息检索、文本分类和聚类提供了统一的数值表示基础。在实际应用场景中,语义搜索和相似度匹配是文本向量化的典型应用,它允许系统根据查询意图而非简单关键词匹配来查找相关文档。本文以构建一个可运行的语义搜索引擎为例,详细阐述了如何使用

weixin_33851177的博客 323

Python列表推导式在机器学习特征工程中的性能优化与实战

列表推导式是Python中用于高效生成列表的核心语法结构,其本质并非简单的语法糖,而是基于CPython字节码优化、内存预分配和C层迭代器绑定的底层机制实现的高性能数据变换工具。相比传统for循环,它显著降低方法查找开销、减少内存动态扩容次数,并提升人脑对数据流意图的理解效率。在机器学习场景中,它广泛应用于原始数据清洗、特征工程构造、模型调试探针及超参空间定义等关键环节,尤其擅长处理混合数据结构(如字典列表、嵌套JSON)和轻量级实时特征服务。本文聚焦列表推导式在真实ML pipeline中的工程化落地、性

weixin_34195142的博客 339

从零构建文本理解系统:基于Python与预训练模型的NLP实践指南

自然语言处理(NLP)是人工智能领域的关键技术,其核心在于让计算机理解人类语言。其基本原理是通过预训练语言模型将文本转化为高维向量表示,从而捕捉语义信息。这项技术的价值在于能够实现智能文本分析、自动摘要和问答等功能,广泛应用于内容分析、智能客服和知识管理等领域。本文以构建文本理解系统为例,详细介绍了从数据准备到模型部署的完整流程,重点涵盖了文本预处理、语义向量化等关键环节,并提供了基于Python和Hugging Face Transformers库的实践代码,帮助开发者快速搭建可扩展的NLP应用框架。

weixin_34014555的博客 518
上一篇: 用Python开始机器学习(4:KNN分类算法)
下一篇: 用Python开始机器学习(6:朴素贝叶斯分类器)
lsldd
lsldd 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄19年 1494粉丝 63原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值