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

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 Pipelinetext_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'
}

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

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

  1. paddle2.0高层API实现自定义数据集文本分类中的情感分析任务

    paddle2.0高层API实现自定义数据集文本分类中的情感分析任务 本文包含了: - 自定义文本分类数据集继承 - 文本分类数据处理 - 循环神经网络RNN, LSTM - ·seq2vec· - ...

  2. EMNLP 2021 | 多标签文本分类中长尾分布的平衡策略

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者 | 黄毅 作者简介:黄毅,本文一作,目前为罗氏集团的数据科学家 ...

  3. label-embedding在文本分类中的应用

    ©PaperWeekly 原创 · 作者|蔡杰 学校|北京大学硕士生 研究方向|QA 最近在做文本分类相关的工作,目标是想提高分类器泛化新样本的能力,当有新样本产生的时候能够不需要重新训练分类器.所以 ...

  4. 飞桨2.0高层api教程——使用预训练词向量进行文本分类

    使用预训练的词向量完成文本分类任务 作者: fiyen 日期: 2021.03 摘要: 本示例教程将会演示如何使用飞桨内置的Imdb数据集,并使用预训练词向量进行文本分类. 摘要 在这个示例中,我们将 ...

  5. FastText文本分类中的n-grams

    FastText文本分类中的n-grams FastText FastText模型结构 FastText n-grams n-grams如何计算 FastText FastText是facebook ...

  6. 文本分类中的文本特征表示

    Introduce 文本话题分析文本分类的一个应用领域,主要是针对文本表现的主题的划分.目前,针对文本话题分类的研究还是很热的,主要包括微博,知乎等大型话题社区,论坛类网站.之前知乎针对该问题在著名的 ...

  7. 公开课报名 | 那些年,我们在文本分类中遇到的坑

    文本分类问题是企业在 NLP 领域中处理文本数据时经常会遇到的一个问题,很多时候,我们需要将文本信息进行分类,或提相关的接口以供外部进行文本上传,在针对于用户所上传的文档信息就需要进行文档内容的分类, ...

  8. 实体链接(Entity Linking)、依存句法分析、成分句法树、词袋模型、文本向量空间模型(TF-IDF)、

    实体链接(Entity Linking).依存句法分析.成分句法树.词袋模型.文本向量空间模型(TF-IDF) 目录

  9. 自然语言处理︱简述四大类文本分析中的“词向量”(文本词特征提取)

    笔者在看各种NLP的论文.文献.博客之中发现在应用过程中,有种类繁多的词向量的表达.笔者举例所看到的词向量有哪些. 词向量一般被看做是文档的特征,不同词向量有不同的用法,本文介绍了四类词向量: Has ...

最新文章

  1. python用哪个版本比较好 2020_2020年最常见的Python面试题答案
  2. Python-decorator装饰器小结
  3. matlab二重定积分_怎样用matlab求二重积分?
  4. 全国教学交流研讨会“教学为本”主题总结
  5. qemu+linux+x86+64,qemu以64位跟32位的方式跑busybox
  6. HTML5获取地理位置定位信息
  7. 机器学习面试-模型融合和提升的算法
  8. iocomp控件 Crack V512-sp6
  9. 【Js】JavaScript数据类型隐式转换
  10. 2021碳纤维山地车哪个牌子好世界10大顶级自行车品牌排行榜
  11. 天刀霸王枪服务器怎么维护了,霸王枪27日合服 11批天涯合服维护公告
  12. CVTE 后端开发面经
  13. 容斥原理 A-1e9个兵临城下
  14. 视频配音文字转语音怎么弄?介绍几种好用的方法给你
  15. 银河麒麟V10忘记密码
  16. 极简Python语法(5)
  17. 什么软件可以测试自己的穿衣,心理测试:4个女孩,哪个穿衣风格跟你最像?秒测你的真实性格...
  18. MySQL 8.0 执行 insert 插入数据非常缓慢的问题及解决方法
  19. python gpib仪器控制_Python的扩展接口[0] - VISA仪器控制
  20. 计算机组成原理算术运算实验报告,《计算机组成原理》实验报告---8位算术逻辑运算实验.doc...

热门文章

  1. 翻译翻译,什么叫他妈的惊喜?
  2. ec----------
  3. python柱形图颜色_pyplot/matplotlib条形图,填充颜色取决于值
  4. python魔法方法长文详解
  5. 使用Matlab实现脉冲响应不变法
  6. python之使用plt笔记
  7. React将字符串转化成组件,将Antd图标字符串转化为图标组件
  8. 计算机excel还原,『怎么还原电脑自带的excle』excel表格保存过了怎么恢复原来的数据...
  9. Mac恢复被修改的文档
  10. 鸿蒙系统荣耀新机,鸿蒙系统要来了?网传荣耀新机搭载鸿蒙 OS