建设工程信息服务平台新网站,郑州企业网站建设公司,响应式网站制作流程图,商务网站规划与设计实训报告文章目录 0 简介1 前言2 中文文本分类3 数据集准备4 经典机器学习方法4.1 分词、去停用词4.2 文本向量化 tf-idf4.3 构建训练和测试数据4.4 训练分类器4.4.1 logistic regression分类器 4.5 Random Forest 分类器4.6 结论 5 深度学习分类器 - CNN文本分类5.1 字符级特征提取 0 …文章目录0 简介1 前言2 中文文本分类3 数据集准备4 经典机器学习方法4.1 分词、去停用词4.2 文本向量化 tf-idf4.3 构建训练和测试数据4.4 训练分类器4.4.1 logistic regression分类器4.5 Random Forest 分类器4.6 结论5 深度学习分类器 - CNN文本分类5.1 字符级特征提取0 简介今天学长向大家介绍一个毕设项目中文文本分类技术中文文本分类 ( 机器学习 和 深度学习 ) - 新闻分类 情感分类 垃圾邮件分类选题指导, 项目分享见文末1 前言学长今天帮助同学开发项目正好需要到文本分类今天就带大家梳理一下中文文本分类的主要方法和流程学长本片博客的目的主要记录学长自己构建文本分类系统的过程分别构建基于传统机器学习的文本分类和基于深度学习的文本分类系统并在同一数据集上进行测试。2 中文文本分类作为NLP领域最经典的场景之一文本分类积累了大量的技术实现方法如果将是否使用深度学习技术作为标准来衡量实现方法大致可以分成两类基于传统机器学习的文本分类基于深度学习的文本分类facebook之前开源的fastText属于简化版的第二类词向量取平均直接进softmax层还有业界研究上使用比较多的TextCNN模型属于第二类。学长本片博客的目的主要记录学长自己构建文本分类系统的过程分别构建基于传统机器学习的文本分类和基于深度学习的文本分类系统并在同一数据集上进行测试。经典的机器学习方法采用获取tf-idf文本特征分别喂入logistic regression分类器和随机森林分类器的思路并对两种方法做性能对比。基于深度学习的文本分类这里主要采用CNN对文本分类考虑到RNN模型相较CNN模型性能差异不大并且耗时还比较久这里就不多做实验了。实验过程有些比较有用的small trick分享包括多进程分词、训练全量tf-idf、python2对中文编码的处理技巧等等在下文都会仔细介绍。3 数据集准备本文采用的数据集是很流行的搜狗新闻数据集get到的时候已经是经过预处理的了所以省去了很多数据预处理的麻烦数据集内容如下数据集一共包括10类新闻每类新闻65000条文本数据训练集50000条测试集10000条验证集5000条。4 经典机器学习方法4.1 分词、去停用词使用短文本分类博文中提到的分词工具类对训练集、测试集、验证集进行多进程分词以节省时间importmultiprocessing tmp_catalog/home/zhouchengyu/haiNan/textClassifier/data/cnews/file_list[tmp_catalogcnews.train.txt,tmp_catalogcnews.test.txt]write_list[tmp_catalogtrain_token.txt,tmp_catalogtest_token.txt]deftokenFile(file_path,write_path):word_dividerWordCut()withopen(write_path,w)asw:withopen(file_path,r)asf:forlineinf.readlines():lineline.decode(utf-8).strip()token_senword_divider.seg_sentence(line.split(\t)[1])w.write(line.split(\t)[0].encode(utf-8)\ttoken_sen.encode(utf-8)\n)printfile_path has been token and token_file_name is write_path poolmultiprocessing.Pool(processes4)forfile_path,write_pathinzip(file_list,write_list):pool.apply_async(tokenFile,(file_path,write_path,))pool.close()pool.join()# 调用join()之前必须先调用close()printSub-process(es) done.4.2 文本向量化 tf-idf这里有几点需要注意的一是计算tf-idf是全量计算所以需要将traintestval的所有corpus都相加再进行计算二是为了防止文本特征过大需要去低频词因为是在jupyter上写的所以测试代码的时候先是选择最小的val数据集成功后再对test,train数据集迭代操作希望不要给大家留下代码冗余的影响…[悲伤脸]。实现代码如下defconstructDataset(path): path: file path rtype: lable_list and corpus_list label_list[]corpus_list[]withopen(path,r)asp:forlineinp.readlines():label_list.append(line.split(\t)[0])corpus_list.append(line.split(\t)[1])returnlabel_list,corpus_list tmp_catalog/home/zhouchengyu/haiNan/textClassifier/data/cnews/file_pathval_token.txtval_label,val_setconstructDataset(tmp_catalogfile_path)printlen(val_set)fromsklearn.feature_extraction.textimportTfidfTransformerfromsklearn.feature_extraction.textimportCountVectorizer tmp_catalog/home/zhouchengyu/haiNan/textClassifier/data/cnews/write_list[tmp_catalogtrain_token.txt,tmp_catalogtest_token.txt]tarin_label,train_setconstructDataset(write_list[0])# 50000test_label,test_setconstructDataset(write_list[1])# 10000# 计算tf-idfcorpus_settrain_setval_settest_set# 全量计算tf-idfprintlength of corpus is: str(len(corpus_set))vectorizerCountVectorizer(min_df1e-5)# drop df 1e-5,去低频词transformerTfidfTransformer()tfidftransformer.fit_transform(vectorizer.fit_transform(corpus_set))wordsvectorizer.get_feature_names()printhow many words: {0}.format(len(words))printtf-idf shape: ({0},{1}).format(tfidf.shape[0],tfidf.shape[1]) length of corpus is: 65000 how many words: 379000 tf-idf shape: (65000,379000) 4.3 构建训练和测试数据因为本来文本就是以一定随机性抽取成3份数据集的所以这里就不shuffle啦偷懒一下下。fromsklearnimportpreprocessing# encode labelcorpus_labeltarin_labelval_labeltest_label encoderpreprocessing.LabelEncoder()corpus_encode_labelencoder.fit_transform(corpus_label)train_labelcorpus_encode_label[:50000]val_labelcorpus_encode_label[50000:55000]test_labelcorpus_encode_label[55000:]# get tf-idf datasettrain_settfidf[:50000]val_settfidf[50000:55000]test_settfidf[55000:]4.4 训练分类器4.4.1 logistic regression分类器fromsklearn.linear_modelimportLogisticRegressionfromsklearn.metricsimportclassification_report# from sklearn.metrics import confusion_matrix# LogisticRegression classiy modellr_modelLogisticRegression()lr_model.fit(train_set,train_label)printval mean accuracy: {0}.format(lr_model.score(val_set,val_label))y_predlr_model.predict(test_set)printclassification_report(test_label,y_pred)分类结果如下包括准确率、召回率、F1值:4.5 Random Forest 分类器# 随机森林分类器fromsklearn.ensembleimportRandomForestClassifier rf_modelRandomForestClassifier(n_estimators200,random_state1080)rf_model.fit(train_set,train_label)printval mean accuracy: {0}.format(rf_model.score(val_set,val_label))y_predrf_model.predict(test_set)printclassification_report(test_label,y_pred)分类结果包括准确率、召回率、F1值:4.6 结论1 上面采用逻辑回归分类器和随机森林分类器做对比2 可以发现除了个别分类随机森林方法有较大进步大部分都差于逻辑回归分类器3 并且200棵树的随机森林耗时过长比起逻辑回归分类器来说运算效率太低5 深度学习分类器 - CNN文本分类5.1 字符级特征提取这里和前文差异比较大的地方主要是提取文本特征这一块这里的CNN模型采用的是字符级特征提取比如data目录下cnews_loader.py中defread_file(filename):读取文件数据contents,labels[],[]withopen_file(filename)asf:forlineinf:try:label,contentline.strip().split(\t)contents.append(list(content))# 字符级特征labels.append(label)except:passreturncontents,labelsdefbuild_vocab(train_dir,vocab_dir,vocab_size5000):根据训练集构建词汇表存储data_train,_read_file(train_dir)all_data[]forcontentindata_train:all_data.extend(content)counterCounter(all_data)count_pairscounter.most_common(vocab_size-1)words,_list(zip(*count_pairs))# 添加一个 PAD 来将所有文本pad为同一长度words[PAD]list(words)学长这里做了一下测试#! /bin/env python# -*- coding: utf-8 -*-fromcollectionsimportCounter 字符级别处理, 对于中文来说基本不是原意的字但是也能作为一种统计特征来表征文本 content1你好呀大家content2你真的好吗# content abcdefgall_data[]all_data.extend(list(content1))all_data.extend(list(content2))# print list(content) # 字符级别处理# print length: str(len(list(content)))counterCounter(all_data)count_pairscounter.most_common(5)words,_list(zip(*count_pairs))words[PAD]list(words)#[PAD, \xe5, \xbd, \xa0, \xe4, \xe7]这种基本不是原意的字符级别的特征也能从统计意义上表征文本从而作为特征这一点需要清楚。最终在同一数据集上得到的分类结果如下 项目分享:大家可自取用于参考学习获取方式见文末!