首先说一下思路,第一步是下载搜狗的新闻分类训练数据集,然后是使用结巴中文分词工具对文本进行处理,并去停用词得到所有文本中出现的词语。第三步是使用CHI作为特征选择的依据给每一类新闻选出150维的特征,并去重。这样我们就可以获得大概1000维的特征。有了特征之后就是为每个新闻构造VSM模型,即使用TFIDF方法计算各特征的权重得到表示该文本的特征向量。这样一来,我们就将原本的新闻文章转化成了(1000维特征向量, 新闻分类)这种可以方便使用KNN/SVM等方法分类的数据。接下来就是使用相应的分类器做分类,检查分类效果。主要参考了这片博客,并基于此进行修改加上了CHI/TFIDF的功能。
至于CHI/TFIDF/VSM/KNN/SVM这些名词,不了解的可以去搜一搜,都很简单。程序中主要用到了jieba分词库和nltk库,第一次做NLP对nltk还都不了解,所以像CHI和TFIDF都是自己写的,程序写的很糟糕,也没有去精简代码。各位看官请见谅。
# -*- coding: utf-8 -*-
import jieba
import nltk
import os
import time
from math import log
import json
floder_path = '/home/liuchong/桌面/搜狗数据集下载/Reduced'
#该文件夹下宗共有9个文件夹,分别存储9大类的新闻数据
floder_list = os.listdir(floder_path)
class_list = []
nClass = 0
N = 100
train_set = []
test_set = []
all_words = {}
#用于记录CHI公示中的A值
A = {}
#记录每个文件的处理事件
process_time = []
TFIDF = {}
#读取停词表
stop_words_file = open('stop_words_ch.txt', 'r')
stopwords_list = []
for line in stop_words_file.readlines():
stopwords_list.append(line.decode('gbk')[:-2])