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

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

一、学习目标

1.学习TF-IDF的原理

2.使用sklearn的机器学习模型完成文本分类

二、One-hot

首先我们要知道,计算机是无法识别中文的,所以我们需要将文本数据转为向量化的形式,最简单的方式就是one-hot形式,即将每个单词使用一个离散的向量表示,如

1.机器学习
2.深度学习

对这两个词,我们如果按字分割,然后对每个字取一个索引,则为

{
“机”:1,“器”:2,“学”:3,“习”:4,“深”:5,“度”:6
}

所以对“机器学习”这个词,它就可以转化为索引的形式:“1234”,“深度学习”索引为“5634”。同时因为这里有六个字,每个字用一个六维的向量表示,则为

机:[1,0,0,0,0,0]
器:[0,1,0,0,0,0]
学:[0,0,1,0,0,0]
习:[0,0,0,1,0,0]
深:[0,0,0,0,1,0]
度:[0,0,0,0,0,1]

当输入机器学习的索引“1234”时,就根据索引在词表中找到对应的向量,作为模型的输入。

三、Bag of Words

Bag of Words又称词袋模型,是通过表示词的出现次数来表示,但是这种表示却没有考虑关键词的顺序,仅仅将句子或是文档看成一些关键词出现的概率的集合,每个关键词之间是相互独立的。

四、N-gram

N-gram则是在考虑前n个词出现的情况下,当前这个词出现的概率。N-gram模型是一种语言模型(Language Model,LM),语言模型是一个基于概率的判别模型,它的输入是一句话(单词的顺序序列),输出是这句话的概率,即这些单词的联合概率(joint probability)。

N-gram本身也指一个由N个单词组成的集合,各单词具有先后顺序,且不要求单词之间互不相同。常用的有 Bi-gram (N=2) 和 Tri-gram (N=3):

Bi-gram:{机器},{器学},{学习}
Tri-gram:{机器学},{器学习}

假设有n个单词组成的句子为
,其中wi表示每个单词,则每一个单词wi都要依赖于于第一个单词w1到wi-1个单词的影响,

[公式]

上述公式表示的概率参数空间过大,数据稀疏性严重,所以引入马尔可夫性假设(Markov Assumption):一个词的出现仅与他前若干个词有关

  • 如果一个词的出现仅依赖于它前面出现的一个词,那么我们就称之为Bi-gram[公式]
  • 如果一个词的出现仅依赖于它前面出现的两个词,那么我们就称之为Tri-gram[公式]

不做展开

五、TF-IDF

TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率),思想就是一个词语在一篇文章中出现次数越多, 同时在所有文档中出现次数越少, 越能够代表该文章。

TF:指的是一个给定的词语在文章中出现的次数。

但是, 一些通用的词语对于主题并没有太大的作用, 反倒是一些出现频率较少的词才能够表达文章的主题, 所以单纯使用是TF不合适的。权重的设计必须满足:一个词预测主题的能力越强,权重越大,反之,权重越小。所有统计的文章中,一些词只是在其中很少几篇文章中出现,那么这样的词对文章的主题的作用很大,这些词的权重应该设计的较大。IDF就是在完成这样的工作。

IDF:指的如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。

某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。

六、基于机器学习的⽂本分类

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('train_set.csv', sep='\t',nrows=160000)
vectorizer = CountVectorizer(max_features=3000)
train_test = vectorizer.fit_transform(train_df['text'])
clf = RidgeClassifier()
clf.fit(train_test[:150000], train_df['label'].values[:150000])
val_pred = clf.predict(train_test[150000:])
print(f1_score(train_df['label'].values[150000:], val_pred, average='macro'))
0.8043384089559675

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('train_set.csv', sep='\t',nrows=50000)
tfidf = TfidfVectorizer(ngram_range=(1,3), max_features=3000)
train_test = tfidf.fit_transform(train_df['text'])
clf = RidgeClassifier()
clf.fit(train_test[:40000], train_df['label'].values[:40000])
val_pred = clf.predict(train_test[40000:])
print(f1_score(train_df['label'].values[40000:], val_pred, average='macro'))
0.8926046463248595
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值