Datawhale零基础入门NLP赛事 - Task3 基于机器学习的文本分类

Task3 基于机器学习的文本分类

在本章我们将开始使用机器学习模型来解决文本分类。机器学习发展比较广,且包括多个分支,本章侧重使用传统机器学习,从下一章开始是基于深度学习的文本分类。

学习目标

学会TF-IDF的原理和使用
使用sklearn的机器学习模型完成文本分类

机器学习模型

机器学习是对能通过经验自动改进的计算机算法的研究。机器学习通过历史数据训练出模型对应于人类对经验进行归纳的过程,机器学习利用模型对新数据进行预测对应于人类利用总结的规律对新问题进行预测的过程。

机器学习有很多种分支,对于学习者来说应该优先掌握机器学习算法的分类,然后再其中一种机器学习算法进行学习。由于机器学习算法的分支和细节实在是太多,所以如果你一开始就被细节迷住了眼,你就很难知道全局是什么情况的。

如果你是机器学习初学者,你应该知道如下的事情:

  1. 机器学习能解决一定的问题,但不能奢求机器学习是万能的;
  2. 机器学习算法有很多种,看具体问题需要什么,再来进行选择;
    每种机器学习算法有一定的偏好,需要具体问题具体分析;

(1)One - hot
  将每一个字使用一个离散的向量表示。具体步骤:对每个字/词编码一个索引,然后根据索引对向量内的对应位置进行赋值。

句子1:我 爱 北 京 天 安 门
句子2:我 喜 欢 上 海

{
‘我’: 1, ‘爱’: 2, ‘北’: 3, ‘京’: 4, ‘天’: 5,
‘安’: 6, ‘门’: 7, ‘喜’: 8, ‘欢’: 9, ‘上’: 10, ‘海’: 11
}

我:[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
爱:[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]

海:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

(2)Bag of Words,也称为 Count Vectors
  Bag of Words(词袋表示),每个文档的字/词可以使用其出现次数来进行表示。

句子1:我 爱 北 京 天 安 门
转换为 [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0]

句子2:我 喜 欢 上 海
转换为 [1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]

在 sklearn 中可以直接调用 CountVectorizer 来实现这一过程:

from sklearn.feature_extraction.text import CountVectorizer
corpus = [
‘This is the first document.’,
‘This document is the second document.’,
‘And this is the third one.’,
‘Is this the first document?’,
]
vectorizer = CountVectorizer()
vectorizer.fit_transform(corpus).toarray()

(3)N-gram
  N-gram与Count Vectors类似,不过加入了相邻单词组合成为新的单词,并进行计数。如果N取值为2,则句子1和句子2就变为:

句子1:我爱 爱北 北京 京天 天安 安门
句子2:我喜 喜欢 欢上 上海

(4)TF - IDF
  TF-IDF 分数由两部分组成:第一部分是词语频率(Term Frequency),第二部分是逆文档频率(Inverse Document Frequency)。其中计算语料库中文档总数除以含有该词语的文档数量,然后再取对数就是逆文档频率。

TF(t)= 该词语在当前文档出现的次数 / 当前文档中词语的总数
IDF(t)= log_e(文档总数 / 出现该词语的文档总数)

  1. 基于机器学习的文本分类
    对比不同文本表示算法的精度,通过本地构建验证集计算 f1 得分。

(1)Count Vectors + RidgeClassifier

Count Vectors + RidgeClassifier

import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import RidgeClassifier
from sklearn.metrics import f1_score

path_train_data = r’D:\DataWhale\DW_NLP\Competition_Data\train_set.csv’
train_df = pd.read_csv(path_train_data, sep=’\t’, nrows=15000) # pandas读取数据

CountVectorizer会将文本中的词语转换为词频矩阵,它通过fit_transform函数计算各个词语出现的次数。

max_features:默认为None,可设为int,对所有关键词的词频进行降序排序,只取前max_features个作为关键词集

vectorizer = CountVectorizer(max_features=3000)
train_test = vectorizer.fit_transform(train_df[‘text’])

clf = RidgeClassifier()

fit(self, x, y, sample_weight=None) 拟合岭分类器模型

x训练数据集,y标签值,sample_weight每个样本的单独权重

clf.fit(train_test[:10000], train_df[‘label’].values[:10000]) # 前10000个样本

clf.predict(X):Predict class labels for samples in X.(预测X中样本的类别标签)

val_pred = clf.predict(train_test[10000:])
print(f1_score(train_df[‘label’].values[10000:], val_pred, average=‘macro’))

F1分数(F1-score)是分类问题的一个衡量指标。一些多分类问题的机器学习竞赛,常常将F1-score作为最终测评的方法。它是精确率和召回率的调和平均数,最大为1,最小为0。
F1 = 2 x(precision x recall)/(precision + recall)
f1_score(val_true, val_pred, labels=None, pos_label=1, average=‘binary’, sample_weight=None)
val_true :目标的真实类别。
val_pred :分类器预测得到的类别。
average :[None, ‘binary’(default), ‘micro’, ‘macro’, ‘samples’, ‘weighted’] 如果是二分类问题则选择 binary;如果考虑类别的不平衡性,需要计算类别的加权平均,则使用 weighted;如果不考虑类别的不平衡性,计算宏平均,则使用 macro。

(2)TF-IDF + RidgeClassifier

TF-IDF + RidgeClassifier

import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import RidgeClassifier
from sklearn.metrics import f1_score

path_train_data = r’D:\DataWhale\DW_NLP\Competition_Data\train_set.csv’
train_df = pd.read_csv(path_train_data, sep=’\t’, nrows=15000) # pandas读取数据

要提取的n-gram的n-values的下限和上限范围,在min_n(1) <= x <= max_n(3)区间的n的全部值,即1,2,3

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’))

  1. 补充
    (1)尝试改变TF-IDF的参数,并验证精度
    (2)尝试使用其他机器学习模型,完成训练和验证
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值