【DataWhale学习记录15-03】零基础入门NLP - 新闻文本分类赛题 - 03基于机器学习的文本分类

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

3.1 学习目标

  1. 学会TF-IDF的原理和使用
  2. 使用 sklearn的机器学习mo’xing完成文本分类

3.2 文本分类方法 Part1

在自然语言领域中,文本时不定长度的。文本表示成计算机能够运算的数字或向量的方法一般成为词嵌入(Word Embedding) 方法。词嵌入将不定长的文本转换到定长的空间内,是文本分类的第一步。

3.2.1 One-hot

每一个单词使用一个离散的向量表示(与数据挖掘任务中的操作一致)。具体为将每个字/词编码一个索引,然后根据索引进行赋值/

表示方法例子如下:

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

首先堆所有句子的字进行索引,即将每个字确定一个编号:

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

这里共包括11个字,因此每个字可以转换为一个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]

3.2.2 Bag of Words

即 词袋表示, 也称 Count Vectors. 每个文档的字/词可以使用其出现次数来进行表示。

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

直接统计每个字出现的次数,并进行赋值:

句子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.2.3 N-gram

N-gram和Count Vectors类似,不过加入了相邻单词组合为新的单词,并进行计数。

如果N取值为2,则句子1和句子2就变成:

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

3.2.4 TF-IDF

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

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

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

接下来将对比不同文本表示算法的精度,通过本地构建验证集计算F1得分。

3.3.1 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
train_df = pd.read_csv('../input/train_set.csv', sep='\t', nrows=15000)
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.74

3.3.2 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
train_df = pd.read_csv('../input/train_set.csv', sep='\t', nrows=15000)
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.87

3.3 本章小结

介绍了基于机器学习的文本分类方法,并完成了两种方法的对比。

3.4 本章作业

  1. 尝试改变TF-IDF的参数,并验证精度。
    在这里插入图片描述

  2. 尝试使用其他机器学习模型,完成训练和验证。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40463117/article/details/107557981