中文文本分类的步骤:
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:ti∈dj}∣∣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+∣{d∈D:t∈d}∣作为分母。
然后计算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)