NLP—3.文本特征工程及工具使用举例

一、文本特征工程

  在深度学习中,不需要主动提取特征。但是在传统的机器学习中,需要主动提取特征。
传统机器学习:需要手动进行特征工程,如果不知道哪些特征效果比较好,可以整理更多的特征
深度学习:自动学习有效的特征,所谓的向量表示过程就是自动学习有效的特征表示的过程。
常见的文本特征工程手段有

  • tf-idf
  • word2vec
    利用skipgram或者CBOW来训练词向量,如果自己不想训练,可以用别人训练好的。
  • N-gram
  • POS词性(part of speech)
  • LDA主题特征
  • 文本统计特征(人工提取特征)
    诸如:文本长度、单词个数、数字个数、名词数等,可以根据下游任务进行选取
      在进行下游任务时,我们有很多特征可以使用,我们应该怎么组合在一起呢?我们可以将这些feature拼接在一起,特征串变成一个向量,这个向量用于模型训练。

  一般在中文中还需要进行分词。jieba分词可以对中文文本进行分词、词性标注、关键词抽取等,并且支持自定义词典。jieba分词支持四种分词模式:精确模式、全模式、搜索引擎模式、paddle模式。具体可参见https://github.com/fxsjy/jieba
官方样例:

# encoding=utf-8
import jieba

jieba.enable_paddle()# 启动paddle模式。 0.40版之后开始支持,早期版本不支持
strs=["我来到北京清华大学","乒乓球拍卖完了","中国科学技术大学"]
for str in strs:
    seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式
    print("Paddle Mode: " + '/'.join(list(seg_list)))

seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式

seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list))  # 精确模式

seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
print(", ".join(seg_list))

seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式
print(", ".join(seg_list))
【全模式】:/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学

【精确模式】:/ 来到/ 北京/ 清华大学

【新词识别】:他, 来到,, 网易, 杭研, 大厦    (此处,“杭研”并没有在词典中,但是也被Viterbi算法识别出来了)

【搜索引擎模式】: 小明, 硕士, 毕业,, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所,,, 日本, 京都, 大学, 日本京都大学, 深造

二、工具使用

  以一个文本分类任务为例,学习工具的使用

import pandas as pd
import numpy as np
# 中文分词
import jieba
import codecs
import os
# API算法库,可以进行TF-IDF,可以提已经训练好的word2vec,文本相似度计算等
import gensim
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV, cross_val_score
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.model_selection import train_test_split

pd.set_option('display.max_colwidth', -1)
%matplotlib inline
1.word counts与tf-idf

  将训练语料转化为词袋模型,矩阵中的元素可以是word counts或者tf-idf。

1.1 读取输入与分词
  • 读取输入

    data_dir = 'materials'
    train_filepath = os.path.join(data_dir, 'training.csv')
    # 加载文件
    src_data = pd.read_csv(train_filepath, names=['text_label', 'text_content'], encoding='utf8')
    print(src_data.shape)
    print(src_data.head())
    # 计算训练集每个标签的数量,发现标签数量不均衡,需要采用一些样本均衡的手段
    pd.value_counts(src_data['text_label'].values)
    
    (4774, 2)
       text_label                                                                                                                                                                                                                                                                text_content
    0  2           合晟资产是一家专注于股票、债券等二级市场投资,为合格投资者提供专业资产管理服务的企业。公司业务范围包括资产管理、投资咨询和投资顾问服务。公司管理的私募基金产品主要包括股票型、债券型资产管理计划或证券投资基金,管理总资产规模80亿元左右。根据中国证券投资基金业协会数据,公司管理的私募证券投资基金(顾问管理)类规模较大,公司管理规模处于50亿元以上的第一梯队。                                                                                       
    1  2           公司的主营业务为向中小微企业、个体工商户、农户等客户提供贷款服务,自设立以来主营业务未发生过变化。                                                                                                                                                                                                                         
    2  1           公司立足于商业地产服务,致力于为商业地产开发、销售、运营全产业链提供一整套增值服务,业务覆盖商业定位及策划、商业设计、销售代理、招商代理电子商务、以及商业地产运管服务;同时开展应用互联网电商模式,采取O2O线上导流线下服务方式进行住宅类业务的创新营销服务。公司的业务板块包括商业地产策划顾问、专业招商及运营管理、代理销售、麦吉铺O2O电子商务。                                                                                              
    3  2           公司经工商管理部门核准的经营范围为“投资咨询、经济信息咨询,企业管理咨询,品牌推广策划,公共关系策划,文化交流策划咨询,企业形象策划,图文设计,会展服务(依法须经批准的项目,经相关部门批准后方可开展经营活动)”。公司的主营业务为:为国内上市公司提供投资者关系顾问服务。根据公司的主营业务,按照《国民经济行业分类》(GBT4754-2011),公司属于“商务服务业(L72)”分类下的“社会经济咨询(L7233)”。                                                           
    4  2           该公司的主营业务为在中国境内(港、澳、台除外)开展保险代理销售,依托于自身的产品研究能力和专业化服务能力,通过为团体或个人保险受众提供投保需求分析、投保方案制定、保险理赔、保单保全等一站式服务,最终为保险公司完成人身保险及财产保险等保险产品的代理销售综合服务。公司自成立以来,已与中国人民人寿保险股份有限公司、中德安联人寿保险有限公司、中英人寿保险有限公司、阳光人寿保险股份有限公司、中意人寿保险有限公司、同方全球人寿保险有限公司、中国泰康人寿保险股份有限公司等数十家保险公司建立了紧密的合作关系,并为其完成千余种保险产品的代理销售
    
    
    3     1271
    4     1268
    6     810 
    7     303 
    10    278 
    5     227 
    8     206 
    9     163 
    2     98  
    11    96  
    1     54  
    dtype: int64
    
    # 从训练文本中抽取标签为3或4的文本用于后续操作,二分类任务
    src_data = src_data[src_data['text_label'].isin([3, 4])]
    # 统计标签的数量
    print(pd.value_counts(src_data['text_label'].values))
    
    3    1271
    4    1268
    dtype: int64
    
  • 分词
    加载停用词

    def read_file(file_path):
        """reading file"""
        f = codecs.open(file_path, encoding='utf-8')
        lines = []
        for line in f:
            line = line.rstrip('\n').rstrip('\r')
            lines.append(line)
        return lines
    # 加载停用词
    stopwordsCN = read_file(os.path.join(data_dir, 'stopWords_cn.txt'))
    

    针对下游任务,加载自定义词典

    jieba.load_userdict(os.path.join(data_dir, 'ai100_words.txt'))
    

    去掉停用词,进行分词,返回以空格连接的字符串

    def cut_content(each_row, stopwords):
        """word segmentation"""
        return ' '.join([word for word in jieba.lcut(each_row['text_content']) if word not in stopwords])
    # 去掉停用词,进行分词,返回以空格连接的字符串
    src_data['text_content_segmentation'] = src_data.apply(lambda row: cut_content(row, stopwordsCN), axis=1)
    print(src_data.head())
    
         text_label  ...                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         text_content_segmentation
    152  3           ...  杉工 智能 提供 交通 基础设施 城市 公共 基础设施 大型 土木工程 建筑物 结构 监测 系统 设计 咨询 实施 及运维 服务 行业 相关 智能 软硬件 设计 开发 生产 销售 主营业务 涵盖 技术咨询 系统 设计 系统实施 相关 软件 硬件 开发 生产 销售 服务 中国证监会 发布 上市公司 行业 分类 指引 2012 年 修订 公司 处 行业 I 信息 传输 软件 信息技术 服务业 中 I65 软件 信息技术 服务业 国民经济行业分类 代码 国家标准 GB T4754 2011 公司 处 行业 I 信息 传输 软件 信息技术 服务业 中 I65 软件 信息技术 服务业 挂牌 公司 管理型 行业 分类 指引 公司 处 行业 I 信息 传输 软件 信息技术 服务业 中 I65 软件 信息技术 服务业 2014 年度 2015 年度 2016 年 月 公司 主营业务收入 489 097.9528 957 566.54103 661.83 元 占 营业收入 比例 100% 报告 期内 公司 主营业务未发生重大变化                                                                                                                                                                                                                                                                            
    153  4           ..
<think>嗯,用户想了解特征工程的相关处理方法,以及数据预处理在机器学习中的应用。首先,我需要回忆一下特征工程和数据预处理的基本概念,确保自己理解正确。数据预处理包括数据清洗、缺失值处理、标准化、归一化等步骤,而特征工程则更侧重于从原始数据中提取和构造有用的特征,可能包括特征选择、降维、编码类别变量等方法。 根据用户提供的引用内容,尤其是引用[1]和[2],数据预处理和特征工程是机器学习中非常重要的前期步骤,占据大量时间但对结果影响重大。需要结合这些引用来组织回答的结构。引用[3]提到结构化数据和非结构化数据的不同处理方法,这点也要涵盖进去。 接下来,应该分步骤解释数据预处理和特征工程的具体方法。比如数据预处理可以分为数据清洗、数据转换、数据集成、数据降维等步骤。每个步骤下再细分,例如数据清洗包括处理缺失值和异常值,数据转换包括标准化、归一化、分箱等。特征工程则包括特征构造、特征选择、编码方法、时间序列处理等。 要注意用户可能混淆数据预处理和特征工程的区别,所以需要明确两者的定义和联系。引用[1]提到数据预处理是特征工程的前置步骤,而特征工程更专注于提升模型性能的特征处理。需要指出这一点,帮助用户理清概念。 另外,用户提供的引用中提到了不同数据类型的处理方法,如结构化数据侧重特征工程和缩放,非结构化数据使用增强和向量化。需要将这些内容融入回答中,给出具体的例子,比如图像数据使用数据增强,文本数据使用TF-IDF或词嵌入。 还要考虑用户可能的应用场景,例如他们在实际项目中可能会遇到缺失值如何处理、如何选择特征、如何降维等问题。因此,在回答中需要包含实际应用中的常见方法,比如使用Scikit-learn库中的Imputer处理缺失值,PCA进行降维,以及特征选择的过滤法、包装法和嵌入法。 最后,生成的相关问题需要与主题紧密相关,帮助用户深入探索。例如,数据清洗的具体步骤,标准化与归一化的区别,特征选择的方法比较,以及非结构化数据的处理技术等。这些问题应该覆盖用户可能进一步询问的方向,并引导他们了解更多细节。 需要确保回答结构清晰,分点列出,每个部分都有小标题,便于用户阅读。同时,语言要简洁明了,避免使用过于专业的术语,必要时举例说明。例如,在解释独热编码时,可以给出一个简单的例子,说明如何将类别变量转换为数值形式。 检查是否所有引用的内容都正确标注,比如在提到数据预处理重要性时引用[2],在讨论结构化与非结构化数据时引用[3]。确保引用标识自然放置在相关段落的末尾,不打断阅读流程。 总结来说,回答需要涵盖数据预处理和特征工程的定义、步骤、方法、工具应用以及实际案例,同时结合用户提供的引用内容,确保信息准确且有据可依。生成的问题要具有针对性,帮助用户进一步学习相关主题。</think>### 特征工程与数据预处理方法详解 #### 一、数据预处理的核心步骤 1. **数据清洗** - **缺失值处理**:填充均值、中位数或众数(适用于数值型数据);使用插值法或模型预测缺失值(如KNN)[^2]。 - **异常值处理**:通过3σ原则(正态分布数据)、IQR方法(非正态分布)或聚类算法检测并剔除异常点。 - 示例代码: ```python from sklearn.impute import SimpleImputer imputer = SimpleImputer(strategy="median") X_clean = imputer.fit_transform(X) ``` 2. **数据转换** - **标准化(Z-score标准化)**:将数据调整为均值为0、标准差为1,公式:$$x&#39; = \frac{x - \mu}{\sigma}$$ - **归一化(Min-Max缩放)**:将数据映射到[0,1],公式:$$x&#39; = \frac{x - x_{\text{min}}}{x_{\text{max}} - x_{\text{min}}}$$ - **分箱(Binning)**:将连续变量离散化,例如年龄分为“青年”“中年”“老年”。 3. **数据集成与降维** - **主成分分析(PCA)**:通过线性变换将高维数据投影到低维正交空间,保留最大方差方向,公式:$$X_{\text{PCA}} = X \cdot W$$($W$为特征向量矩阵)[^3]。 - **特征选择**:使用过滤法(如卡方检验)、包装法(如递归特征消除)或嵌入法(如Lasso回归)筛选关键特征。 #### 二、特征工程的实践方法 1. **特征构造** - **组合特征**:例如从“身高”和“体重”构造“BMI指数”:$$\text{BMI} = \frac{\text{体重(kg)}}{\text{身高(m)}^2}$$ - **多项式特征**:通过$x^2$、$xy$等非线性组合增强模型表达能力。 2. **类别特征编码** - **独热编码(One-Hot Encoding)**:将类别变量扩展为二进制向量,例如“颜色”分为[红, 蓝, 绿] → [1,0,0]、[0,1,0]等。 - **目标编码(Target Encoding)**:用目标变量的均值替代类别值(需防范过拟合)。 3. **时间序列特征处理** - **滑动窗口统计**:提取过去7天的均值、方差等。 - **周期性分解**:将时间序列拆分为趋势、季节性和残差成分。 #### 三、结构化与非结构化数据的差异 - **结构化数据**(如表格数据) 侧重数值型特征的缩放(如标准化)和类别编码,常用工具:`pandas`、`scikit-learn`。 - **非结构化数据**(如图像/文本) - **图像数据**:标准化像素值(除以255)、数据增强(旋转/裁剪)。 - **文本数据**:词袋模型(Bag-of-Words)、TF-IDF加权、词嵌入(Word2Vec)。 #### 四、实际应用示例 **场景:房价预测** 1. 数据预处理:填充缺失的“建造年份”,用中位数替代;对“房屋面积”进行归一化。 2. 特征工程:构造“房间单价”(总价/面积);对“地段”进行独热编码。 3. 工具实现: ```python from sklearn.preprocessing import StandardScaler, OneHotEncoder scaler = StandardScaler() X_scaled = scaler.fit_transform(df[["面积"]]) encoder = OneHotEncoder() X_encoded = encoder.fit_transform(df[["地段"]]) ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值