Datawhale - 入门NLP之新闻文本分类 - task3 ML实现

目录

1. 文本分类之ML方法简介

2. one-hot

3. Count Vectors

4. N-gram

5. TF-IDF

6. Count Vectors + RidgeClassifier

7. TF-IDF + RidgeClassifier

8. TF-IDF + 其他ml算法


1. 文本分类之ML方法简介

(1)机器学习简介

        直观定义 --->    

        权威定义 --->   机器学习(Machine Learning, ML),是发现和探索隐藏在数据 中的令人感兴趣的信息。

        百度百科 --->   机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂 度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或 技能,重新组织已有的知识结构使之不断改善自身的性能。

        ML意义: (1)机器学习是人工智能的核心 (2)机器学习算法是使计算机具有智能的根本途径

        总体来讲: 机器学习通过历史数据训练模型对应于人类对经验进行归纳的过程,机器学习利用模型对新数据进行预测对应于人类利用总结的规律对新问题进行预测的过程。它的分类有很多,这里画了一个类别图如下:

(2)基于ml的文本分类

          在机器学习算法的训练过程中,假设给定N个样本,每个样本有M个特征,这样组成了N×M的样本矩阵,然后完成算法的训练和预测。同样的在计算机视觉中可以将图片的像素看作特征,每张图片看作hight×width×3的特征图,一个三维的矩阵来进入计算机进行计算。

          但是在自然语言领域,上述方法却不可行:文本是不定长度的。文本表示成计算机能够运算的数字或向量的方法一般称为词嵌入(Word Embedding)方法。词嵌入将不定长的文本转换到定长的空间内,是文本分类的第一步。下面详细介绍几种文本特征提取方法:

2. one-hot

        one-hot编码,又称独热编码和一位有效编码。其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。举例子来讲,就是某一个属性或者特征,假如有3个类别,那么第一个类别编码是100,第二个类别是010,第三个类别是001。同样,假如某一个特征有4个类别,第一个类别编码是1000,第二个类别是0100,第三个类别是0010,第四个类别是0001。等等以此类推...

        one-hot编码的python-sklearn实现以及解释:

# one-hot 特征
from sklearn import preprocessing 
enc = preprocessing.OneHotEncoder()  # 创建对象
enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])   # 拟合
array = enc.transform([[0,1,3]]).toarray()  # 转化
print(array)

        运行结果为:  

        为什么会得到这个结果呢?  ---> 是因为fit的时候是拟合的如下矩阵信息:   

          可以看到共四个样本,每个样本共三个特征,第一个特征是共两个类(0,1),第二个特征共三个类(0,1,2),第三个特征共四个类(0,1,2, 3)。。根据前面描述过:当两个类的时候,0的one-hot是10,当三个类的时候,1的one-hot是010,当四个类的时候,3的one-hot是0001。

        所以:新给出一个样本三个特征是  的时候,one-hot编码自然为

 

3. Count Vectors

        计数向量表示(Count Vectors),也叫词袋表示(bag-of-words),文档的向量表示可以直接用单词的向量进行求和得到。词袋模型能够把一个句子转化为向量表示,是比较简单直白的一种方法,它不考虑句子中单词的顺序,只考虑词表(vocabulary)中单词在这个句子中的出现次数。

        下面直接来看一个python实现例子:

# Bag of Words(词袋表示),也称为Count Vectors,每个文档的字/词可以使用其出现次数来进行表示
from sklearn.feature_extraction.text import CountVectorizer
corpus = [
    'xiaoming love china',
    'do you love china',
    'xiaoming love you',
    'you love china',
]
vectorizer = CountVectorizer()
res = vectorizer.fit_transform(corpus).toarray()
print(res)
feature_name = vectorizer.get_feature_names()
print(feature_name)

        运行结果为:   

        可以看到,上面四个句子中,一共才出现五个特征词  ['china', 'do', 'love', 'xiaoming', 'you']。第一个句子为:'xiaoming love china' 对应特征向量['china', 'do', 'love', 'xiaoming', 'you']而言进行统计出现的次数: 所以特征值为[1 0 1 1 0],do和you没有出现,所以是0次!  后面几行句子类似统计即可!

4. N-gram

        N-gram 算法采用固定长度为 N 的滑动窗口进行切分,目前常用 N-gram 模型是二元的 Bi-gram 和三元的 Tri-gram 模型。对两种模型的切分方法进行比较,比如 “北京  欢迎  你的  到来”,Bi-gram 切分就是 “北京欢迎   欢迎你的   你的到来”Tri-gram 切分就是 “北京欢迎你的   欢迎你的到来”。

        举个简单栗子:

# n-gram
from nltk.util import ngrams
a = ['1','2','3','4','5']
b = ngrams(a,2)
for i in b:
     print(i)

       运行结果为:   

5. TF-IDF

(1)TF-IDF简介        

        IF-IDF是信息检索(IR)中最常用的一种文本表示法。算法的思想也很简单,第一部分是词语频率(Term Frequency),第二部分是逆文档频率(Inverse Document Frequency)。简单来讲,在一篇文档中,词频越高,这个词就越重要。但是你可能会发现你得到的关键词基本都是“的”、“是”、“为”这样没有实际意义的词(停用词),这个问题怎么解决呢?你可能会想到为每个词都加一个权重,像这种”停用词“就加一个很小的权重(甚至是置为0),这个权重就是IDF。下面再来看看两个公式:

        然后,TF-IDF特征就是将二者相乘得到:

        根据公式很容易看出,TF-IDF的值与该词在文章中出现的频率成正比,与该词在整个语料库中出现的频率成反比,因此可以很好的实现提取文章中关键词的目的。

(2)python-sklearn实现

from sklearn.feature_extraction.text import CountVectorizer  
from sklearn.feature_extraction.text import TfidfTransformer
 
tag_list = ['青年 吃货 唱歌',  
            '少年 游戏 叛逆',  
            '少年 吃货 足球'] 
 
vectorizer = CountVectorizer() #将文本中的词语转换为词频矩阵  
X = vectorizer.fit_transform(tag_list) #计算个词语出现的次数
word_dict = vectorizer.vocabulary_  # 词语
print(word_dict)
# tf-idf
transformer = TfidfTransformer()  
tfidf = transformer.fit_transform(X)  #将词频矩阵X统计成TF-IDF值  
print(tfidf.toarray())

       ti-idf 运行结果如下:

6. Count Vectors + RidgeClassifier

       下面实现countvector特征加岭回归分类器的方式,进行新闻文本分类:

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

# 训练集(前150000行)
train_df = pd.read_csv('datalab/72510/train_set.csv', sep='\t', nrows=15000)
# 提取CountVectorizer特征
vectorizer = CountVectorizer(max_features=3000)
train_test = vectorizer.fit_transform(train_df['text'])
# 前10000行样本,进行岭回归分类器训练
clf = RidgeClassifier()
clf.fit(train_test[:10000], train_df['label'].values[:10000])
# 后5000行样本,进行预测效果测试
val_pred = clf.predict(train_test[10000:])
print(f1_score(train_df['label'].values[10000:], val_pred, average='macro'))

        注:关于训练集的数据集前面task02已经介绍过,此处不再赘述。

        最终,岭回归分类器训练完成,并对5000个样本的预测效果中,f1得分为: 0.654736784304,效果不是太好,后续可以加大训练集合调参进行提高分数!!!

7. TF-IDF + RidgeClassifier

        下面实现 TF-IDF 特征加岭回归分类器的方式,进行新闻文本分类:

# TF-IDF + RidgeClassifier
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import RidgeClassifier
from sklearn.metrics import f1_score
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'))

        f1得分为: 0.87193721737。。,比countvector特征效果要好一点。

8. TF-IDF + 其他ml算法

        比如采用 TF-IDF + 决策树 的分类器尝试:

# TF-IDF + Decision tree
from sklearn import tree
clf = tree.DecisionTreeClassifier()
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'))
    f1得分: 0.656227397325

注:以上都是简单的例子实现,训练集数量也很少。实际应用中应该综合特征工程,模型选取,超参数调优等系列手段,逐步提高模型精度和f1得分,依次获得更好的数据挖掘效果!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值