特征工程——文本特征

article/2025/8/15 20:08:55

目录

文本特征

1.expansion编码

2.consolidation编码

3.文本长度特征

4.标点符号特征

5.词汇属性特征

6.特殊词汇特征

7.词频特征

8.TF-IDF特征

9.LDA特征


注意:

1. 本系列所有的文章主要是梯度提升树模型展开的,抽取的特征主要为帮助梯度提升树模型挖掘其挖掘不到的信息,本文介绍的所有特征都可以当做特征直接加入模型,和基于神经网络的策略有些许差别;

2. 因篇幅过多,本篇文章介绍文本特征的20种不同的特征,后续的文本特征会在后面的文章中更新!

 

文本特征

图片

文本特征和类别特征会有一些简单的交集,一些简单的文本特征可以直接当做类别特征处理,例如:

  • 花的颜色:red,blue,yellow等等;

  • 名字:Mr jack,Mr smith,Mrs will,Mr phil等等。

对这些特征可以直接进行Label编码然后采用类别特征的技巧对其进行特征工程。除了把文本特征当做类别特征处理,我们在做文本相关的特征工程时,需要注意非常多的细节,相较于Label编码,就是如何防止文本内的信息丢失问题。文本特征的处理涉及到非常多的NLP技术,此处我们主要介绍一些经常需要注意的地方以及一些技巧,关于最新的方法,大家可以跟进最新的NLP相关技术。

针对梯度提升树模型对文本特征进行特征工程,我们需要充分挖掘Label编码丢失的信息,例如上面的名字特征,内部存在非常强的规律,Mr等信息,这些信息反映了性别相关的信息,如果直接进行Label编码就会丢失此类信息,所以我们可以通过文本技巧对其进行挖掘。

图片

图片

1.expansion编码

expansion编码常常出现在一些复杂的字符串中,例如一些带有版本信息的字符串,很多版本号的信息中涵盖了时间以及编号等信息,我们需要将其拆分开,形成多个新的特征列,例如下面的例子:

图片

expansion编码类似于一种带有业务信息的聚类信息,可以加速树模型的搜索速度,也是非常非常不错的特征.

import pandas as pd
df = pd.DataFrame()
df['feature']      = ['Apple_iPhone_6', 'Apple_iPhone_6', 'Apple_iPad_3', 'Google_Pixel_3']
df['feature_1st']  = df['feature'].apply(lambda x: x.split('_')[0])
df['feature_2nd']  = df['feature'].apply(lambda x: x.split('_')[1])
df['feature_3rd']  = df['feature'].apply(lambda x: x.split('_')[2])
df
 featurefeature_1stfeature_2ndfeature_3rd
0Apple_iPhone_6AppleiPhone6
1Apple_iPhone_6AppleiPhone6
2Apple_iPad_3AppleiPad3
3Google_Pixel_3GooglePixel3

2.consolidation编码

consolidation编码常常出现在一些特殊的字符串中,例如:

  • 一些带有地址的字符串,字符串会给出详细的信息,XX市XX县XX村XX号等,这时我们可以将市抽取来作为一个全新的特征;

  • 很多产品,例如手机,pad等等,我们可以单独抽象为苹果,三星等公司等信息;

图片

图片

 

consolidation编码和上面的expansion编码类似,也是一种带有业务信息的聚类信息,可以加速树模型的搜索速度,也是一类非常不错的特征.

图片

图片

3.文本长度特征

文本的长度特征,可以按照文本的段落,句子,单词和字母四大粒度进行枚举式的构建,这些特征可以反映文本的段落结构,在很多问题中都是非常重要的信息,例如判断文本的类型,判断文本是小说还是论文还是其它,此时文本的长度特征就是非常强的特征。

图片

 

1.段落的个数

顾名思义就是文本中段落的个数。

2.句子的个数

文本中句子的个数,可以通过计算句号感叹号等次数来统计。

3.单词的个数

文本中单词的个数,可以通过直接通过将标点符号转化为空格,然后计算空格个数的方式来计算。

4.字母个数

删除所有的标点之后直接统计所有字母的个数。

5.平均每个段落的句子个数

平均每个段落的句子个数 = 句子的个数 / 段落的个数

6.平均每个段落的单词个数

平均每个段落的句子个数 = 单词的个数 / 段落的个数

7.平均每个段落的字母个数

平均每个段落的句子个数 = 文本字母个数 / 段落的个数

8.平均每个句子的单词个数

平均每个句子的单词个数 = 单词的个数 / 句子的个数

9.平均每个句子的字母个数

平均每个句子的字母个数 = 文本字母个数 / 句子的个数

10.平均每个单词的长度

平均每个单词的长度 = 文本字母个数 / 文本单词个数

图片

图片

4.标点符号特征

标点符号也蕴藏有非常重要的信息,例如在情感分类的问题中,感叹号等信息往往意味着非常强烈的情感表达,对于最终模型的预测可以带来非常大的帮助。

图片

1.标点符号的个数

直接计算标点符号出现的次数。

2.特殊标点符号的个数

统计文本中一些重要的标点符号出现的次数,例如:

  • 情感分类问题中,感叹号出现的次数,问号出现的次数等。

  • 在病毒预测问题中,异常符号出现的次数。

3.其它

此处需要额外注意一点,就是一些奇异的标点符号,例如连续多个感叹号,"!!!"或者连续多个问号“???”,这种符号的情感表示更为强烈,所以很多时候也需要特别注意。

图片

图片

5.词汇属性特征

每个词都有其所属的属性,例如是名词,动词,还是形容词等等。词汇属性特征很多时候能帮助模型带来效果上的微弱提升,可以作为一类补充信息。

图片

图片

图片

6.特殊词汇特征

标点符号能从侧面反映文本的情感强烈程度等信息,在情感分类,文本分类中有很重要的作用,当然与此同时,特殊词汇的特征特征则更为重要。

图片

我们可以选择直接分类别(每一类情感表示一类)统计每个类别中词汇的出现次数。

图片

图片

7.词频特征

上面是一些简单的文本特征,还有一些文本信息会相对复杂一些,例如是句子等文本。这个时候我们就需要一些常用的文本工具了,而最为常见的就是词频统计特征,该特征较为简单,就是统计文本中每个词出现的次数,因为每个文本一般都是由单词所组成的,而每个单词出现的次数在一定程度上又可以从侧面反映该文章的内容,例如在谋篇文章中,"love"这个词出现的比较多,也就是说"love"对应的词频比较大,则我们可以猜测该文章很大可能属于情感类的文章。所以在处理文本类的信息时,词频特征是非常重要的信息之一。

# 导入工具包
from sklearn.feature_extraction.text import CountVectorizer 
# 初始化,并引入停止词汇
vectorizer = CountVectorizer(stop_words=set(['the', 'six', 'less', 'being', 'indeed', 'over', 'move', 'anyway', 'four', 'not', 'own', 'through', 'yourselves']))
df = pd.DataFrame()
df['text'] = ["The sky is blue.", "The sun is bright.","The sun in the sky is bright.", "We can see the shining sun, the bright sun."]# 获取词汇
vectorizer.fit_transform(df['text']).todense()
matrix([[1, 0, 0, 0, 1, 0, 0, 1, 0, 0],[0, 1, 0, 0, 1, 0, 0, 0, 1, 0],[0, 1, 0, 1, 1, 0, 0, 1, 1, 0],[0, 1, 1, 0, 0, 1, 1, 0, 2, 1]])

如果希望知道上面每一列的意思,可以直接观测文本的字典即可。

vectorizer.vocabulary_
{'sky': 7,'is': 4,'blue': 0,'sun': 8,'bright': 1,'in': 3,'we': 9,'can': 2,'see': 5,'shining': 6}

词频特征简单易于理解,能够从宏观的角度捕获文本的信息。相较于直接Label编码可以能提取更多有用的信息特征,从而带来效果上的提升,但是词频特征往往会受到停止词汇的影响(stop words),例如"the,a"出现次数往往较多,这在聚类的时候如果选用了错误的聚类距离,例如l2距离等,则往往难以获得较好的聚类效果,所以需要细心的进行停止词汇的删选;受文本大小的影响,如果文章比较长,则词汇较多,文本较短,词汇则会较少等问题。

图片

图片

8.TF-IDF特征

TF-IDF特征是词频特征的一个扩展延伸,词频特征可以从宏观的方面表示文本的信息,但在词频方法因为将频繁的词汇的作用放大了,例如常见的"I",'the"等;将稀有的词汇,例如"garden","tiger"的作用缩减了,而这些单词却有着极为重要的信息量,所以词频特征往往很难捕获一些出现次数较少但是又非常有效的信息。而TF-IDF特征可以很好地缓解此类问题的方法。TF-IDF从全局(所有文件)和局部(单个文件)的角度来解决上述问题,TF-IDF可以更好地给出某个单词对于某个文件的重要性。

from sklearn.feature_extraction.text import TfidfVectorizertfidf_model = TfidfVectorizer()
# 获取词汇
tfidf_matrix = tfidf_model.fit_transform(df['text']).todense()
tfidf_matrix
matrix([[0.65919112, 0.        , 0.        , 0.        , 0.42075315,0.        , 0.        , 0.51971385, 0.        , 0.34399327,0.        ],[0.        , 0.52210862, 0.        , 0.        , 0.52210862,0.        , 0.        , 0.        , 0.52210862, 0.42685801,0.        ],[0.        , 0.3218464 , 0.        , 0.50423458, 0.3218464 ,0.        , 0.        , 0.39754433, 0.3218464 , 0.52626104,0.        ],[0.        , 0.23910199, 0.37459947, 0.        , 0.        ,0.37459947, 0.37459947, 0.        , 0.47820398, 0.39096309,0.37459947]])

如果希望知道上面每一列的意思,可以直接观测文本的字典即可。

tfidf_model.vocabulary_
{'the': 9,'sky': 7,'is': 4,'blue': 0,'sun': 8,'bright': 1,'in': 3,'we': 10,'can': 2,'see': 5,'shining': 6}
tfidf_model.idf_
array([1.91629073, 1.22314355, 1.91629073, 1.91629073, 1.22314355,1.91629073, 1.91629073, 1.51082562, 1.22314355, 1.        ,1.91629073])

TDIDF忽略了文章的内容,词汇之间的联系,虽然可以通过N-Gram的方式进行缓解,但其实依然没有从本质上解决该问题。

图片

图片

9.LDA特征

基于词频的特征和基于TFIDF的特征都是向量形式的,因而我们可以采用基于向量抽取特征的方式对其抽取新特征,而最为典型的就是主题模型。主题模型的思想是围绕从以主题表示的文档语料库中提取关键主题或概念的过程为中心。每个主题都可以表示为一个包或从文档语料库收集单词/术语。这些术语共同表示特定的主题、主题或概念,每个主题都可以通过这些术语所传达的语义意义与其他主题进行区分。这些概念可以从简单的事实和陈述到观点和观点。主题模型在总结大量文本文档来提取和描述关键概念方面非常有用。它们还可以从捕获数据中潜在模式的文本数据中提取特征。

图片

因为主题模型涉及的数学等概念较多,此处我们仅仅介绍其使用方案,有兴趣的朋友可以去阅读论文等资料。

一般我们会在TF-IDF或者词频等矩阵上使用LDA,最终我们得到的结果也可以拆解为下面两个核心部分:

  • document-topic矩阵,这将是我们需要的特征矩阵你在找什么。

  • 一个topic-term矩阵,它帮助我们查看语料库中的潜在主题。

此处我们使用上面的TDIDF矩阵并设置主题为2个进行试验。

from sklearn.decomposition import LatentDirichletAllocationlda       = LatentDirichletAllocation(n_components=2, max_iter=10000, random_state=0)
dt_matrix = lda.fit_transform(tfidf_matrix)
features  = pd.DataFrame(dt_matrix, columns=['T1', 'T2'])
features
 T1T2
00.7986630.201337
10.8131390.186861
20.8273780.172622
30.7977940.202206
  • 查看主题以及对应的每个词的贡献。

tt_matrix = lda.components_
vocab = tfidf_model.get_feature_names()
for topic_weights in tt_matrix:topic = [(token, weight) for token, weight in zip(vocab, topic_weights)]topic = sorted(topic, key=lambda x: -x[1])topic = [item for item in topic if item[1] > 0.2]print(topic)print() 
[('the', 2.1446092537000254), ('sun', 1.7781565358915534), ('is', 1.7250615399950295), ('bright', 1.5425619519080085), ('sky', 1.3771748032988098), ('blue', 1.116020185537514), ('in', 0.9734645258594571), ('can', 0.828463031801155), ('see', 0.828463031801155), ('shining', 0.828463031801155), ('we', 0.828463031801155)][('can', 0.5461364394229279), ('see', 0.5461364394229279), ('shining', 0.5461364394229279), ('we', 0.5461364394229279), ('sun', 0.5440024650128295), ('the', 0.5434661558382532), ('blue', 0.5431709323301609), ('bright', 0.5404950589213404), ('sky', 0.5400833776748659), ('is', 0.539646632403921), ('in', 0.5307700509960934)]

http://chatgpt.dhexx.cn/article/ysemCdBm.shtml

相关文章

时间序列特征工程

关注微信公众号“时序人”获取更好的阅读体验 时间序列知识整理系列 时间序列统计分析时间序列聚类时间序列预测时间序列回归时间序列特征工程时间序列补缺时间序列异常检测 前几次的文章分享,我们了解了时间序列分析的基础方法以及预测方法。但在使用这些方法一般…

机器学习——特征工程——交互特征(多项式特征)

一、交互特征定义 两个特征的乘积可以组成一对简单的交互特征,这种相乘关系可以用逻辑操作符AND来类比,它可以表示出由一对条件形成的结果:“该购买行为来自于邮政编码为98121的地区”AND“用户年龄在18和35岁之间”。这种特征在基于决策树的…

特征工程到底是什么?

特征工程是一个过程,它首先在概念上,然后在程序上将一个原始样本转化为特征向量。它包括将一个特征概念化,然后编写程序代码,可能借助一些间接数据,将整个原始样本转化为一个特征。 4.1 为什么要进行特征工程 具体来…

什么是特征工程?如何进行特征工程?

1 特征工程是什么? 有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中…

特征工程

文章目录 一、特征工程概述二、特征选择1.什么是特征选择2.为什么要做特征选择3.特征选择的基本原则4.特征选择常用的四种方法4.1 方差选择法4.2 相关系数法4.3 递归特征消除法4.4 模型选择法 参考: 三、特征构造1.什么是好?2.常见做法3.两个变量组合而成…

机器学习——特征工程(3分钟的超详细介绍)

目录 1 什么是特征工程?2 数据预处理和特征处理2.1 数据预处理2.2 特征处理 3 特征降维3.0 什么是特征降维?3.1 特征选择3.2 线性降维3.2.1 主成分分析法(PCA)3.2.2 线性判别分析法(LDA) 1 什么是特征工程&…

机器学习之特征工程详解

特征工程是指使用专业的背景知识和技巧处理数据,使得特征能在机器学习算法上发生更好的作用的过程。更好的特征意味着更强的灵活性,只需简单模型就能得到更好的结果,因此,特征工程在机器学习中占有相当重要的地位,可以…

【特征工程】呕心之作——深度了解特征工程

【博客地址】:https://blog.csdn.net/sunyaowu315 【博客大纲地址】:https://blog.csdn.net/sunyaowu315/article/details/82905347 对数据分析、机器学习、数据科学、金融风控等感兴趣的小伙伴,需要数据集、代码、行业报告等各类学习资料&am…

python右键idel消失问题

由于先安装的是的python2.7,后来改用python3.4出现了idel不见的问题: cmd:regedit SystemFileAssociations 新建项: ‘.py’右侧键值不管,‘shell’,edit的键值均为‘Edit with IDLE’即可 将’command‘的键值设置…

分析及解决:虚拟机无法连接虚拟设备idel 0:1 问题

虚拟机无法连接虚拟设备 问题背景解决过程一次性永久解决方式 问题背景 在学习大数据集群开发的时候,按照要求需要配置多个使用Ubuntu操作系统的虚拟机组合集群:master,slave1,slave2。但在我按照要求配置好三个虚拟机后&#xf…

python的使用方法图解_python开发之IDEL(Python GUI)的使用方法图文详解

本文讲述了python开发之IDEL(Python GUI)的使用方法。分享给大家供大家参考,具体如下: 在安装完Python后,我们希望能够运用python GUI来运行一些我们编写的程序,那么Python GUI怎样用呢? 看完这篇blog,也…

python、idel、pycharm的安装使用

python的安装 Python 3的安装 idle的使用 Python安装的过程中默认自动安装了idle,idl是python自带的集成开发环境。 交互环境 如何启动idle 第一种,开始菜单所有应用点击idle 第二种,在搜索栏当中直接输入idle 集成开发环境PyCham…

在anaconda设置Python的IDEL编辑器

在电脑中安装了anaconda(如果没有,可参考博客),anaconda会自动安装Python,可是想要用Python的IDEL编辑器还不知道怎么弄。百度了下终于查找到了具体的设置方法。主要分为两步。 1、修改注册表中信息,将.py…

idel部署的问题

war和war exploded的区别 转载地址:https://blog.csdn.net/xlgen157387/article/details/56498938 在使用IDEA开发项目的时候,部署Tomcat的时候通常会出现下边的情况: 是选择war还是war exploded 这里首先看一下他们两个的区别:…

python开发_tkinter_窗口控件_自己制作的Python IDEL_博主推荐

在了解python中的tkinter模块的时候,你需要了解一些tkinter的相关知识 下面是python的API文档中的一个简单例子: 1 import tkinter as tk2 3 class Application(tk.Frame):4 def __init__(self, masterNone):5 tk.Frame.__init__(self, mast…

解决idel连接mysql数据库报错问题

使用idel来连接mysql数据库时出现: Server returns invalid timezone. Need to set ‘serverTimezone’ property报错信息。 查询相关资料后发现,我们本地使用的idel连接mysql时,使用的时区有问题而导致的报错。 解决方式: 修…

VUE与IDEL解决跨域问题

前言 跨域是浏览器对ajax请求的限制 跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对js施加的安全限制。(ajax可以) 同源策略:是指协议,域名,端囗都要相同…

Python在IDLE中实现清屏和更改IDEL的shell的背景颜色

文章目录 更改IDEL的shell背景颜色在IDEL中实现清屏 今天才开始打算自学Python,刚装好的Python,使用IDEL的时候,发现白色的背景是在很闪眼睛,属实顶不住,然后就去问度娘,找到了以下的更改IDEL中的背景颜色&…

python的idel下添加清屏功能

第一步:下载文件ClearWindow.py (该文件可以在文章末尾网盘下载)第二步:找到目录 E:\python\Lib\idlelib (这个目录为python安装路径,比如我的安装路径为e:\python)第三步:将下载好的…

python 中设置IDEL快捷键清屏

1.通过下面这个链接下载到自己电脑的本地https://bugs.python.org/file14303/ClearWindow.py 将这个文本的后缀改为ClearWindow.py拷贝ClearWindow.py文件,放在Python安装目录Python XXX\Lib\idlelib下面(XXX为你的python版本)。记事本打开Py…