项目代码见Github:

  1. 算法介绍
    具体内容详见本人文档,下载链接

  2. 代码所用数据
    原网站

    文件结构

    ├─doc_classification.py
    ├─stopwords.txt
    ├─vocabulary.txt
    ├─train.data
    ├─train.label
    ├─train.map
    ├─test.data
    ├─test.label
    └─test.map

  3. python代码
    需要安装的库:
    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实现文本分类相关推荐

  1. 利用SVM 实现文本分类的实例

    原文来自:http://blog.csdn.net/zhzhl202/article/details/8197109 之前做过一些文本挖掘的项目,比如网页分类.微博情感分析.用户评论挖掘,也曾经将li ...

  2. 用朴素贝叶斯和SVM进行文本分类

    写在前面的感悟: 测试集文件删除一定要shift+delete!!!!!要不然回收站直接爆炸,用几个小时打开,然后再用几个小时清空.文本分类的数据集看似只有几个G那么大,但是架不住文件数量多,导致各种 ...

  3. 基于机器学习的文本分类!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:李露,西北工业大学,Datawhale优秀学习者 据不完全统计,网 ...

  4. 【NLP】基于机器学习的文本分类!

    作者:李露,西北工业大学,Datawhale优秀学习者 据不完全统计,网民们平均每人每周收到的垃圾邮件高达10封左右.垃圾邮件浪费网络资源的同时,还消耗了我们大量的时间.大家对此深恶痛绝,于是识别垃圾 ...

  5. PaddleNLP基于ERNIR3.0文本分类:WOS数据集为例(层次分类)

    相关项目链接: Paddlenlp之UIE模型实战实体抽取任务[打车数据.快递单] Paddlenlp之UIE分类模型[以情感倾向分析新闻分类为例]含智能标注方案) 应用实践:分类模型大集成者[Pad ...

  6. 15 分钟搭建一个基于XLNET的文本分类模型——keras实战

    今天笔者将简要介绍一下后bert 时代中一个又一比较重要的预训练的语言模型--XLNET ,下图是XLNET在中文问答数据集CMRC 2018数据集(哈工大讯飞联合实验室发布的中文机器阅读理解数据,形 ...

  7. 基于神经网络的文本分类(基于Pytorch实现)

    <Convolutional Neural Networks for Sentence Classification> 作者:Yoon Kim 单位:New York University ...

  8. 基于ERNIR3.0文本分类:(KUAKE-QIC)意图识别多分类(单标签)

    PaddleNLP基于ERNIR3.0文本分类以中医疗搜索检索词意图分类(KUAKE-QIC)为例[多分类(单标签)] 0.前言:文本分类任务介绍 文本分类任务是自然语言处理中最常见的任务,文本分类任 ...

  9. PaddleNLP基于ERNIR3.0文本分类以中医疗搜索检索词意图分类(KUAKE-QIC)为例【多分类(单标签)】

    相关项目链接: Paddlenlp之UIE模型实战实体抽取任务[打车数据.快递单] Paddlenlp之UIE分类模型[以情感倾向分析新闻分类为例]含智能标注方案) 应用实践:分类模型大集成者[Pad ...

最新文章

  1. hadoop28---netty传对象
  2. VS和Eclipse自动注释比较
  3. curl怎么输出赋值_python怎么实现循环
  4. 22_2D函数优化实例
  5. vue控制元素的隐藏和显示
  6. db2报01650_db2错误代码
  7. 一名网工对Linux运维的一次经历
  8. 文本自动摘要任务的“不完全”心得总结
  9. 通俗易懂谈强化学习之Q-Learning算法实战
  10. Oracle数据库日志清理
  11. 如何集中远程管理各种USB设备,还不了解一下?
  12. html特殊符号怎么输入法,特殊符号怎么打出来?电脑特殊符号输入方法
  13. 最全各国人口数据,人口的高出生率与高死亡率竟然是这些国家
  14. cvs数据格式 gps_运动手表GPS轨迹文件导出方法
  15. Qt编写安防视频监控系统46-视频存储
  16. 北京市中 高英语听说计算机考,北京2018中考英语听说计算机考试工作通知
  17. java面试题怎么背?java面试题有哪些?
  18. 学术大咖教你一个轻松在论文中画出漂亮插图的方法
  19. Gitee使用时TimeOut问题解决
  20. 不知道干些什么,那就看看书吧!

热门文章

  1. ARP攻击和欺骗原理讲解
  2. marquee 详解
  3. 音质好的骨传导蓝牙耳机有哪些,十大公认音质好的骨传导耳机
  4. 使用Jsdelivr CDN加速博客访问速度
  5. xp计算机workgroup无法访问,无法访问,教您怎么解决workgroup无法访问
  6. 大话HTTP4 - HTTPS
  7. Unity更改C#脚本编辑器
  8. PHP+Mysql服装商城 网上服装购物商城 基于PHP服装商城的系统设计与实现(1)首页
  9. 计算机监控系统在地铁中的应用有哪些,自动变形监测系统在地铁结构变形监测中的应用...
  10. 屏幕录制与GIF转换---OpenCV-Python开发指南(46)