文章目录
一、文本特征工程
在深度学习中,不需要主动提取特征。但是在传统的机器学习中,需要主动提取特征。
传统机器学习:需要手动进行特征工程,如果不知道哪些特征效果比较好,可以整理更多的特征
深度学习:自动学习有效的特征,所谓的向量表示过程就是自动学习有效的特征表示的过程。
常见的文本特征工程手段有
- 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.95 元 28 957 566.54 元 103 661.83 元 占 营业收入 比例 100% 报告 期内 公司 主营业务未发生重大变化 153 4 ..