【自然语言处理】词袋模型在文本分类中的用法

news2024/9/29 7:23:55

词袋模型在文本分类中的用法

1.加载数据

20 Newsgroups:数据被组织成 20 个不同的新闻组,每个新闻组对应一个不同的主题。一些新闻组彼此非常密切相关(例如 comp.sys.ibm.pc.hardware / comp.sys.mac.hardware),而其他新闻组则非常不相关(例如 misc.forsale / soc.religion.christian)。以下是 20 个新闻组的列表,按主题划分(或多或少):

在这里插入图片描述
数据集:下载地址

# 加载训练集、测试集
from sklearn import datasets
twenty_train = datasets.load_files("20news-bydate/20news-bydate-train")
twenty_test = datasets.load_files("20news-bydate/20news-bydate-test")

sklearn.datasets.load_files(container_path, description=None, categories=None, load_content=True, shuffle=True, encoding=None, decode_error=‘strict’, random_state=0)

  • container_path:container_folder 的路径;
  • load_content = True:是否把文件中的内容加载到内存;
  • encoding = None:编码方式。当前文本文件的编码方式一般为 utf-8,如果不指明编码方式(encoding=None),那么文件内容将会按照 bytes 处理,而不是 unicode 处理。

返回值:Bunch,Dictionary-like object。主要属性包括:

  • data:原始数据;
  • filenames:每个文件的名字;
  • target:类别标签(从 0 0 0 开始的整数索引);
  • target_names:类别标签的具体含义(由子文件夹的名字 category_1_folder 等决定)。

2.文本表示

将文本文件变成数字的特征表示,这里主要是利用词袋模型。

2.1 BOW

使用 CountVectorizer 构建词频向量。CountVectorizer 支持单词或者连续字符的 N-gram 模型的计数,利用 scipy.sparse 矩阵只在内存中保存特征向量中非 0 0 0 元素位置以节省内存。

from sklearn.feature_extraction.text import CountVectorizer
count_vect = CountVectorizer(stop_words="english", decode_error='ignore')  # 创建词频转换器
X_train_counts = count_vect.fit_transform(twenty_train.data)  # 转换训练集
print(X_train_counts.shape)
(11314, 129782)

2.2 TF-IDF

用 TfidfTransformer 将词频向量转为 TF-IDF 形式。

from sklearn.feature_extraction.text import TfidfTransformer
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
print(X_train_tfidf.shape)
(11314, 129782)

3.文本分类

3.1 正常流程

离散型朴素贝叶斯 MultinomialNB,朴素贝叶斯模型在多项分布假设下的实现,适用于多分类场景。

from sklearn.naive_bayes import MultinomialNB
clf = MultinomialNB()
clf.fit(X_train_tfidf, twenty_train.target)
docs_new = ['God is love', 'OpenGL on the GPU is fast']
X_new_counts = count_vect.transform(docs_new)  # 计算词频
X_new_tfidf = tfidf_transformer.transform(X_new_counts)  # 计算 TF-IDF
y_pred = clf.predict(X_new_tfidf)
for doc, category in zip(docs_new, y_pred):  # category是数字
    print(("%r => %s")%(doc, twenty_train.target_names[category]))

在这里插入图片描述

3.2 管道流水

使用管道后,测试集不用一步步重复训练集的预处理,直接管道处理了。

from sklearn.pipeline import Pipeline
text_clf = Pipeline([('vect', CountVectorizer(stop_words="english", decode_error='ignore')),
                    ('tfidf', TfidfTransformer()),
                    ('clf', MultinomialNB())
                     ])
text_clf = text_clf.fit(twenty_train.data, twenty_train.target)  # 训练集
score = text_clf.score(twenty_test.data, twenty_test.target)  # 测试集
print(score)
0.8169144981412639

SVM,对于大型数据集,使用 LinearSVC 或 SGDClassifier。

from sklearn.linear_model import SGDClassifier
from sklearn import metrics
text_clf_2 = Pipeline([('vect', CountVectorizer(stop_words='english', decode_error='ignore')), # 去停用词
                      ('tfidf', TfidfTransformer()),
                      ('clf', SGDClassifier(loss='hinge', penalty='l2', alpha=1e-3, max_iter=100, random_state=42))
                       ])
text_clf_2.fit(twenty_train.data, twenty_train.target)
# text_clf_2.score(twenty_test.data, twenty_test.target)
y_pred = text_clf_2.predict(twenty_test.data)
acc = metrics.accuracy_score(twenty_test.target, y_pred)
print(acc)
0.8227562400424854

4.结果报告

各类别的精确度,召回率,F值等。

print(metrics.classification_report(twenty_test.target, y_pred, target_names=twenty_test.target_names))

在这里插入图片描述

5.超参调优

5.1 网格搜索

  • CountVectorizer() 中的 n-gram
  • TfidfTransformer() 中的 use_idf
  • SGClassifier() 中的惩罚系数 alpha
from sklearn.model_selection import GridSearchCV
parameters = {
            'vect__ngram_range': [(1, 1), (1, 2)],
            'tfidf__use_idf': (True, False),
            'clf__alpha': (1e-2, 1e-3)
             }
gs_clf = GridSearchCV(text_clf_2, parameters, n_jobs=-1, cv=5)  # text_clf_2: SVC 的 Pipeline
grid_result = gs_clf.fit(twenty_train.data, twenty_train.target)
print("Best: %f \nusing %s" % (grid_result.best_score_, grid_result.best_params_))
Best: 0.906842 
using {'clf__alpha': 0.001, 'tfidf__use_idf': True, 'vect__ngram_range': (1, 2)}

5.2 随机搜索

随机搜索进行超参数优化。

from sklearn.model_selection import RandomizedSearchCV
parameters = {
            'vect__ngram_range': [(1, 1), (1, 2), (2, 2)],
            'tfidf__use_idf': (True, False),
            'clf__alpha': (1e-1, 1e-2, 1e-3, 1e-4, 1e-5)
             }
rs_clf = RandomizedSearchCV(text_clf_2, parameters, n_jobs=-1, cv=5)
rs_result = rs_clf.fit(twenty_train.data, twenty_train.target)
print("Best: %f \nusing %s" % (rs_result.best_score_, rs_result.best_params_))
Best: 0.927436 
using {'vect__ngram_range': (1, 2), 'tfidf__use_idf': True, 'clf__alpha': 1e-05}

已确定 TfidfTransformer 里的参数 use_idf=True 会更好。

5.3 网格搜索-增加超参数

增加参数:

  • CountVectorizer 里的 max_df:按 比例绝对数量 删除 d f超过 max_df 的词。
  • CountVectorizer里的 max_features:选择 tf 最大的 max_features 个特征。
  • TfidfTransformer里的 norm:数据标准化,{‘l1’, ‘l2’} or None, default=’l2’。
  • SGDClassifier里的 penalty:惩罚项。
  • SGDClassifier里的 n_iter:迭代次数。

重要的参数:

  • vect__max_df
  • vect__ngram_range
  • clf__alpha
  • clf__penalty
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import SGDClassifier
from sklearn.pipeline import Pipeline

text_clf_3 = Pipeline([
    ('vect', CountVectorizer(stop_words="english", decode_error='ignore')),
    ('tfidf', TfidfTransformer()),
    ('clf', SGDClassifier()), 
]) 

parameters = {
    'vect__max_df': (0.5, 0.75, 1.0),
    'vect__max_features': (None, 10000, 50000,60000),
    'vect__ngram_range': [(1, 1), (1, 2),(2,2)],  
    'tfidf__norm': ('l1', 'l2'), 
    'clf__alpha': (0.0001, 0.00001, 0.000001,0.0000001),
    'clf__penalty': ('l2', 'elasticnet'),
    'clf__max_iter': (10, 50, 80),
}

gs_clf = GridSearchCV(text_clf_3, parameters, n_jobs = -1, cv=5)
grid_result = gs_clf.fit(twenty_train.data, twenty_train.target)
print("Best: %f \nusing %s" % (grid_result.best_score_, grid_result.best_params_))

计算的时间有点长,最好自己验证一下。

Best: 0.931766 
using {'vect__ngram_range': (1, 2), 
	   'clf__alpha': 1e-07, 
	   'vect__max_df': 0.75, 
	   'vect__max_features': None, 
	   'clf__n_iter': 50, 
	   'clf__penalty': 'elasticnet', 
	   'tfidf__norm': 'l1'
}

总结:当文本被向量化后,就可以将其看作是数字,按照常见的机器学习方法进行回归、分类、聚类、降维等任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/174652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生之Docker容器的存储管理

一、检查本地docker环境 1.检查宿主机系统版本 [rootdocker ~]# cat /etc/centos-release CentOS Linux release 7.6.1810 (Core) 2.检查docker版本 [rootdocker ~]# docker -v Docker version 20.10.18, build b40c2f6二、创建一个测试httpd容器 1.创建测试目录 [rootdoc…

Python版本PathPlanning运动规划库中RotationToWorldFrame函数内部计算过程分析

本文主要对Python版本PathPlanning运动规划库中RotationToWorldFrame函数的内部计算过程分析,包括相关必备python基础和计算过程分析两部分,并给出了等效的MATLAB版本计算过程程序,方便分析对比。 (注:RotationToWorld…

【春节旅游攻略】南京周边出发,小众又好玩的景点推荐

【写在前面】 过年了,今天咱不谈技术,聊聊轻松的话题,旅游,其实博主很喜欢去外面走走看的,特汇总了一个4天3晚的旅行攻略,说走就走,带上自己的亲人多看看外面的锦世繁华。 三人行,…

使用最小二乘法和最大似然法估计非线性模型

专注系列化、高质量的R语言教程推文索引 | 联系小编 | 付费合集本文是年前的最后一篇推文,我们来学习一下使用最小二乘法和最大似然法进行非线性模型估计。模型估计是指,在模型形式已知的情况下,求解出可以使已有数据与模型形式最大程度上相符…

【日常系列】LeetCode《28·动态规划3》

数据规模->时间复杂度 <10^4 &#x1f62e;(n^2) <10^7:o(nlogn) <10^8:o(n) 10^8<:o(logn),o(1) 内容 二维数组中的路径问题 买卖股票的最佳时机 lc 62【剑指 098】【top100】&#xff1a;不同路径 https://leetcode.cn/problems/unique-paths/ 提示&#x…

分享优秀的视频地址

【2022 RISC-V中国峰会-芯来演讲合集】https://www.bilibili.com/video/BV1mV4y1W785?vd_source733efcf14020a43e7dac58e4c28ca0c8【计算机组成与设计&#xff1a;RISC-V【浙江大学】】https://www.bilibili.com/video/BV1tz411z7GN?vd_source733efcf14020a43e7dac58e4c28ca0…

【Dat图片的位异或解密】

文章目录 异或一、图片字节标识二、开始异或计算异或 异或(eor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为"⊕"&#xff0c;计算机符号为"eor"。其运算法则为: a⊕b (a ∧ b) ∨ (a ∧b) 如果a、b两个值不相同&#xff0c;则异或结果为1。…

Tkinter的Label与Button

Tkinter是Python的一个内置包&#xff0c;主要用于简单的界面设计&#xff0c;使用起来非常方便。 目录 一、创建界面 1. 具体步骤 1.1 导入tkinter包 1.2 tk.Tk()函数&#xff1a;创建一个主界面&#xff0c;并命名为root 1.3 root.title()函数&#xff1a;给root界面设置…

API 接口案例--基于 MySQL 数据库 + Express对外提供用户列表的 API 接口服务

API 接口案例1. 案例需求2. 主要的实现步骤3. 搭建项目的基本结构4. 创建基本的服务器5. 创建 db 数据库操作模块6. 创建 user_ctrl 模块7. 创建 user_router 模块8. 导入并挂载路由模块9. 使用 try…catch 捕获异常1. 案例需求 基于 MySQL 数据库 Express 对外提供用户列表的…

【论文速递】WACV2022 - 基于小样本分割的多尺度Non-Novel片段消除方法

【论文速递】WACV2022 - 基于小样本分割的多尺度Non-Novel片段消除方法 【论文原文】&#xff1a;Elimination of Non-Novel Segments at Multi-Scale for Few-Shot Segmentation 获取地址&#xff1a;https://openaccess.thecvf.com/content/WACV2023/papers/Kayabasi_Elimi…

【睿睿的2022年度总结和2023的目标】

博客主页&#xff1a;张栩睿的博客主页欢迎关注&#xff1a;点赞收藏留言系列专栏&#xff1a;c语言学习家人们写博客真的很花时间的&#xff0c;你们的点赞和关注对我真的很重要&#xff0c;希望各位路过的朋友们能多多点赞并关注我&#xff0c;我会随时互关的&#xff0c;欢迎…

畅捷通T+与道一云对接集成报销凭证

畅捷通T与道一云对接集成获取报销信息列表连通凭证创建(报销保险费&#xff08;甘肃&#xff09;)数据源系统:道一云在道一云坚实的技术基础上&#xff0c;道一云推出全新升级的2.0产品矩阵&#xff0c;分别是低码平台、智能门户、场景应用。基于云原生底座&#xff0c;为企业提…

Allegro如何设置等长规则操作指导

Allegro如何设置等长规则操作指导 PCB设计需要给某一组信号做组间等长的时候,需要给这个组设置等长规则,如下图 以给以下两个网络设置等长规则为例 具体操作如下 打开规则管理器

【华为上机真题 2023】寻找相同子串

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

(17)go-micro微服务Prometheus监控

文章目录一 Prometheus监控介绍1.微服务监控系统promethues介绍2.微服务监控系统promethues工作流程二 Prometheus监控重要组件和重要概念1.微服务监控系统promethues重要组件2.微服务监控系统promethues重要概念三 微服务监控系统grafana看板四 Prometheus监控Grafana看板安装…

【LeetCode每日一题:1817. 查找用户活跃分钟数~~~读懂题目意思+HashMap】

题目描述 给你用户在 LeetCode 的操作日志&#xff0c;和一个整数 k 。日志用一个二维整数数组 logs 表示&#xff0c;其中每个 logs[i] [IDi, timei] 表示 ID 为 IDi 的用户在 timei 分钟时执行了某个操作。 多个用户 可以同时执行操作&#xff0c;单个用户可以在同一分钟内…

数据库 | 事务相关知识点总结

本专栏收录了数据库的知识点&#xff0c;而从本文起&#xff0c;将讲述有关于数据库设计有关知识点&#xff0c;提供给有需要的小伙伴进行学习&#xff0c;本专栏地址可以戳下面链接查看 &#x1f388; 数据库知识点总结&#xff08;持续更新中&#xff09;&#xff1a;【数据库…

LeetCode101_101. 对称二叉树

LeetCode101_101. 对称二叉树 一、描述 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1…

多表查询与7种JOINS的实现

文章目录1.案例多表连接案例说明笛卡尔积&#xff08;或交叉连接&#xff09;2. 多表查询分类讲解角度1&#xff1a;等值连接与非等值连接角度2&#xff1a;自连接与非自连接角度3&#xff1a;内连接与外连接SQL92&#xff1a;使用()创建连接3. SQL99语法实现多表查询内连接(IN…

分类回归树简单理解总结

CART 决策树 CART决策树&#xff08;Classification And Regression Tree&#xff09;&#xff0c;可以做为分类树也可以作为回归树。 什么是回归树&#xff1f; 在分类树中我们可以处理离散的数据&#xff08;数据种类有限的数据&#xff09;它输出的数据样本是数据的类别&…