100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > NLP—3.文本特征工程及工具使用举例

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

时间:2022-10-04 21:06:35

相关推荐

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

文章目录

一、文本特征工程二、工具使用1.word counts与tf-idf1.1 读取输入与分词1.2 特征工程—CountVectorizer and TfidfTransformer1.3 构建分类器管道模型2. word2vec3. doc2vec4. LDA主题模型5.Fasttext

一、文本特征工程

在深度学习中,不需要主动提取特征。但是在传统的机器学习中,需要主动提取特征。

传统机器学习:需要手动进行特征工程,如果不知道哪些特征效果比较好,可以整理更多的特征

深度学习:自动学习有效的特征,所谓的向量表示过程就是自动学习有效的特征表示的过程。

常见的文本特征工程手段有

tf-idfword2vec

利用skipgram或者CBOW来训练词向量,如果自己不想训练,可以用别人训练好的。N-gramPOS词性(part of speech)LDA主题特征文本统计特征(人工提取特征)

诸如:文本长度、单词个数、数字个数、名词数等,可以根据下游任务进行选取

在进行下游任务时,我们有很多特征可以使用,我们应该怎么组合在一起呢?我们可以将这些feature拼接在一起,特征串变成一个向量,这个向量用于模型训练。

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

官方样例:

# encoding=utf-8import jiebajieba.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 pdimport numpy as np# 中文分词import jiebaimport codecsimport os# API算法库,可以进行TF-IDF,可以提已经训练好的word2vec,文本相似度计算等import gensimfrom sklearn.feature_extraction.text import CountVectorizer, TfidfTransformerfrom sklearn.linear_model import LogisticRegressionfrom sklearn.model_selection import GridSearchCV, cross_val_scorefrom sklearn.pipeline import Pipelinefrom sklearn.metrics import accuracy_score, confusion_matrixfrom sklearn.model_selection import train_test_splitpd.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_labeltext_content0 2 合晟资产是一家专注于股票、债券等二级市场投资,为合格投资者提供专业资产管理服务的企业。公司业务范围包括资产管理、投资咨询和投资顾问服务。公司管理的私募基金产品主要包括股票型、债券型资产管理计划或证券投资基金,管理总资产规模80亿元左右。根据中国证券投资基金业协会数据,公司管理的私募证券投资基金(顾问管理)类规模较大,公司管理规模处于50亿元以上的第一梯队。 1 2 公司的主营业务为向中小微企业、个体工商户、农户等客户提供贷款服务,自设立以来主营业务未发生过变化。 2 1 公司立足于商业地产服务,致力于为商业地产开发、销售、运营全产业链提供一整套增值服务,业务覆盖商业定位及策划、商业设计、销售代理、招商代理电子商务、以及商业地产运管服务;同时开展应用互联网电商模式,采取O2O线上导流线下服务方式进行住宅类业务的创新营销服务。公司的业务板块包括商业地产策划顾问、专业招商及运营管理、代理销售、麦吉铺O2O电子商务。 3 2 公司经工商管理部门核准的经营范围为“投资咨询、经济信息咨询,企业管理咨询,品牌推广策划,公共关系策划,文化交流策划咨询,企业形象策划,图文设计,会展服务(依法须经批准的项目,经相关部门批准后方可开展经营活动)”。公司的主营业务为:为国内上市公司提供投资者关系顾问服务。根据公司的主营业务,按照《国民经济行业分类》(GBT4754-),公司属于“商务服务业(L72)”分类下的“社会经济咨询(L7233)”。 4 2 该公司的主营业务为在中国境内(港、澳、台除外)开展保险代理销售,依托于自身的产品研究能力和专业化服务能力,通过为团体或个人保险受众提供投保需求分析、投保方案制定、保险理赔、保单保全等一站式服务,最终为保险公司完成人身保险及财产保险等保险产品的代理销售综合服务。公司自成立以来,已与中国人民人寿保险股份有限公司、中德安联人寿保险有限公司、中英人寿保险有限公司、阳光人寿保险股份有限公司、中意人寿保险有限公司、同方全球人寿保险有限公司、中国泰康人寿保险股份有限公司等数十家保险公司建立了紧密的合作关系,并为其完成千余种保险产品的代理销售

31271412686810 7303 10 278 5227 8206 9163 298 11 96 154 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 12714 1268dtype: 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_segmentation152 3 ... 杉工 智能 提供 交通 基础设施 城市 公共 基础设施 大型 土木工程 建筑物 结构 监测 系统 设计 咨询 实施 及运维 服务 行业 相关 智能 软硬件 设计 开发 生产 销售 主营业务 涵盖 技术咨询 系统 设计 系统实施 相关 软件 硬件 开发 生产 销售 服务 中国证监会 发布 上市公司 行业 分类 指引 年 修订 公司 处 行业 I 信息 传输 软件 信息技术 服务业 中 I65 软件 信息技术 服务业 国民经济行业分类 代码 国家标准 GB T4754 公司 处 行业 I 信息 传输 软件 信息技术 服务业 中 I65 软件 信息技术 服务业 挂牌 公司 管理型 行业 分类 指引 公司 处 行业 I 信息 传输 软件 信息技术 服务业 中 I65 软件 信息技术 服务业 年度 年度 年 月 公司 主营业务收入 489 097.95 元 28 957 566.54 元 103 661.83 元 占 营业收入 比例 100% 报告 期内 公司 主营业务未发生重大变化 153 4 ... 中国证监会 发布 上市公司 行业 分类 指引 年 修订 公司 建筑 装饰 建筑业 行业 代码 E50 国家统计局 公布 国民经济行业分类 GB T4754 公司 所属 行业 建筑 装饰业 行业 代码 E5010 挂牌 公司 管理型 行业 分类 指引 公司 建筑 装饰业 行业 代码 E5010 挂牌 公司 投资 型 行业 分类 指引 公司 建筑 工程 行业 行业 代码 12101210 公司 批准 经营范围 室内外 装饰 工程设计 施工 铝合金 塑钢门 窗 组装 设计 销售 施工 园林绿化 工程施工 建筑 幕墙 钢结构 组装 设计 销售 施工 环保 设备 装饰材料 玻璃 销售 五金交电 机械 电子产品 通信 设备 销售 安装 依法 须 批准 项目 相关 部门 批准 后方 经营 活动 公司 主营业务 建筑 幕墙 设计 施工 提供 幕墙 门窗 设计 施工 造价 咨询 幕墙 检修 维护 服务 报告 期内 主营业务收入 产品 服务 类别 分类 情况 单位 元 建筑 幕墙 收入 包括 建筑 幕墙 施工 幕墙 门窗 施工 幕墙 检修 维护 服务收入 外装 设计 收入 包括 建筑 幕墙 设计 幕墙 门窗 设计 造价 咨询 服务收入 报告 期内 公司 主营业务未发生重大变化155 3 ... 公司 主营业务 业务流程 管理 BPM 软件 研发 生产 销售 相关 服务 公司 服务 客户 分布 通信 油田 制造 食品 化工 物流 行业 领域 涵盖 大中型 国企 外企 各类 中小企业 规模 企业 事业单位 机构 各类 客户 提供 流程 中心 企事业单位 信息化 集成 解决方案 标准化 产品销售 产品 培训 实施 服务 售后服务 公司 企事业单位 管理 生产 决策 支持 领域 提供 一体化 信息 解决方案 提高 事业单位 领导人 管理 执行力 助力 各类 企事业单位 电子化 网络化 流程化 智能化 转型 管理 信息化 水平 提升 提升 企事业单位 管理 能力 增加 企事业单位 效益 年度 年度 公司 主营业务收入 882.25 万元 217.79 万元 主营业务收入 占 营业收入 比重 100% 成立 公司 主营业务未发生重大变化 157 3 ... 曼恒 数字 国内 领先 虚拟现实 3D 打印 技术开发 服务提供商 公司 自主 开发 3D 计算机 图形 技术 快速 成型 技术 客户 提供 领先 虚拟现实 3D 打印 产品 服务 方案 公司 创始 年 公司总部 位于 上海 北京 成都 广州 设有 子公司 武汉 济南 西安 哈尔滨 城市 设立 办事处 构建 完整 销售 服务网络 曼恒 数字 子公司 北京 曼恒 高新技术 企业 认定 软件 企业 认证 公司 子公司 合计 拥有 46 项 软件 著作权 18 项 软件产品 登记 证书 项 专利 公司 致力于 自主 产品 研发 技术创新 拥有 业内 规模 领先 技术 研发 团队 开发 DVS3D 虚拟现实 软件平台 G Magic 虚拟现实 交互 系统 G Bench 虚拟 工作台 G Motion 动作 捕捉 系统 3D 实感 赛车 射击 游戏 多款 国内首创 自主知识产权 虚拟现实 产品 拥有 共享 知识产权 3D 打印 设备 材料 提供 面向 行业 rp360 3Dcity 两个 互联网 平台 曼恒 数字 成立 始终 客户 体验 至上 价值 导向 挖掘 客户 需求 高端 制造 高等教育 国防 军队 医疗 行业 提供 专业级 3D 产品 技术 商业 提供 消费 级 3D 娱乐 产品 公司 客户 包括 中航 商发 国家电网 中国 商飞 迪士尼 中广核 中石化 中 石油 中联重科 佳豪 船舶 大众汽车 易趣网 eBay 华为 浙江大学 上海交通大学 武汉大学 同济大学 万达 玩家 客户群 涵盖 国内外 大型 企业 集团 知名 院校 科研院所 商业 娱乐场所 知名 客户 合作 曼恒 数字 始终 站 技术 发展 前沿 强化 3D 领域 核心 竞争力158 3 ... 公司 国内 领先 数据安全 技术 产品 服务提供商 金融 政府 电信 能源 制造 大型 行业 客户 提供数据 加密 数据安全 防护 数据 防 泄漏 数据 综合 防护 产品 解决方案 服务 [5 rows x 3 columns]

训练与测试集分割

X = src_data['text_content_segmentation']y = src_data['text_label']X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)print(f'X_train shape: {X_train.shape}, X_test shape: {X_test.shape}')

X_train shape: (2031,), X_test shape: (508,)

1.2 特征工程—CountVectorizer and TfidfTransformer

CountVectorizer

将文本转化为词频矩阵

# 默认unigramscount_vect = CountVectorizer()# CountVectorizer会将文本中的词语转换为词频矩阵,它通过fit_transform函数计算各个词语出现的次数。X_train_counts = count_vect.fit_transform(X_train)print(X_train_counts)

(0, 4057)6(0, 7474)1(0, 15024)1(0, 10060)1(0, 12978)1(0, 6368)1(0, 14600)2(0, 9726)6(0, 8510)1(0, 5811)3(0, 14584)1(0, 14038)1(0, 9149)1(0, 15366)2(0, 14042)1(0, 14663)1(0, 14086)1(0, 11685)1(0, 14094)1(0, 15869)1(0, 10066)1(0, 12630)4(0, 3497)1(0, 3683)1(0, 3410)3::(2030, 6686)1(2030, 12162)1(2030, 8959)1(2030, 6508)1(2030, 3067)1(2030, 13383)1(2030, 12265)1(2030, 8509)1(2030, 10900)1(2030, 1568)1(2030, 2145)1(2030, 6569)1(2030, 7693)1(2030, 7694)3(2030, 7695)2(2030, 7163)2(2030, 7696)2(2030, 9617)2(2030, 1579)1(2030, 1)1(2030, 14012)1(2030, 3754)1(2030, 5210)1(2030, 6979)1(2030, 2829)1

# 单词到特征索引的映射word2id = count_vect.vocabulary_# 特征索引到单词的映射id2word = dict(zip(word2id.values(), word2id.keys()))

以第一个文本为例,展示CountVectorizer过程

# 以第一个样本为例sample_1 = X_train_counts.toarray()[0, :]# 返回非零单词索引word_idx = np.nonzero(sample_1)[0]print(word_idx)

(array([ 15, 16, 91, 103, 132, 165, 166, 172, 177,202, 218, 304, 313, 317, 343, 355, 370, 386,412, 430, 431, 452, 464, 469, 475, 510, 520,526, 556, 574, 577, 606, 624, 710, 756, 785,796, 815, 825, 852, 871, 876, 911, 1000, 1005,1008, 1059, 2444, 2660, 2795, 2875, 3169, 3410, 3420,3497, 3615, 3616, 3683, 4057, 4335, 4638, 5811, 6068,6113, 6132, 6212, 6213, 6368, 6545, 6630, 6867, 7067,7103, 7107, 7168, 7474, 7666, 7740, 8002, 8194, 8266,8283, 8338, 8510, 8877, 8878, 9149, 9726, 10060, 10066,10300, 10314, 10793, 10921, 11173, 11254, 11676, 11685, 11992,12571, 12630, 12978, 13036, 13403, 13720, 13724, 13831, 14000,14038, 14042, 14086, 14094, 14273, 14584, 14600, 14603, 14663,14749, 14945, 15024, 15366, 15665, 15711, 15869, 15878, 15885],dtype=int64),)

word counts

word_counts = sample_1[np.nonzero(sample_1)]print(word_counts)

[1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 1 1 1 1 2 1 1 1 3 1 1 1 1 1 3 1 1 1 1 1 6 1 1 3 2 1 1 1 1 1 1 1 1 2 1 11 1 2 1 1 1 1 1 1 1 2 1 1 6 1 1 1 1 1 1 1 1 1 1 1 1 4 1 2 1 1 1 1 1 1 1 11 1 1 2 1 1 1 1 1 2 2 1 1 1 2]

当然,我们可以根据单词索引与单词数目来得到文本

sample_1_text = []for e_0, e_1 in zip(word_idx, word_counts):sample_1_text.extend([id2word[e_0]] * e_1)print(sample_1_text)

['009', '01', '10', '104', '118', '13', '13', '130', '134', '138', '16', '17', '', '', '', '22', '232', '25', '267', '29', '30', '300', '315', '327', '332', '340', '370', '38', '385', '41', '427', '43', '46', '476', '57', '617', '65', '66', '68', '68', '694', '73', '755', '76', '80', '80', '91', '916', '92', '99', '99', '99', '专业', '中国', '中铁', '主营业务收入', '交通运输', '企业', '企业', '企业', '企业管理', '会计', '余家', '余年', '依托', '公司', '公司', '公司', '公司', '公司', '公司', '净利润', '制造', '咨询', '咨询', '咨询', '国内', '国内', '国开', '国美', '地为', '地产', '基础', '多个', '大中型', '始终', '实施', '实施', '审计', '客户', '家电', '工商管理', '年度', '年度', '广泛应用', '当期', '恒大', '成功', '成本', '房地产', '技术开发', '提供', '提供', '提供商', '数据处理', '服务', '服务', '服务', '服务', '服务', '服务', '核准', '核心', '比例', '毛利率', '海尔集团', '深耕', '烟草', '煤炭', '电器', '电子产品', '相关', '等央企', '管理', '管理', '管理', '管理', '经营范围', '绩效', '绩效', '能源', '营业', '营业收入', '行业', '解决方案', '计算机系统', '计算机软件', '设备', '设立', '财务报告', '转让', '软件', '软件', '软件产品', '辅助', '运维', '通讯', '部门', '销售', '销售', '集团', '集团', '零售', '预算', '领先', '领域', '领域']

tf-idf

tfidf_transformer = TfidfTransformer()X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)sample_1 = X_train_tfidf.toarray()[0, :]# 返回非零单词索引word_idx = np.nonzero(sample_1)[0]# 返回tfidf向量word_tfidf = sample_1[np.nonzero(sample_1)]

1.3 构建分类器管道模型

我们使用Logistic回归模型来构建模型,并构建一个用于特征提取和模型构建的管道。

text_clf = Pipeline([('word_counter', CountVectorizer()),('tfidf_computer', TfidfTransformer()),('clf', LogisticRegression())])# 训练text_clf = text_clf.fit(X_train, y_train)# 预测y_pred = text_clf.predict(X_test)print('accuracy %s' % accuracy_score(y_pred, y_test))labels = y_train.unique()print('Labels: ', labels)# 混淆矩阵print(confusion_matrix(y_test, y_pred, labels=labels))

accuracy 0.9645669291338582Labels: [3 4][[227 11][ 7 263]]

2. word2vec

Word2vec是一组用于生成词嵌入的相关模型(CBOW和Skipgram),它是词的分布式表示。在这里,我们使用gensim包来实现Word2vec。

from gensim.models import word2vecdef get_data_sentences(input_data):"""得到输入句子:param input_data: 输入文件:return:"""rtn_sentence = []cc = 0# 将DataFrame 作为(index, Series) pairs来进行迭代for curr_index, curr_row in input_data.iterrows():rtn_sentence.append(curr_row['text_content_segmentation'].split())cc += 1return rtn_sentence, cc# 得到分词后的输入句子training_sentences, training_count = get_data_sentences(src_data)print('training sentence counts:{}'.format(training_count))# 训练word2vec模型model_size = 100# vector_size:单词向量维度;min_count:忽略所有总频率低于此的单词word2vec_model = word2vec.Word2Vec(training_sentences, vector_size=model_size, min_count=3)def get_sentence_vector(sen, dim):"""average word vectors to sentence vector"""# 初始化句子向量sen_vec = np.zeros(dim).reshape((1, dim))# 统计单词数目cc = 0# 循环遍历每个句子的单词for word in sen:try:# 单词和嵌入之间的映射,将每个单词编码为(1,100)的向量sen_vec += word2vec_model.wv[word].reshape((1, dim))cc += 1except Exception:passif cc != 0:# 句子向量为词向量累加的平均sen_vec /= ccreturn sen_vecdef get_sentence_vectors(data_sentences, model_size):"""获得训练集的词向量编码"""sentences_vector = []# 统计句子的数量cc = 0# 循环遍历每一个句子for each_sen in data_sentences:# 获取每个句子的词向量sentences_vector.append(get_sentence_vector(each_sen, model_size))cc += 1return sentences_vector, cc# 将训练集用word2vec进行词向量编码X_train_sentences_vector, X_train_count = get_sentence_vectors(X_train, model_size)print('training sentence counts:{}'.format(X_train_count))# 将测试集用word2vec进行词向量编码X_test_sentences_vector, X_test_count = get_sentence_vectors(X_test, model_size)print('testing sentence counts:{}'.format(X_test_count))text_clf = LogisticRegression()# 训练text_clf.fit(np.squeeze(X_train_sentences_vector), y_train)# 预测y_pred = []for each_sen_vec in X_test_sentences_vector:pre_res = text_clf.predict(each_sen_vec)y_pred.append(pre_res[0])# 评估print('accuracy %s' % accuracy_score(y_pred, y_test))labels = y_train.unique()print('Labels: ', labels)print(confusion_matrix(y_test, y_pred, labels=labels))

training sentence counts:2539training sentence counts:2031testing sentence counts:508accuracy 0.7165354330708661Labels: [3 4][[180 58][ 86 184]]

3. doc2vec

这部分知识可以参考:

Multi-Class Text Classification Model Comparison and Selection/gensim/models/doc2vec.html

word2vec的同样理念可以扩展到文档中,我们不是学习单词的特征表示,而是学习句子或文档的特征表示。

from gensim.models.doc2vec import Doc2Vec, TaggedDocumentdef get_data_sentences(input_data):"""得到输入句子:param input_data: 输入文件:return:"""rtn_sentence = []cc = 0# 将DataFrame 作为(index, Series) pairs来进行迭代for curr_index, curr_row in input_data.iterrows():rtn_sentence.append(curr_row['text_content_segmentation'].split())cc += 1return rtn_sentence, cc# 得到分词后的输入句子training_sentences, training_count = get_data_sentences(src_data)print('training sentence counts:{}'.format(training_count))documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(training_sentences)]# 训练Doc2Vec模型model_size = 100# vector_size:单词向量维度;min_count:忽略所有总频率低于此的单词doc2vec_model = Doc2Vec(documents, vector_size=model_size, min_count=3)#def get_sentence_vector(sen, dim):# 循环遍历每个句子的单词sen_list = []for word in sen:sen_list.append(word)try:# 单词和嵌入之间的映射,将每个单词编码为(1,100)的向量sen_vec = doc2vec_model.infer_vector(sen_list).reshape(1,dim)except Exception:passreturn sen_vecdef get_sentence_vectors(data_sentences, model_size):"""获得训练集的句子向量编码"""sentences_vector = []# 统计句子的数量cc = 0# 循环遍历每一个句子for each_sen in data_sentences:# 获取每个句子的词向量sentences_vector.append(get_sentence_vector(each_sen, model_size))cc += 1return sentences_vector, cc# 将训练集用Doc2Vec进行词向量编码X_train_sentences_vector, X_train_count = get_sentence_vectors(X_train, model_size)print('training sentence counts:{}'.format(X_train_count))# 将测试集用Doc2Vec进行词向量编码X_test_sentences_vector, X_test_count = get_sentence_vectors(X_test, model_size)print('testing sentence counts:{}'.format(X_test_count))text_clf = LogisticRegression()# 训练text_clf.fit(np.squeeze(X_train_sentences_vector), y_train)# 预测y_pred = []for each_sen_vec in X_test_sentences_vector:pre_res = text_clf.predict(each_sen_vec)y_pred.append(pre_res[0])# 评估print('accuracy %s' % accuracy_score(y_pred, y_test))labels = y_train.unique()print('Labels: ', labels)print(confusion_matrix(y_test, y_pred, labels=labels))

training sentence counts:2539training sentence counts:2031testing sentence counts:508accuracy 0.8523622047244095Labels: [3 4][[203 35][ 40 230]]

4. LDA主题模型

主题模型用于分类可以参考:Using LDA Topic Models as a Classification Model Input

# 获取所有文本list_corpus = []for ele in X:list_corpus.append(ele.split())# 实现单词和它们的整数id之间的映射id2word = gensim.corpora.Dictionary(list_corpus)# 根据频率过滤出字典id2word.filter_extremes(no_below=3, no_above=0.35)# 为所有单词分配新单词pactify()# 将文档转换为单词袋(BOW)格式= (token_id, token_count)元组的列表corpus = [id2word.doc2bow(text) for text in list_corpus]print(corpus)# LDA算法的优化实现,能够利用多核cpu的能力lda_train = gensim.models.ldamulticore.LdaMulticore(corpus=corpus,num_topics=2,id2word=id2word,chunksize=100,workers=7,passes=1,eval_every=1,per_word_topics=True)# 获取最重要的主题# num_topics要包含的主题数目# num_words:每个主题包含的单词数目lda_train.print_topics(num_topics=11, num_words=15)

[(0,'0.013*"设备" + 0.011*"制造" + 0.010*"年" + 0.007*"领域" + 0.006*"平台" + 0.006*"互联网" + 0.006*"系统" + 0.006*"国内" + 0.006*"包括" + 0.006*"工业" + 0.005*"自动化" + 0.005*"设计" + 0.005*"专业" + 0.005*"游戏" + 0.005*"成立"'),(1,'0.014*"系统" + 0.011*"软件" + 0.011*"工程" + 0.010*"解决方案" + 0.008*"管理" + 0.008*"平台" + 0.008*"设计" + 0.008*"开发" + 0.008*"领域" + 0.007*"建筑" + 0.007*"年" + 0.007*"项目" + 0.007*"专业" + 0.007*"信息化" + 0.007*"相关"')]

# 获取给定文档的主题分布# bow:(token_id, token_count)元组的列表;# minimum_probability:分配的概率低于此阈值的主题将被丢弃。lda_train.get_document_topics(bow=corpus[0], minimum_probability=0.0)

[(0, 0.005405969), (1, 0.99459404)]

5.Fasttext

不了解的可以参考:Fasttext快速入门

Fasttext是一个高效学习单词表示和句子分类的库

# 将数据写入文件def write_to_file(file_name, input_x, input_y):"""write to fasttext format"""with codecs.open(file_name, mode='w', encoding='utf-8') as fout:for ele in zip(input_x, input_y):fout.write("__label__" + str(ele[1]) + ' ' + ele[0] + '\n')# write training filewrite_to_file(os.path.join(data_dir, 'fasttext.train'), X_train, y_train)# write testing filewrite_to_file(os.path.join(data_dir, 'fasttext.test'), X_test, y_test)import fasttext as fttrain_file = os.path.join(data_dir, 'fasttext.train')output = os.path.join(data_dir, 'fasttest.model')test_file = os.path.join(data_dir, 'fasttext.test')print('training---------')# Train the classifierclassifier = ft.train_supervised(train_file)print('testing---------------')# Test the classifierresult = classifier.test(test_file)print(result)

training---------testing---------------(508, 0.9389763779527559, 0.9389763779527559)

如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。