NLP--T3基于机器学习的文本分类
- 3 基于机器学习的文本分类
- 3.1 机器学习模型
- 3.2 文本表示方法 Part1
- 3.2.1 One-hot
- 3.2.2 Bag of words
- 3.2.3 N-gram
- 3.2.4 TF-IDF
- 3.2 基于机器学习的文本分类
- 3.2.1 Count Vectors+RidgeClass
- 3.2.2 本章小结
- 3.3 本章作业
在上章节中,对赛题的数据进行读取,并在末尾留出两个小作业–基本掌握pandas读取操作。在本章我们将使用传统机器学习算法来完成新闻分类的过程,将会接触到赛题的核心知识点。
【学习目标】
- 学会TF-IDF的原理和使用
- 使用sklearn的机器学习模型完成文本分类
3 基于机器学习的文本分类
在本章开始使用机器学习模型来解决文本分类。机器学习发展比较广,且包括多个分支,本章使用传统机器学习,从下一章开始是基于机器学习—>深度学习的文本分类。
3.1 机器学习模型
- 机器学习是对能通过经验自动改进的计算机算法的研究。机器学习通过历史数据训练出模型—>相对应于人类对经验进行归纳的过程,机器学习利用模型对新数据进行预测---->相对应于人类利用总结的规律对新问题进行预测的过程。
- 机器学习有多种分支,对于初学者来说,应该先掌握机器学习算法的分类,然后再其中一种机器学习算法进行学习。因为机器学习算法的分支和细节实在是太多,所以如果你一开始就被细节迷住了眼,就很难知道全局是什么情况的。
机器学习使用用途归类: - 机器学习算法能解决一定的问题,但不能奢求机器学习是万能的。
- 机器学习算法有多种,看具体问题需要什么,再来进行选择。
- 每种机器学习算法有一定的偏好,需要具体问题具体分析。
【插入图片】
3.2 文本表示方法 Part1
在机器学习算法的训练过程中,假设给定N个样本,每个样本有M个特征,这样组成了NXM 的样本矩阵,然后完成算法的训练和预测。同样的在计算机视觉中可以将图片的像素看做特征,每张图片看做hight x width x 3的特征图,一个三维的矩阵来进入计算机进行计算。
但是在NLP领域,上诉方法可不行:文本是不定长度的。文本表示成计算机能够计算的数字或者向量的方法—称为词嵌入方法(Word Embedding)方法。词嵌入法将不定长的文本转换到定长的空间内,是文本分类的第一步。
3.2.1 One-hot
这里的One-hot与数据挖掘任务中的操作是一致的,,即将每一个单词使用一个离散的向量表示。具体将每个字/词编码一个索引,然后根据索引进行赋值。
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
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.2 基于机器学习的文本分类
对比不同文本表示算法的精度,通过本地构建验证集计算F1得分。
3.2.1 Count Vectors+RidgeClass
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('../imput/train_set.csv',sep='\t',nrows=15000)
vectorizer =CountVectorizer(max_features=3000)
train_test = vectorizer.fit_transform(tran_df['text'])
clf = RidgeClassifier()
clf.fit(train_test[:1000],train_df['label'].values[:1000])
val_pred = clf.predict(train_test[10000:])
print(f1_score(train_df['label'].values[10000:],val_pred,average='macro'))
#【输出】
# 0.74
### 3.2.2 TF-IDF+RidgeClassifier
```py
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn,linear_model import RidgeClassfier
from sklearn.metrics import fit_score
train_df = pd.read_csv('../input/train_set..csv',sep='\t',nrows=1500)
train_test = tfidf.fit_transform(train_df['text'])
clf = RidgeClassifer()
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='macco'))
print(f1_score(train-df['label'].values[10000:],val_pred,average='macro'))
# 0.87
3.2.2 本章小结
本章介绍了基于机器学习的文本分类方法,并完成两种方法的对比。
3.3 本章作业
- 尝试改变TF-IDF的参数,并验证精度
- 尝试使用其他机器学习模型,完成训练和验证。