NLP学习第3讲

Task3 特征选择 (2 days)

1. TF-IDF原理。

2. 文本矩阵化,使用词袋模型,以TF-IDF特征值为权重。(可以使用Python中TfidfTransformer库)

3. 互信息的原理。

4. 使用第二步生成的特征矩阵,利用互信息进行特征筛选。

参考

  1. [文本挖掘预处理之TF-IDF:文本挖掘预处理之TF-IDF - 刘建平Pinard - 博客园]https://www.cnblogs.com/pinard/p/6693230.html
  2. [使用不同的方法计算TF-IDF值:使用不同的方法计算TF-IDF值 - 简书]https://www.jianshu.com/p/f3b92124cd2b
  3. [sklearn-点互信息和互信息:sklearn:点互信息和互信息 - 专注计算机体系结构 - CSDN博客]https://blog.csdn.net/u013710265/article/details/72848755
  4. [如何进行特征选择(理论篇)机器学习你会遇到的“坑”:如何进行特征选择(理论篇)机器学习你会遇到的“坑” ]https://baijiahao.baidu.com/s?id=1604074325918456186&wfr=spider&for=pc

一、TF-IDF原理

1.概念

 TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF意思是词频(Term Frequency),IDF意思是逆文本频率指数(Inverse Document Frequency)。

TF-IDF的主要思想是:如果某个词在一篇文章中出现的频率高,并且在其他文章中很少出现,则认为此词具有很好的类别区分能力,适合用来分类。

词频 TF计算了一个单词在文档中出现的次数,它认为一个单词的重要性和它在文档中出现的次数呈正比。逆向文档频率 IDF,是指一个单词在文档中的区分度。它认为一个单词出现在的文档数越少,就越能通过这个单词把该文档和其他文档区分开。IDF 越大就代表该单词的区分度越大。

所以 TF-IDF 实际上是词频 TF 和逆向文档频率 IDF 的乘积。这样我们倾向于找到 TF 和 IDF 取值都高的单词作为区分,即这个单词在一个文档中出现的次数多,同时又很少出现在其他文档中。这样的单词适合用于分类。TF-IDF倾向于过滤掉常见的词语,保留重要的词语。

2.计算步骤

为什么 IDF 的分母中,单词出现的文档数要加 1 呢?因为有些单词可能不会存在文档中,为了避免分母为 0,统一给单词出现的文档数都加 1。

TF-IDF=TF*IDF

3.使用 sklearn 计算 TF-IDF

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vec = TfidfVectorizer()
tfidf_vec.fit_transform(data)
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer

def tf_idf(vectorizer, sentlist):
	vectorizer = CountVectorizer(min_df=1)
    transformer = TfidfTransformer(stop_words=stopwords)
    tfidf = transformer.fit_transform(vectorizer.fit_transform(sentlist))
    return tfidf

 使用TfidfTransformer
除了考量某词汇在文本出现的频率,还关注包含这个词汇的所有文本的数量,能够削减高频没有意义的词汇出现带来的影响, 挖掘更有意义的特征,相比之下,文本条目越多,Tfidf的效果会越显著

 使用CountVectorizer
只考虑词汇在文本中出现的频率
 

二、文本矩阵化

词集模型 DictVectorizer:单词构成的集合,集合中每个元素只有一个,即词集中的每个单词都只有一个(集合嘛,没有重复元素)。

词袋模型 CountVectorizer:在词集的基础上加入了频率这个维度,即统计单词在文档中出现的次数(令牌化和出现频数统计),通常我们在应用中都选用词袋模型。

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
import os
import numpy as np
import pandas as pd

data_path='midi/home/dataset/aclImdb/train/pos'

train_list=os.listdir(data_path)
data=[]
for i in train_list[:100]:
    path=data_path+'/'+i
    data.append(open(path).readlines()[0])
vectorizer=CountVectorizer()

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

三、互信息的原理

其中H(X)和H(Y) 是边缘,H(X|Y)和H(Y|X)是条件熵,而H(X,Y)是X和Y的联合熵

条件熵就是指,知道X后Y还剩多少信息量(H(Y|X))。或者知道Y后,X还剩多少信息量(H(X|Y))。

那么互信息就是知道X,给Y的信息量带来多少损失(或者知道Y,给X的信息量带来多少损失)。

举个例子,假设H(X)用一块糖来表示,Y代表一杯水,H(X|Y)也就是将这杯水倒在糖上,H(X)还剩多少,那么溶于水的那部分糖就是Y给H(X)带来的损失,即就是互信息,其定义为:

from sklearn import metrics as mr
mr.mutual_info_score(label,x)

互信息特征选择算法的步骤 
①划分数据集 
②利用互信息对特征进行排序 
③选择前n个特征利用SVM进行训练 
④在测试集上评价特征子集计算错误率 

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import mutual_info_classif

iris=load_iris()
#选择K个最好的特征,返回选择特征后的数据
SelectKBest(mutual_info_classif, k=2).fit_transform(iris.data, iris.target)

参考博客:

1.https://blog.csdn.net/mxs1123/article/details/88090715

2.https://blog.csdn.net/Heitao5200/article/details/88242389#1__1

3.https://blog.csdn.net/qq_35175666/article/details/89162925

4.https://github.com/HuanwenW/NLP-2019.github.io/blob/master/Data%20%26%26%20%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5.md

5.https://blog.csdn.net/nc514819873/article/details/89094687

6.https://blog.csdn.net/ljfwz153076024/article/details/89071850#PR_77

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值