【自然语言处理】词袋模型在文本分类中的用法
词袋模型在文本分类中的用法
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'
}
总结:当文本被向量化后,就可以将其看作是数字,按照常见的机器学习方法进行回归、分类、聚类、降维等任务。
【自然语言处理】词袋模型在文本分类中的用法相关推荐
- paddle2.0高层API实现自定义数据集文本分类中的情感分析任务
paddle2.0高层API实现自定义数据集文本分类中的情感分析任务 本文包含了: - 自定义文本分类数据集继承 - 文本分类数据处理 - 循环神经网络RNN, LSTM - ·seq2vec· - ...
- EMNLP 2021 | 多标签文本分类中长尾分布的平衡策略
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者 | 黄毅 作者简介:黄毅,本文一作,目前为罗氏集团的数据科学家 ...
- label-embedding在文本分类中的应用
©PaperWeekly 原创 · 作者|蔡杰 学校|北京大学硕士生 研究方向|QA 最近在做文本分类相关的工作,目标是想提高分类器泛化新样本的能力,当有新样本产生的时候能够不需要重新训练分类器.所以 ...
- 飞桨2.0高层api教程——使用预训练词向量进行文本分类
使用预训练的词向量完成文本分类任务 作者: fiyen 日期: 2021.03 摘要: 本示例教程将会演示如何使用飞桨内置的Imdb数据集,并使用预训练词向量进行文本分类. 摘要 在这个示例中,我们将 ...
- FastText文本分类中的n-grams
FastText文本分类中的n-grams FastText FastText模型结构 FastText n-grams n-grams如何计算 FastText FastText是facebook ...
- 文本分类中的文本特征表示
Introduce 文本话题分析文本分类的一个应用领域,主要是针对文本表现的主题的划分.目前,针对文本话题分类的研究还是很热的,主要包括微博,知乎等大型话题社区,论坛类网站.之前知乎针对该问题在著名的 ...
- 公开课报名 | 那些年,我们在文本分类中遇到的坑
文本分类问题是企业在 NLP 领域中处理文本数据时经常会遇到的一个问题,很多时候,我们需要将文本信息进行分类,或提相关的接口以供外部进行文本上传,在针对于用户所上传的文档信息就需要进行文档内容的分类, ...
- 实体链接(Entity Linking)、依存句法分析、成分句法树、词袋模型、文本向量空间模型(TF-IDF)、
实体链接(Entity Linking).依存句法分析.成分句法树.词袋模型.文本向量空间模型(TF-IDF) 目录
- 自然语言处理︱简述四大类文本分析中的“词向量”(文本词特征提取)
笔者在看各种NLP的论文.文献.博客之中发现在应用过程中,有种类繁多的词向量的表达.笔者举例所看到的词向量有哪些. 词向量一般被看做是文档的特征,不同词向量有不同的用法,本文介绍了四类词向量: Has ...
最新文章
- python用哪个版本比较好 2020_2020年最常见的Python面试题答案
- Python-decorator装饰器小结
- matlab二重定积分_怎样用matlab求二重积分?
- 全国教学交流研讨会“教学为本”主题总结
- qemu+linux+x86+64,qemu以64位跟32位的方式跑busybox
- HTML5获取地理位置定位信息
- 机器学习面试-模型融合和提升的算法
- iocomp控件 Crack V512-sp6
- 【Js】JavaScript数据类型隐式转换
- 2021碳纤维山地车哪个牌子好世界10大顶级自行车品牌排行榜
- 天刀霸王枪服务器怎么维护了,霸王枪27日合服 11批天涯合服维护公告
- CVTE 后端开发面经
- 容斥原理 A-1e9个兵临城下
- 视频配音文字转语音怎么弄?介绍几种好用的方法给你
- 银河麒麟V10忘记密码
- 极简Python语法(5)
- 什么软件可以测试自己的穿衣,心理测试:4个女孩,哪个穿衣风格跟你最像?秒测你的真实性格...
- MySQL 8.0 执行 insert 插入数据非常缓慢的问题及解决方法
- python gpib仪器控制_Python的扩展接口[0] - VISA仪器控制
- 计算机组成原理算术运算实验报告,《计算机组成原理》实验报告---8位算术逻辑运算实验.doc...