Task3 文本向量特征 TF-IDF处理

分词

统计词频并将其向量化

from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
corpus = ['I come to China to travel',
         'This is a car popular in China',
         'I love tea and Apple',
         'The work us to write some papers in science']
print(vectorizer.fit_transform(corpus))

(0, 16) 1
(0, 3) 1
(0, 15) 2
(0, 4) 1
(1, 5) 1
(1, 9) 1
(1, 2) 1
(1, 6) 1
(1, 14) 1
(1, 3) 1
(2, 1) 1
(2, 0) 1
(2, 12) 1
(2, 7) 1
(3, 10) 1
(3, 8) 1
(3, 11) 1
(3, 19) 1
(3, 17) 1
(3, 18) 1
(3, 13) 1
(3, 5) 1
(3, 15) 1
括号第一个数字是文本序号,第二个数字为词的序号。后面为词频。
将每个词向量特征和各个特征代表的词显现出来

print(vectorizer.fit_transform(corpus).toarray())
print(vectorizer.get_feature_names())

输出如下
[[0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0]
[0 0 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0]
[1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0]
[0 0 0 0 0 1 0 0 1 0 1 1 0 1 0 1 0 1 1 1]]
[‘and’, ‘apple’, ‘car’, ‘china’, ‘come’, ‘in’, ‘is’, ‘love’, ‘papers’, ‘popular’, ‘science’, ‘some’, ‘tea’, ‘the’, ‘this’, ‘to’, ‘travel’, ‘us’, ‘work’, ‘write’]
可以看到一共有19个词,所以四个文本向量的维度都为19,每一维都代表着19个词,其中I为停用词不参加词频的统计。
因为大部分文本只有少部分词,所以我们的向量中含有大部分的零,也就是说词向量是稀疏的。实际中一般使用稀疏矩阵储存。
然而有的时候分词得到的词汇表十分巨大,达到100w+,如果此时使用向量化的方法,将对应的样本直接存储,可能会对内存造成一定的影响。这个时候就需要降维。而Hash Trick就是文本特征降维方法。

Hash Trick

运用哈希表对其降维,因为多个特征经过哈希函数会映射到同一位置。所以会导致某些位置词频突然增大。
原函数为
在这里插入图片描述
为解决上述问题我们引入另一个哈希函数:
在这里插入图片描述
此时函数变为
在这里插入图片描述
用scikit-learn中的HashVetorizer对其实现降维

from sklearn.feature_extraction.text import HashingVectorizer
vectorier2 = HashingVectorizer(n_features=6,norm=None)
print(vectorier2.fit_transform(corpus))

(0, 1) 2.0
(0, 2) -1.0
(0, 4) 1.0
(0, 5) -1.0
(1, 0) 1.0
(1, 1) 2.0
(1, 2) 0.0
(1, 5) -1.0
(2, 0) 2.0
(2, 5) -2.0
(3, 0) 0.0
(3, 1) 3.0
(3, 2) -2.0
(3, 3) 1.0
(3, 5) -1.0

TF-IDF概述

TF-IDF是Term Frequency - Inverse Document Frequency的缩写,即“词频-逆文本频率”。它由两部分组成,TF和IDF。
 前面的TF也就是我们前面说到的词频,我们之前做的向量化也就是做了文本中各个词的出现频率统计,并作为文本特征,这个很好理解。关键是后面的这个IDF,即“逆文本频率”如何理解。在上一节中,我们讲到几乎所有文本都会出现的"to"其词频虽然高,但是重要性却应该比词频低的"China"和“Travel”要低。我们的IDF就是来帮助我们来反应这个词的重要性的,进而修正仅仅用词频表示的词特征值。

概括来讲, IDF反应了一个词在所有文本中出现的频率,如果一个词在很多的文本中出现,那么它的IDF值应该低,比如上文中的“to”。而反过来如果一个词在比较少的文本中出现,那么它的IDF值应该高。比如一些专业的名词如“Machine Learning”。这样的词IDF值应该高。一个极端的情况,如果一个词在所有的文本中都出现,那么它的IDF值应该为0。

上面是从定性上说明的IDF的作用,那么如何对一个词的IDF进行定量分析呢?这里直接给出一个词x的IDF的基本公式如下:
在这里插入图片描述
IDF的公式如下:
在这里插入图片描述
TF-IDF的值为
在这里插入图片描述

用scikit-learn进行TF-IDF预处理

在scikit-learn中有两种办法进行TF-IDF处理
第一种方法是在用CounterVectorizer类向量化后再调用TfidTransform类进行预处理。第二种方法是直接运用TfidfVectorizer完成向量化与TF-IDF预处理。
首先看第一种方法,CounterVectorizer+TfidfTransformer组合
代码如下

from sklearn.feature_extraction.text import TfidfTransformer  
from sklearn.feature_extraction.text import CountVectorizer  

corpus=["I come to China to travel", 
    "This is a car polupar in China",          
    "I love tea and Apple ",   
    "The work is to write some papers in science"] 

vectorizer=CountVectorizer()

transformer = TfidfTransformer()
tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus))  
print( tfidf)

使用TfidfVectorizer一步到位:

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf2 = TfidfVectorizer()
re = tfidf2.fit_transform(corpus)
print(re)

(0, 4) 0.4424621378947393
(0, 15) 0.697684463383976
(0, 3) 0.348842231691988
(0, 16) 0.4424621378947393
(1, 3) 0.3443145201184689
(1, 14) 0.43671930987511215
(1, 6) 0.43671930987511215
(1, 2) 0.43671930987511215
(1, 9) 0.43671930987511215
(1, 5) 0.3443145201184689
(2, 7) 0.5
(2, 12) 0.5
(2, 0) 0.5
(2, 1) 0.5
(3, 15) 0.2746030839848683
(3, 5) 0.2746030839848683
(3, 13) 0.34829919251208613
(3, 18) 0.34829919251208613
(3, 17) 0.34829919251208613
(3, 19) 0.34829919251208613
(3, 11) 0.34829919251208613
(3, 8) 0.34829919251208613
(3, 10) 0.34829919251208613
PS
jieba也可以计算TF-IDF计算
import jieba.analyse

jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
sentence 为待提取的文本
topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
withWeight 为是否一并返回关键词权重值,默认值为 False
allowPOS 仅包括指定词性的词,默认值为空,即不筛选

点互信息和互信息

机器学习中经常用PMI来衡量两个事物之间的相关性,公式如下:
在这里插入图片描述
概率论中如果p(x,y)=p(x)p(y)。二者关系越大,则p(x,y)就相比p(x)p(y)越大。log后将一个概率转换为了信息量。
互信息(MI):
点互信息就是从互信息衍生出来的,互信息公式如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值