词袋模型(新闻文本分类)
我们要用词袋模型进行文本分类,训练模型大致可以分为两步:第一步,用TF-IDF表示文本特征;第二步,把TF-IDF值和标签值送入分类模型训练。
第一步用TF-IDF表示文本特征:
“TF-IDF值” = “TF值” ✖ “IDF值” (在实操中,我们会把TF值进行归一化,以防止它偏向长文本)
TF值:某个词(字)在文本(一段话)中出现的频率
IDF值:某个词(字)在文本(一段话)中的普遍重要性的度量。某一词(字)的IDF值,可以由总文本数目除以包含该词(字)的文本的数目,再将得到的商取 10为底的对数。
这里我们使用sklearn中的TfidfVectorizer方法计算出TF-IDF值:
首先看一下数据,此数据集为训练数据集,分为“频道”和“文章”两列,后面将使用这样的数据集来进行模型训练。
训练数据集由于在文本中有许多没有用的词(字)和标点符号,所以要去停用词
TfidfVectorizer方法计算TF-IDF值参数解释:
tokenizer = jieba.lcut 用jieba分词中的精确模式;stop_words 定义停用词词典,会在结果中删除词典中包含的词;norm 表示对TF-IDF矩阵的每一行使用l2范数归一化; use_idf 表示在TF矩阵的基础上计算IDF,并相乘得到TF-IDF;smooth_idf 表示通过加1到文档频率平滑idf权重,为防止除零,加入一个额外的文档(防止计算IDF时出现除0的尴尬情况);sublinear_tf 表示使用 1+log(tf)替换原来的tf, True值表示使用
contents参数就是我们要计算成TF-IDF值的文本数据集(即文章那一列的数据)
得到的TF-IDF值:
计算出的TF-IDF值我们可以看看这个词袋包含多少词:
词表中有25359个词
第二步,把TF-IDF值和标签值送入分类模型训练:
我们在得到TF-IDF模型之后,我们还需要对频道那一列进行处理。频道那列其实就是标签值,包含娱乐,体育,音乐之类的类别。
把频道那一列进行编码,得到标签值y ,再用刚刚训练好的tfidf模型计算出x值:
得到x和y这里我们在分割训练集和测试集时,不再直接用x,y来分割,因为此时数据量太大,会让分割时间变长,所以通过分割index值来得到训练集和测试集:
分割训练集和测试集这里使用逻辑回归模型:
训练模型训练完我们评估一下模型效果:
通过混淆矩阵可以观察其分类正确和错误的数量最后保存模型:
保存模型使用模型预测新的新闻文本:
加载保存的模型:
加载模型,并运用模型转换为词袋并预测和实际类别进行比对:
预测值和实际值对比总结:
上面整个流程就是一个简单的通过词袋模型进行新闻文本分类,通过计算出TF-IDF值,再送入分类模型进行预测。