自然语言处理-搭建文本分类器

一个完整的文本分类器主要由两个阶段,:一是将文本向量化,将一个字符串转化成向量形式;二是将向量喂到分类器,包括SVM, CNN,LSTM等等。

这边做的项目其实阶段用的是 tf-idf 来进行文本向量化,使用卡方校验(chi-square)来降低向量维度,使用liblinear(采用线性核的svm) 来进行分类。而这里所述的文本分类器,使用lsi (latent semantic analysis, 隐性语义分析) 来进行向量化, 不需要降维, 因为可以直接指定维度, 然后使用线性核svm进行分类。lsi的部分主要使用gensim来进行, 分类主要由sklearn来完成。

  1. 文档向量化

这部分的内容主要由gensim来完成。将各文档分词,从字符串转化为单词列表 统计各文档单词,生成词典(dict) 利用词典将文档转化成词频表示的向量,即指向量中的各值对应于词典中对应位置单词在该文档中出现次数 再进行进一步处理,将词频表示的向量转化成tf-idf表示的向量 由tf-idf表示的向量转化成lsi表示的向量。

文档分词及预处理,之后统计单词,生成词典,再将文档转化成按词频表示的向量。最后一部分代码如下:

count = 0
bow = []
for file in files:
count += 1
if count%100 == 0 :
print(‘{c} at {t}’.format(c=count, t=time.strftime(‘%Y-%m-%d %H:%M:%S’,time.localtime())))
word_list = convert_doc_to_wordlist(file, cut_all=False)
word_bow = dictionary.doc2bow(word_list)
bow.append(word_bow)
pprint(bow)

2.分类问题

这边分类的方法有很多,主要还是SVM去做的,线性的kernel和RBF kernel都做了相关的尝试。

过程中会遇到一个问题,从gensim到sklearn的格式转换,gensim中的corpus数据格式,sklearn是无法识别的。即gensim中对向量的表示形式与sklearn要求的不符。

在gensim中,向量是稀疏表示的。例如[(0,5),(6,3)] 意思就是说,该向量的第0个元素值为5,第6个元素值为3,其他为0.但是这种表示方式sklearn是无法识别的。sklearn的输入一般是与numpy或者scipy配套的。如果是密集矩阵,就需要输入numpy.array格式的; 如果是稀疏矩阵,则需要输入scipy.sparse.csr_matrix.由于后者可以转化成前者,而且gensim中向量本身就是稀疏表示,所以这边只讲如何将gensim中的corpus格式转化成csr_matrix.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值