Datawhale-零基础入门NLP-新闻文本分类Task03

文本是不定长度的,文本表示成计算的能够运算的数字或向量的方法称为词嵌入(Word Embedding)。词嵌入是将不定长的文本转换成定长的空间中。为了解决将原始文本转成固定长度的特征向量问题,scikit-learn提供了以下方法:

  • 令牌化(tokenizing):对每个可能的词令牌分成字符串并赋予整数形的id,通过空格和标点符号作为令牌分隔符。

  • 统计(counting)每个词令牌在文档中的出现次数。

  • 标准化(normalizing)是减少重要的词令牌的出现次数的权重。

使用传统的机器学习方法进行文本分类,思路有Count Vectors + 分类算法(LR/SVM/XGBoost等等),TF-IDF+分类算法(LR/SVM/XGBoost等等)

1 Count Vectors + 分类算法

1.1 Count Vectors

类countVectorizer在但单类中实现了tokenization(词语切分)和occurence counting(出现频数统计):

函数为:

参数详解:

input:string {‘filename’, ‘file’, ‘content’}, default=’content’

定义输入数据的格式,如果是filename,读取的文件名列表,以获取要分析的原始内容;如果是‘file’,序列项必须有一个' read '方法(类文件的对象),该方法被调用来获取内存中的字节;如果是‘content’,输入应该是字符串或字节类型的序列项。

encoding:string,default='utf-8'

进行分析时,使用该类型进行解码。

lowercase:bool,default=True

在进行tokenizing之前,将字符转成小写

ngram_range:tuple (min_n, max_n), default=(1, 1)

要提取的不同单词n-gram或字符n-gram的n值范围的上下边界。

analyzer:string, {‘word’, ‘char’, ‘char_wb’} or callable, default=’word’

分析是由单词n-gram还是字符n-gram组成,‘char_wb’是一个混合状态。

max_df:float in range [0.0, 1.0] or int, default=1.0

当构建词汇表时,忽略文档频率严格高于给定阈值的术语(特定于语料库的停止词)。如果为float,该参数表示文档的比例,整数绝对计数。如果词汇不是none,则忽略此参数。

min_df:float in range [0.0, 1.0] or int, default=1

构建词汇表时,忽略文档频率严格低于给定阈值的术语。这个值在文献中也被称为截止值。如果为float,该参数表示文档的比例,整数绝对计数。如果词汇不是none,则忽略此参数。

例子:

from sklearn.feature_extraction.text import CountVectorizercorpus = ['This is the first document.','This document is the second document.','And this is the third one.','Is this the first document?']vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names())print(X.toarray())vectorizer2 = CountVectorizer(analyzer='word', ngram_range=(2, 2))
X2 = vectorizer2.fit_transform(corpus)
print(vectorizer2.get_feature_names())print(X2.toarray())

 

1.2 分类算法

这里选用了线性模型里边的岭回归做分类,还可以选用SVM,LR,XGBoost等分类算法模型,后边用网格搜索(GridSearchCV)进行参数遍历的会用到。

综合分析:

import pandas as pd
import xgboost as xgb
import lightgbm as lgb
import catboost as cat
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import RidgeClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.svm import  SVC
from sklearn.metrics import f1_score
from sklearn.pipeline import Pipelinetrain_df = pd.read_csv('data/data45216/train_set.csv',sep='\t',nrows=15000)
print(train_df.shape)vectorizer = CountVectorizer(max_features=3000)
train_test = vectorizer.fit_transform(train_df['text'])clf = RidgeClassifier()
clf.fit(train_test[:10000],train_df['label'].values[:10000])
val_pred = clf.predict(train_test[10000:])
print(f1_score(train_df['label'].values[10000:],val_pred,average='macro'))

输出结果为:0.65441877581244

2 TF-IDF+分类算法

2.1 TF-IDF

TF-IDF是词频-逆文档频率,含义是如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为这个词或短语具有很好的类别区分能力,适合用来分类。TF-IDF的假设是,高频率词应该具有高权重,除非它也是高文档频率。逆文档怕频率是使用词条的文档频率来抵消该词的词频对权重的影响,而得到一个较低的权重。

词频(Term Frequency,TF)是指某一个给定的词语在该文件中出现的频率。这个数字是对词数(Term Count)的归一化,以防止它偏向长的文件,对于在某个特定文件中的词语来说,它的重要性可表示为:

                                                                          

其中,分子是该词在文件中的出现次数,而分母是在文件中所有字词出现的次数之和。

逆向文件频率(Inverse Document Frequency,IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数除以包含该词语之文件的数目,再将得到的商取对数得到:

                                                                                  

其中,:语料库中的文件总数;j:包含词语的文件数目,如果该词语不在语料库则导致分母为0,因此,常用作为分母,然后在计算TF和IDF的乘积。

函数为:

 

参数详解:

input:string {‘filename’, ‘file’, ‘content’}, default=’content’

定义输入数据的格式,如果是filename,读取的文件名列表,以获取要分析的原始内容;如果是‘file’,序列项必须有一个' read '方法(类文件的对象),该方法被调用来获取内存中的字节;如果是‘content’,输入应该是字符串或字节类型的序列项。

encoding:string,default='utf-8'

进行分析时,使用该类型进行解码。

lowercase:bool,default=True

在进行tokenizing之前,将字符转成小写

ngram_range:tuple (min_n, max_n), default=(1, 1)

要提取的不同单词n-gram或字符n-gram的n值范围的上下边界。

analyzer:string, {‘word’, ‘char’, ‘char_wb’} or callable, default=’word’

分析是由单词n-gram还是字符n-gram组成,‘char_wb’是一个混合状态。

max_df:float in range [0.0, 1.0] or int, default=1.0

当构建词汇表时,忽略文档频率严格高于给定阈值的术语(特定于语料库的停止词)。如果为float,该参数表示文档的比例,整数绝对计数。如果词汇不是none,则忽略此参数。

min_df:float in range [0.0, 1.0] or int, default=1

构建词汇表时,忽略文档频率严格低于给定阈值的术语。这个值在文献中也被称为截止值。如果为float,该参数表示文档的比例,整数绝对计数。如果词汇不是none,则忽略此参数。

norm:{‘l1’, ‘l2’}, default=’l2’

正则化,‘l2’是平方值,‘l1’是绝对值

use_idf:bool, default=True

启用反向文档频率重新加权

smooth_idf:bool, default=True

通过在文档频率上增加一个来平滑idf权重,就好像一个额外的文档恰好包含集合中的每个术语一次。防止零除法

sublinear_tf:bool, default=False

应用 sublinear tf scaling, i.e. 取代 tf 在with 1 + log(tf).

例子:

from sklearn.feature_extraction.text import TfidfVectorizercorpus = ['This is the first document.','This document is the second document.','And this is the third one.','Is this the first document?']vectorizer = TfidfVectorizer()
x = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names)

2.2 分类算法

这里选用了线性模型里边的岭回归做分类,还可以选用SVM,LR,XGBoost等分类算法模型,后边用网格搜索(GridSearchCV)进行参数遍历的会用到。

综合分析:

tfidf = TfidfVectorizer(ngram_range=(1,3),max_features=3000)
train_test = tfidf.fit_transform(train_df['text'])clf = RidgeClassifier()
clf.fit(train_test[:10000],train_df['label'].values[:10000])
val_pred = clf.predict(train_test[10000:])
print(f1_score(train_df['label'].values[10000:],val_pred,average='macro'))

输出结果为:0.8719098297954606

本章作业:

调整参数可以考虑用网格搜索进行超参数遍历,分别对文本处理方式和分类算法进行遍历。超参数是不直接在估计器内学习的参数,它们作为估计器类中构造函数的参数进行传递,搜索超参数空间以便能获得最好的“交叉验证”,搜索包括:

  • 估计器(回归器或分类器)
  • 参数空间
  • 搜寻或采样候选的方法
  • 交叉验证方案
  • 计分函数

scikit-learn包中提供了两种采样搜索候选的通用方法,GridSearchCV考虑了所有参数组合,RandomizedSearchCV可以从具有指定分布的参数空间中抽取给定数量的候选,这里选用GridSearchCV举例:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import RidgeClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.svm import  SVC
from sklearn.metrics import f1_score
from sklearn.pipeline import Pipeline#遍历TF-IDF的参数
pipeline = Pipeline([('tfidf', TfidfVectorizer()),('clf', SGDClassifier()),
])parameters = {#'tfidf__max_df': (0.5, 0.75, 1.0),'tfidf__max_features': (None, 5000, 10000, 50000),'tfidf__ngram_range': ((1, 1), (1, 2),(1,3)),  # unigrams or bigrams'tfidf__norm': ('l1', 'l2'),'clf__max_iter': (20,),'clf__alpha': (0.00001, 0.000001),'clf__penalty': ('l2', 'elasticnet'),# 'clf__max_iter': (10, 50, 80),
}grid_search = GridSearchCV(pipeline, parameters,  verbose=1)
print("Performing grid search...")
print("pipeline:", [name for name, _ in pipeline.steps])
print("parameters:")
pprint(parameters)
grid_search.fit(train_df['text'].tolist()[:10000],train_df['label'].values[:10000])print("Best score: %0.3f" % grid_search.best_score_)
print("Best parameters set:")
best_parameters = grid_search.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):print("\t%s: %r" % (param_name, best_parameters[param_name]))

遍历分类器:

import pandas as pd
import xgboost as xgb
import lightgbm as lgb
import catboost as cat
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import RidgeClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.svm import  SVC
from sklearn.metrics import f1_score
from sklearn.pipeline import Pipelinetfidf = TfidfVectorizer(ngram_range=(1,3),max_features=3000)
train_test = tfidf.fit_transform(train_df['text'])#定义多个分类函数
classifiers = [('xgb',xgb.XGBClassifier(),{'max_depth': [5, 10, 15, 20, 25],'learning_rate': [0.01, 0.02, 0.05, 0.1, 0.15],'n_estimators': [50, 100, 200, 300, 500],
}),('lgb',lgb.LGBMClassifier(),{'max_depth': [5, 10, 15, 20, 25],'learning_rate': [0.01, 0.02, 0.05, 0.1, 0.15],'n_estimators': [50, 100, 200, 300, 500],
}),('cat',cat.CatBoostClassifier(),{'max_depth': [5, 10, 15, 20, 25],'learning_rate': [0.01, 0.02, 0.05, 0.1, 0.15],'n_estimators': [50, 100, 200, 300, 500],
}),('svc',SVC(),{'kernel': ['rbf'], 'gamma': [1e-3, 1e-4],'C': [1, 10, 100, 1000]})]for name,clf,params in classifiers:grid_search = GridSearchCV(clf,params,n_jobs=1,verbose=1)grid_search.fit(train_test[:10000],train_df['label'].values[:10000])   

 

思考:我用TF-IDF+分类器的验证结果为0.87,提交结果为0.1773,用了Fasttext的验证结果为0.82,提交结果为0.833,产生的原因是什么?

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

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

相关文章

Linus 在圣诞节想提前放假做了这些解释,哈哈哈

最近在 lkml.org 上看到Linus发布的一个信息,挺有意思的,我看了内容,然后根据自己的理解展示给大家看看,如果有不对的地方欢迎指正。好的,5.10内核发布了我真希望在圣诞节来的最后一个星期没有那么多破事,现…

eleemnt-ui修改主题颜色

饿了吗的element-ui使用的是淡蓝色的主题,有时候我们可以自定义主题,官方的文档给我们提供了如何修改主题,介绍的很详细,自己试验过后,觉得很不错,一方面怕忘记,一方面写一写。 方法一是在线生成…

Datawhale-零基础入门NLP-新闻文本分类Task04

1 FastText 学习路径 FastText 是 facebook 近期开源的一个词向量计算以及文本分类工具,FastText的学习路径为: 具体原理就不作解析了,详细教程见:https://fasttext.cc/docs/en/support.html 2 FastText 安装 2.1 基于框架的安装 需要从github下载源…

多重 for 循环,如何提高效率?

2258 字 14 图 : 文章字数6 分钟 : 预计阅读网络 : 内容来源BabyCoder : 编辑整理前言我在《华为 C 语言编程规范》中看到了这个:当使用多重循环时,应该将最忙的循环放在最内层。如下图:由上述很简单的伪代码可以看到,推荐使用的方…

【转】Web服务软件工厂

patterns & practices开发中心 摘要 Web服务软件工厂(英文为Web Service Software Factory,也称作服务工厂)是一个集成的工具、模式、源代码和规范性指导的集合。它的设计是为了帮助你迅速、一致地构建符合普遍的体系结构和设计模式的Web服务。 如果你是一名负责…

单片机外围模块漫谈之二,如何提高ADC转换精度

在此我们简要总结一下ADC的各种指标如何理解,以及从硬件到软件都有哪些可以采用的手段来提高ADC的转换精度。1.ADC指标除了分辨率,速度,输入范围这些基本指标外,衡量一个ADC好坏通常会用到以下这些指标:失调误差,增益误…

Datawhale-零基础入门NLP-新闻文本分类Task05

该任务是用Word2Vec进行预处理,然后用TextCNN和TextRNN进行分类。TextCNN是利用卷积神经网络进行文本文类,TextCNN是用循环神经网络进行文本分类。 1.Word2Vec 文本是一类非结构化数据,文本表示模型有词袋模型(Bag of Words&…

想要学好C++有哪些技巧?

学C能干什么? 往细了说,后端、客户端、游戏引擎开发以及人工智能领域都需要它。往大了说,构成一个工程师核心能力的东西,都在C里。跟面向对象型的语言相比,C是一门非常考验技术想象力的编程语言,因此学习起…

window.open打开新窗口被浏览器拦截的处理方法

一般我们在打开页面的时候&#xff0c; 最常用的就是用<a>标签&#xff0c;如果是新窗口打开就价格target"_blank"属性就可以了&#xff0c; 如果只是刷新当前页面就用window.location.reload()&#xff0c; 在某些特殊情况下也要用到另外一种新窗口打开的方法…

Datawhale-零基础入门NLP-新闻文本分类Task06

之前已经用RNN和CNN进行文本分类&#xff0c;随着NLP的热门&#xff0c;又出现了大热的Attention&#xff0c;Bert&#xff0c;GPT等模型&#xff0c;接下来&#xff0c;就从理论进行相关学习吧。接下来&#xff0c;我们会经常听到“下游任务”等名词&#xff0c;下游任务就是N…

Linux-C编程 / 多线程 / 如何终止某个线程?

示例 demo最简单的 demo&#xff1a;static void* thread1_func(void *arg) {int i 0;// able to be cancelpthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);for(i0; ; i) {printf("thread1 %d\n", i);…

PaddlePaddle入门——基本概念

最近报了百度的深度学习认证&#xff0c;需要使用Paddle进行编程实现&#xff0c;找了一些基础教程&#xff0c;特意记录下来&#xff0c;加深印象。思维导图如下&#xff1a; 一、Paddle的内部执行流程 二、内部详解 1.Variable&#xff08;变量&#xff09; &#xff08;1…

回答一个微信好友的创业问题

ps:很喜欢这种有烟火气息的照片— — 提问&#xff1a;我最近要创业&#xff0c;打算跟一个朋友合伙&#xff0c;但是我朋友不会技术&#xff0c;所以他只投入钱&#xff0c;也不会参与公司的管理。我们启动资金是10万&#xff0c;他打算投入7万&#xff0c;想占股65%。因为没有…

百度深度学习初级认证——已过

开头先放图&#xff0c;百度深度学习初级工程师认证已通过&#xff0c;记录一下备战和考试细节&#xff01;&#xff01;&#xff01; 1.报考 当时是通过百度的AI Studio看到深度学习的认证了&#xff0c;价格是800&#xff0c;然后阴差阳错从百度技术学院的链接看到深度学习…

哦,这是桶排序

漫画&#xff1a;什么是桶排序&#xff1f;要了解桶排序之前&#xff0c;可以先看看上面小灰的那篇文章&#xff0c;我觉得是比较不错的。桶排序也可以理解为分类排序&#xff0c;把不同的数据归类&#xff0c;归类之后再重新排序&#xff0c;每个桶里面的内容就是一类数据&…

如何防御光缆窃听

很多年前&#xff0c;人们就认识到采用铜缆传输信息很容易通过私搭电缆的方式被窃取。对于一个网络和安全管理人员来说&#xff0c;要么对铜缆采用更严格的安全防护措施&#xff0c;要么就使用光缆。因为很多人都认为光纤可以很好地防止***通过窃听手段截获网络数据。但是实际上…

Linux字符设备驱动实例

globalmem看 linux 设备驱动开发详解时&#xff0c;字符设备驱动一章&#xff0c;写的测试代码和应用程序&#xff0c;加上自己的操作&#xff0c;对初学者我觉得非常有帮助。写这篇文章的原因是因为我看了我之前发表的文章&#xff0c;还没有写过字符设备相关的&#xff0c;至…

8-[函数]-嵌套函数,匿名函数,高阶函数

1.嵌套函数 &#xff08;1&#xff09;多层函数套用 name "Alex"def change_name():name "Alex2"def change_name2():name "Alex3"print("第3层打印", name)change_name2() # 调用内层函数print("第2层打印", name)chan…

c语言画谢宾斯基三角形

谢宾斯基三角形是一个有意思的图形&#xff0c;&#xff08;英语&#xff1a;Sierpinski triangle&#xff09;是一种分形&#xff0c;由波兰数学家谢尔宾斯基在1915年提出,它是一种典型的自相似集。先画一个三角形&#xff0c;然后呢&#xff0c;取三角形的中点&#xff0c;组…

进程间的通信——无名管道

进程间的通信——无名管道 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、进程间的通信 &#xff08;1&#xff09;同主机进程间数据交互机制&#xff1a;无名管道&#xff08;PIPE&#xff09;&#xff0c;有名管道&#xff08;FIFO&#xff09;…