利用python,基于SVM实现文本分类
项目代码见Github:
算法介绍
具体内容详见本人文档,下载链接代码所用数据
原网站文件结构
├─doc_classification.py
├─stopwords.txt
├─vocabulary.txt
├─train.data
├─train.label
├─train.map
├─test.data
├─test.label
└─test.mappython代码
需要安装的库:
pandas, liblinearutil
注:Windows平台下 liblinearutil 安装包(32/64)
# doc_classification.py
import pandas as pd
import math
from liblinearutil import *
import time# 读取数据
def loadOriginData(src='train'):# train.datadataSrc = r'%s.data' % src# train.labellabelSrc = r'%s.label' % srclabel = pd.read_table(labelSrc, sep=' ', names=['label'])# train.mapmapSrc = r'%s.map' % src# 每个文档拥有的termsdoc2term = {}# 每个term出现在哪些文档term2doc = {}# 每个类别下有哪些docscate2docs = {}# TF值TF = {}with open(dataSrc, 'r') as f:for line in f:str_docIdx, str_wordIdx, str_cnt = line.split()docIdx = int(str_docIdx)wordIdx = int(str_wordIdx)cnt = int(str_cnt)# update 数据结构doc2term.setdefault(docIdx, []).append(wordIdx)term2doc.setdefault(wordIdx, []).append(docIdx)TF.setdefault(docIdx, {})[wordIdx] = cnt# 统计每个类别下有哪些文档with open(labelSrc, 'r') as f:for line_index, line in enumerate(f, 1):labelVal = int(line.strip())cate2docs.setdefault(labelVal, []).append(line_index)return TF, doc2term, term2doc, cate2docs, label# 特征选择
def featureSel(doc2term, term2doc, cate2docs):# CHI衡量的是特征项ti和类别Cj之间的关联程度, A,B, C, D是四个统计量CHI_cat2term = {}# N:total number of documentsN = len(doc2term)# A + B + C + D = N# A: term出现在某类别中的文档总数A = {}# B: term出现在除某类别外的其他文档数B = {}# C: 该类别中不包含term的文档总数C = {}# D: 其他类别中不包含term的文档总数D = {}DF = {}# 所有类别categories = list(cate2docs.keys())# 停用词词汇表stopwords = {}stopwordsSrc = r'stopwords.txt'with open(stopwordsSrc) as f:for line in f:stopwords[line.strip()] = True# 训练数据数据词汇表vocSrc = r'vocabulary.txt'voc = pd.read_table(vocSrc, names=['voc'])# 保存所有的特征features = set()# 计算一个类别标签下各个词的CHIfor category in categories:# 属于第category类的文档为docsdocs = cate2docs[category]sumVal = 0for term in term2doc:# 如果是停用词, 则将CHI置零if stopwords.get(voc['voc'][term - 1], False):CHI_cat2term.setdefault(category, {})[term] = 0continue# 属于某类且包含termAVal = len(set(term2doc[term]).intersection(set(docs)))# 不属于某类但包含termBVal = len(term2doc[term]) - AVal# 属于某类,但不包含termCVal = len(docs) - AVal# 不属于某类, 不包含termDVal = N - AVal - BVal - CValCHIVal = N * (AVal * DVal - CVal * BVal)**2 / ((AVal + CVal) * (BVal + DVal) * (AVal + BVal) * (CVal + DVal))# CHIVal = math.log(AVal * N / ((AVal + CVal) * (AVal + BVal)))A.setdefault((term, category), AVal)B.setdefault((term, category), BVal)C.setdefault((term, category), CVal)D.setdefault((term, category), DVal)CHI_cat2term.setdefault(category, {})[term] = CHIValDF[term] = AVal + BValsumVal += CHIVal# 选出类别中CHI高于平均值的词terms = CHI_cat2term[category]meanVal = sumVal / len(terms)for term in terms:if CHI_cat2term[category][term] > meanVal:features.add(term)# for feature in features:# print(voc['voc'][feature])print('There are %d features in VSM model.\n' % len(features))return features, DFdef buildSVMData(TF, DF, features, N, label, cate2docs, doc2terms):isFeatures = dict(zip(features, [True] * len(features)))categories = list(cate2docs.keys())# 如果是训练样本, 则计算归一化缩放因子,并返回# y: label值y = [0] * N# x: 稀疏矩阵x = []for i in range(N):x.append({})for category in categories:for doc in cate2docs[category]:# 给y进行标记类别y[doc - 1] = label.iat[doc - 1, 0]scale_factor = -100for term in doc2terms[doc]:if isFeatures.get(term, False): # 如果term是特征# TF值TFVal = TF[doc].get(term, 0)# TF-IDF值tf_idf = TFVal * math.log(N / DF[term])x[doc - 1][term] = tf_idf# 更新特征最大值if scale_factor < tf_idf:scale_factor = tf_idfalpha = 0# 按一篇文档中特征词最大的tf-idf, 对该文档中的所有特征词进行归一化for term in doc2terms[doc]:if isFeatures.get(term, False): # 如果term是特征# x[doc - 1][term] = alpha + (1 - alpha) * x[doc - 1][term] / scale_factorx[doc - 1][term] /= scale_factorprint("Data for SVM has been built.\n")return x, y# 计算DF
def getDF(doc2term, term2doc, cate2docs):DF = {}for term in term2doc:DF[term] = len(term2doc[term])return DFif __name__ == '__main__':start = time.time()# # 主程序TF, doc2term, term2doc, cate2docs, label = loadOriginData()# 特征选择features, DF = featureSel(doc2term, term2doc, cate2docs)# 读取数据(train.data)TF, doc2term, term2doc, cate2docs, label = loadOriginData()# 特征选择features, DF = featureSel(doc2term, term2doc, cate2docs)# build SVM modelx, y = buildSVMData(TF, DF, features, len(doc2term), label, cate2docs, doc2term)# 读取测试数据(test.data)TF_test, doc2term_test, term2doc_test, cate2docs_test, label_test = loadOriginData(src='test')DF_test = getDF(doc2term_test, term2doc_test, cate2docs_test)# TF, DF, features, len(doc2term), label, cate2docs, doc2term, scales)x_test, y_test = buildSVMData(TF_test, DF_test, features, len(doc2term_test), label_test, cate2docs_test, doc2term_test)print("处理数据使用了 %s s时间。\n" % (time.time() - start))# # 调用 liblinear 库进行分类prob = problem(y, x)param = parameter('-s 0 -c 4 -B 1')# 训练m = train(prob, param)# 预测test.datap_label, p_acc, p_vals = predict(y_test, x_test, m, '-b 1')# 评价ACC, MSE, SCC = evaluations(y_test, p_label)print('ACC:\n', ACC)print('MSE', MSE)print('SCC', SCC)# 统计每类中错误率categoriesErrs = {}for doc_index, doc_label in enumerate(y_test):if doc_label != int(p_label[doc_index]):cateogory = label_test.iat[doc_index, 0]categoriesErrs.setdefault(cateogory, []).append(doc_index + 1)# with open('outcome.txt', 'wb') as f:print("错误分类的样本为:\n")for categoryErr in categoriesErrs:numOfErr = len(categoriesErrs[categoryErr])print('第%d类共 %d样本, 被错分的个数为 %d, 比例为 %f %%.\n' % (categoryErr,len(cate2docs_test[categoryErr]), numOfErr, numOfErr/len(cate2docs_test[categoryErr])))end = time.time()print("Total time cost is %s s.\n" % (end - start))
利用python,基于SVM实现文本分类相关推荐
- 利用SVM 实现文本分类的实例
原文来自:http://blog.csdn.net/zhzhl202/article/details/8197109 之前做过一些文本挖掘的项目,比如网页分类.微博情感分析.用户评论挖掘,也曾经将li ...
- 用朴素贝叶斯和SVM进行文本分类
写在前面的感悟: 测试集文件删除一定要shift+delete!!!!!要不然回收站直接爆炸,用几个小时打开,然后再用几个小时清空.文本分类的数据集看似只有几个G那么大,但是架不住文件数量多,导致各种 ...
- 基于机器学习的文本分类!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:李露,西北工业大学,Datawhale优秀学习者 据不完全统计,网 ...
- 【NLP】基于机器学习的文本分类!
作者:李露,西北工业大学,Datawhale优秀学习者 据不完全统计,网民们平均每人每周收到的垃圾邮件高达10封左右.垃圾邮件浪费网络资源的同时,还消耗了我们大量的时间.大家对此深恶痛绝,于是识别垃圾 ...
- PaddleNLP基于ERNIR3.0文本分类:WOS数据集为例(层次分类)
相关项目链接: Paddlenlp之UIE模型实战实体抽取任务[打车数据.快递单] Paddlenlp之UIE分类模型[以情感倾向分析新闻分类为例]含智能标注方案) 应用实践:分类模型大集成者[Pad ...
- 15 分钟搭建一个基于XLNET的文本分类模型——keras实战
今天笔者将简要介绍一下后bert 时代中一个又一比较重要的预训练的语言模型--XLNET ,下图是XLNET在中文问答数据集CMRC 2018数据集(哈工大讯飞联合实验室发布的中文机器阅读理解数据,形 ...
- 基于神经网络的文本分类(基于Pytorch实现)
<Convolutional Neural Networks for Sentence Classification> 作者:Yoon Kim 单位:New York University ...
- 基于ERNIR3.0文本分类:(KUAKE-QIC)意图识别多分类(单标签)
PaddleNLP基于ERNIR3.0文本分类以中医疗搜索检索词意图分类(KUAKE-QIC)为例[多分类(单标签)] 0.前言:文本分类任务介绍 文本分类任务是自然语言处理中最常见的任务,文本分类任 ...
- PaddleNLP基于ERNIR3.0文本分类以中医疗搜索检索词意图分类(KUAKE-QIC)为例【多分类(单标签)】
相关项目链接: Paddlenlp之UIE模型实战实体抽取任务[打车数据.快递单] Paddlenlp之UIE分类模型[以情感倾向分析新闻分类为例]含智能标注方案) 应用实践:分类模型大集成者[Pad ...
最新文章
- hadoop28---netty传对象
- VS和Eclipse自动注释比较
- curl怎么输出赋值_python怎么实现循环
- 22_2D函数优化实例
- vue控制元素的隐藏和显示
- db2报01650_db2错误代码
- 一名网工对Linux运维的一次经历
- 文本自动摘要任务的“不完全”心得总结
- 通俗易懂谈强化学习之Q-Learning算法实战
- Oracle数据库日志清理
- 如何集中远程管理各种USB设备,还不了解一下?
- html特殊符号怎么输入法,特殊符号怎么打出来?电脑特殊符号输入方法
- 最全各国人口数据,人口的高出生率与高死亡率竟然是这些国家
- cvs数据格式 gps_运动手表GPS轨迹文件导出方法
- Qt编写安防视频监控系统46-视频存储
- 北京市中 高英语听说计算机考,北京2018中考英语听说计算机考试工作通知
- java面试题怎么背?java面试题有哪些?
- 学术大咖教你一个轻松在论文中画出漂亮插图的方法
- Gitee使用时TimeOut问题解决
- 不知道干些什么,那就看看书吧!
热门文章
- ARP攻击和欺骗原理讲解
- marquee 详解
- 音质好的骨传导蓝牙耳机有哪些,十大公认音质好的骨传导耳机
- 使用Jsdelivr CDN加速博客访问速度
- xp计算机workgroup无法访问,无法访问,教您怎么解决workgroup无法访问
- 大话HTTP4 - HTTPS
- Unity更改C#脚本编辑器
- PHP+Mysql服装商城 网上服装购物商城 基于PHP服装商城的系统设计与实现(1)首页
- 计算机监控系统在地铁中的应用有哪些,自动变形监测系统在地铁结构变形监测中的应用...
- 屏幕录制与GIF转换---OpenCV-Python开发指南(46)