首页 > 其他分享 >文本分类(上)- 基于传统机器学习方法进行文本分类

文本分类(上)- 基于传统机器学习方法进行文本分类

时间:2023-05-17 18:31:31浏览次数:65  
标签:labels 机器 text clf 分类 texts train test 文本


简介

自己由于最近参加了一个比赛“达观杯”文本智能处理挑战赛,上一周主要在做这一个比赛,看了一写论文和资料,github上搜刮下。。感觉一下子接触的知识很多,自己乘热打铁整理下吧。

接着上一篇文章20 newsgroups数据介绍以及文本分类实例,我们继续探讨下文本分类方法。文本分类作为NLP领域最为经典场景之一,当目前为止在业界和学术界已经积累了很多方法,主要分为两大类:

  • 基于传统机器学习的文本分类
  • 基于深度学习的文本分类

传统机器学习的文本分类通常提取tfidf或者词袋特征,进行训练;这里模型有很多,比如贝叶斯、深度学习的文本分类,主要采用

利用传统机器学习和深度学习进行文本分类

  • 基于传统机器学习方法进行文本分类
    基本思路是:提取tfidf特征,然后喂给各种分类模型进行训练
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.neighbors import KNeighborsClassifier
from sklearn.neural_network.multilayer_perceptron import MLPClassifier
from sklearn.svm import SVC,LinearSVC,LinearSVR
from sklearn.linear_model.stochastic_gradient import SGDClassifier
from sklearn.linear_model.logistic import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier

# 选取下面的8类
selected_categories = [
    'comp.graphics',
    'rec.motorcycles',
    'rec.sport.baseball',
    'misc.forsale',
    'sci.electronics',
    'sci.med',
    'talk.politics.guns',
    'talk.religion.misc']

# 加载数据集
newsgroups_train=fetch_20newsgroups(subset='train',
                                    categories=selected_categories,
                                    remove=('headers','footers','quotes'))
newsgroups_test=fetch_20newsgroups(subset='train',
                                    categories=selected_categories,
                                    remove=('headers','footers','quotes'))

train_texts=newsgroups_train['data']
train_labels=newsgroups_train['target']
test_texts=newsgroups_test['data']
test_labels=newsgroups_test['target']
print(len(train_texts),len(test_texts))

# 贝叶斯
text_clf=Pipeline([('tfidf',TfidfVectorizer(max_features=10000)),
                   ('clf',MultinomialNB())])
text_clf=text_clf.fit(train_texts,train_labels)
predicted=text_clf.predict(test_texts)
print("MultinomialNB准确率为:",np.mean(predicted==test_labels))

# SGD
text_clf=Pipeline([('tfidf',TfidfVectorizer(max_features=10000)),
                   ('clf',SGDClassifier())])
text_clf=text_clf.fit(train_texts,train_labels)
predicted=text_clf.predict(test_texts)
print("SGDClassifier准确率为:",np.mean(predicted==test_labels))

# LogisticRegression
text_clf=Pipeline([('tfidf',TfidfVectorizer(max_features=10000)),
                   ('clf',LogisticRegression())])
text_clf=text_clf.fit(train_texts,train_labels)
predicted=text_clf.predict(test_texts)
print("LogisticRegression准确率为:",np.mean(predicted==test_labels))

# SVM
text_clf=Pipeline([('tfidf',TfidfVectorizer(max_features=10000)),
                   ('clf',SVC())])
text_clf=text_clf.fit(train_texts,train_labels)
predicted=text_clf.predict(test_texts)
print("SVC准确率为:",np.mean(predicted==test_labels))

text_clf=Pipeline([('tfidf',TfidfVectorizer(max_features=10000)),
                   ('clf',LinearSVC())])
text_clf=text_clf.fit(train_texts,train_labels)
predicted=text_clf.predict(test_texts)
print("LinearSVC准确率为:",np.mean(predicted==test_labels))

text_clf=Pipeline([('tfidf',TfidfVectorizer(max_features=10000)),
                   ('clf',LinearSVR())])
text_clf=text_clf.fit(train_texts,train_labels)
predicted=text_clf.predict(test_texts)
print("LinearSVR准确率为:",np.mean(predicted==test_labels))

# MLPClassifier
text_clf=Pipeline([('tfidf',TfidfVectorizer(max_features=10000)),
                   ('clf',MLPClassifier())])
text_clf=text_clf.fit(train_texts,train_labels)
predicted=text_clf.predict(test_texts)
print("MLPClassifier准确率为:",np.mean(predicted==test_labels))

# KNeighborsClassifier
text_clf=Pipeline([('tfidf',TfidfVectorizer(max_features=10000)),
                   ('clf',KNeighborsClassifier())])
text_clf=text_clf.fit(train_texts,train_labels)
predicted=text_clf.predict(test_texts)
print("KNeighborsClassifier准确率为:",np.mean(predicted==test_labels))

# RandomForestClassifier
text_clf=Pipeline([('tfidf',TfidfVectorizer(max_features=10000)),
                   ('clf',RandomForestClassifier(n_estimators=8))])
text_clf=text_clf.fit(train_texts,train_labels)
predicted=text_clf.predict(test_texts)
print("RandomForestClassifier准确率为:",np.mean(predicted==test_labels))

# GradientBoostingClassifier
text_clf=Pipeline([('tfidf',TfidfVectorizer(max_features=10000)),
                   ('clf',GradientBoostingClassifier())])
text_clf=text_clf.fit(train_texts,train_labels)
predicted=text_clf.predict(test_texts)
print("GradientBoostingClassifier准确率为:",np.mean(predicted==test_labels))

# AdaBoostClassifier
text_clf=Pipeline([('tfidf',TfidfVectorizer(max_features=10000)),
                   ('clf',AdaBoostClassifier())])
text_clf=text_clf.fit(train_texts,train_labels)
predicted=text_clf.predict(test_texts)
print("AdaBoostClassifier准确率为:",np.mean(predicted==test_labels))

# DecisionTreeClassifier
text_clf=Pipeline([('tfidf',TfidfVectorizer(max_features=10000)),
                   ('clf',DecisionTreeClassifier())])
text_clf=text_clf.fit(train_texts,train_labels)
predicted=text_clf.predict(test_texts)
print("DecisionTreeClassifier准确率为:",np.mean(predicted==test_labels))

输出结果为:

MultinomialNB准确率为: 0.8960196779964222
SGDClassifier准确率为: 0.9724955277280859
LogisticRegression准确率为: 0.9304561717352415
SVC准确率为: 0.13372093023255813
LinearSVC准确率为: 0.9749552772808586
LinearSVR准确率为: 0.00022361359570661896
MLPClassifier准确率为: 0.9758497316636852
KNeighborsClassifier准确率为: 0.45840787119856885
RandomForestClassifier准确率为: 0.9680232558139535
GradientBoostingClassifier准确率为: 0.9186046511627907
AdaBoostClassifier准确率为: 0.5916815742397138
DecisionTreeClassifier准确率为: 0.9758497316636852

从上面结果可以看出,不同分类器在改数据集上的表现差别是比较大的,所以在做文本分类的时候要多尝试几种方法,说不定有意外收获;另外TfidfVectorizer、LogisticRegression等方法,我们可以设置很多参数,这里对实验的效果也影响比较大,比如TfidfVectorizer中一个参数ngram_range直接影响提取的特征,这里也是需要多磨多练;

标签:labels,机器,text,clf,分类,texts,train,test,文本
From: https://blog.51cto.com/u_16116809/6292996

相关文章

  • Jmeter部署到Linux实现分发压测时,controller机器回收测试报告时卡死
    问题检查与定位:检查slave-A和slave-B两台执行机,执行机已经finished,无报错,说明执行机已完成测试任务采集到的日志批量分析后得出的结论:在完成并发测试后,vuser要进行释放,由于没有完全释放导致controller机器一直等待(像卡死),而实际上是等待,问题定位后,进行检查发现:问题1: reportge......
  • 山东算法赛网格事件智能分类topline
    赛题链接:http://data.sd.gov.cn/cmpt/cmptDetail.html?id=67baseline:https://aistudio.baidu.com/aistudio/projectdetail/3371314?contributionType=1分数:0.749+ 任务(1)赛题任务基于网格事件数据,对网格中的事件内容进行提取分析,对事件的类别进行划分,具体为根据提供的事件描述,......
  • zabbix-5.4 配置电话、短信、邮件及机器人报警
    zabbix-5.4配置电话、短信、邮件及机器人报警名称IPiso版本zabbix192.168.200.9ubuntu5.41、前置条件已经安装并配置好了Zabbix5以上版本监控系统。提前下载电话短信报警媒介2、导入报警媒介类型3、打开推送助手官网,选择Zabbix模板推送助手官网......
  • 淘宝关键词搜索 API 接口分析商品价格走势(商品列表,销量,价格接口,分类 ID 精准商品数据
    淘宝OpenAPI(Openapplicationprogramminginterface)是一套REST方式的开放应用程序编程接口。淘宝网根据自己提供的电子商务基础服务,抽象并做成一系列的API接口。通过这些接口,可以让外部用户能够通过程序的方式访问淘宝网的数据和平台。淘宝OpenAPI是淘宝开放平台的重要组......
  • 知识库AI机器人客服接口对接-唯一客服系统文档中心
    如果你的需求仅仅是对接自训练的ChatGPT接口,实现自己的个性化机器人,那么可以看看下面的个性化ChatGPT调用接口前提条件是已经搭建好了知识库服务,该服务默认监听端口8083chat接口地址POST http://127.0.0.1:8083/data_collection/searchStream请求头必须是form形式,因为接收数据......
  • 软件测试01:软件及分类和缺陷的定义
    软件测试:软件及分类和缺陷的定义软件程序数据文档软件分类层次分类系统软件应用软件组织分类商业软件开源软件结构分类单机软件分布式软件软件缺陷软件缺陷的由来起源于上世纪70年代中期《测试数据选择的原理》《软件测试的艺术》20世纪80......
  • 查找文本字符串,并返回所在行数据
    #include<iostream>#include<string>#include<Windows.h>#include<fstream>#include<sstream>#include<signal.h>#include<io.h>#include<vector>#include<process.h>#include<cstdio>#include<as......
  • Linux下文本格式异常:with CRLF line terminators
    linux下在处理文本时,有时会遇到列打印或者显示异常:这是因为有些命令输出重写向到文本,会带入默认Windows文本格式,正常的linux文本中每行是以换行符(\n)结束,windows文本中每行是以回车+换行符(\r\n)结束,可以通过dos2unix工具进行转换:通过file文件名命令可以查看输出:linux文本格式为:A......
  • 开源AI聊天机器人MLC LLM发布 可用于多个平台
    目前大多数AI聊天机器人都需要连接到云端进行处理,即使可以本地运行的也配置要求极高。那么是否有轻量化的、无需联网的聊天机器人呢?一个名为MLCLLM的全新开源项目已在GitHub上线,完全本地运行无需联网,甚至集显老电脑、苹果iPhone手机都能运行。MLCLLM项目介绍称......
  • 开源AI聊天机器人MLC LLM发布 可用于多个平台
    目前大多数AI聊天机器人都需要连接到云端进行处理,即使可以本地运行的也配置要求极高。那么是否有轻量化的、无需联网的聊天机器人呢?一个名为MLCLLM的全新开源项目已在GitHub上线,完全本地运行无需联网,甚至集显老电脑、苹果iPhone手机都能运行。MLCLLM项目介绍称......