python实现中文文本分类(二)TF-IDF权重策略

中文文本分类的步骤:
1.预处理:去除文本的噪声信息,例如HTML标签、文本格式转换、检测句子边界等。
2.中文分词:使用中文分词器为文本分词,并去除停用词。
3.构建词向量空间:统计文本词频,生成文本的词向量空间。
4.权重策略——TF-IDF方法:使用TF-IDF发现特征词,并抽取为反映文档主题的特征。
5.分类器:使用算法训练分类器。
6.评价分类结果:分类器的测试结果分析。

向量空间模型把文本表示为一个向量,该向量的每个特征表示为文本中出现的词,把训练集中出现的每个不同的字符串都作为一个维度,包括常用词、专用词、词组和其他类型模式串,如电子邮件和URL。但是对于大规模文本,这会导致极高维空间。为了节省存储空间和提高搜索效率,在文本分类之前要自动过滤某些字或词,这些字或词被称为停用词。停用词通常是一些语义模糊的常用词,还有一些语气助词,通常对文本分类起不了特征分类的作用。
本文采用的停用词表来自呆萌的停用词表

TF-IDF的含义是词频逆文档频率,如果某个词或短语在一篇文章中出现的频率高,并且在其他文档中很少出现,则认为该词有很好的类别区分能力,适合用来分类。TF-IDF假设高频率词应该具有高权重,除非它也是高文档频率。
词频(Term Frequency,TF)指的是某一个给定的词语在该文件中出现的频率:
T F i j = n i , j ∑ k n k , j TF_{ij}=\frac{n_{i,j} }{\sum_{k}^{} n_{k,j} } TFij=knk,jni,j
上述式子,分子是该词在文件中出现的次数,分母则是在文件中的所有字词的出现次数之和。
逆向文件频率(Inverse Document Frequency,IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语的文件的数目,再将得到的商取对数得到。
I D F i = l o g ∣ D ∣ ∣ { j : t i ∈ d j } ∣ IDF_{i}=log\frac{\left | D \right | }{\left | \left \{ j:t_{i}\in d_{j} \right \} \right | } IDFi=log{j:tidj}D
其中, ∣ D ∣ \left | D \right | D表示语料库中的文件总数,j表示包含词语的文件数目,如果该词语不在语料库中就会导致分母为0,所以一般情况下使用 1 + ∣ { d ∈ D : t ∈ d } ∣ 1+\left | \left \{ d\in D:t\in d \right \} \right | 1+{dD:td}作为分母。
然后计算TF与IDF的乘积。如果一个词在某个特定文件内是高频词,但在整个文件集合中是低文件频率,则TF-IDF较高。由此可以过滤掉常见词语,保留重要的词语。
采用sklearn实现TF-IDF。

from sklearn.datasets.base import Bunch
import pickle
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import TfidfVectorizer
# bunch读写函数
def readbunchobj(path):
    file_obj = open(path, "rb")
    bunch = pickle.load(file_obj)
    file_obj.close()
    return bunch


def writebunchobj(path, bunchobj):
    file_obj = open(path, 'wb')
    pickle.dump(bunchobj,file_obj)
    file_obj.close()
    
# 读取停用词表
stopword_path="./data/hlt_stop_words.txt"
stpwrdlst=readfile(stopword_path).splitlines()
# 导入分词后的词向量bunch对象
path='./data/train_word_bag/train_set.dat'#词向量空间保存路径
bunch=readbunchobj(path)
# 构建TF-IDF词向量空间对象
tfidfspace=Bunch(target_name=bunch.target_name,label=bunch.label,filenames=bunch.filenames,tdm=[],vocabulary={})
# 使用TfidfVectorizer初始化向量空间模型
vectorizer=TfidfVectorizer(stop_words=stpwrdlst,sublinear_tf=True,max_df=0.5)
transformer=TfidfTransformer()
# 文本转为词频矩阵,单独保存字典文件
tfidfspace.tdm=vectorizer.fit_transform(bunch.contents)
tfidfspace.vocabulary=vectorizer.vocabulary_
# 创建词袋的持久化
space_path="./data/train_word_bag/tfidfspace.dat"
writebunchobj(space_path,tfidfspace)
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值