1.算法介绍

2.代码所用数据

文件结构

├─doc_classification.py

├─stopwords.txt

├─vocabulary.txt

├─train.data

├─train.label

├─train.map

├─test.data

├─test.label

└─test.map

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.data

dataSrc = r'%s.data' % src

# train.label

labelSrc = r'%s.label' % src

label = pd.read_table(labelSrc, sep=' ', names=['label'])

# train.map

mapSrc = r'%s.map' % src

# 每个文档拥有的terms

doc2term = {}

# 每个term出现在哪些文档

term2doc = {}

# 每个类别下有哪些docs

cate2docs = {}

# 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 documents

N = 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()

# 计算一个类别标签下各个词的CHI

for category in categories:

# 属于第category类的文档为docs

docs = cate2docs[category]

sumVal = 0

for term in term2doc:

# 如果是停用词, 则将CHI置零

if stopwords.get(voc['voc'][term - 1], False):

CHI_cat2term.setdefault(category, {})[term] = 0

continue

# 属于某类且包含term

AVal = len(set(term2doc[term]).intersection(set(docs)))

# 不属于某类但包含term

BVal = len(term2doc[term]) - AVal

# 属于某类,但不包含term

CVal = len(docs) - AVal

# 不属于某类, 不包含term

DVal = N - AVal - BVal - CVal

CHIVal = 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] = CHIVal

DF[term] = AVal + BVal

sumVal += 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, DF

def 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 = -100

for 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_idf

alpha = 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_factor

x[doc - 1][term] /= scale_factor

print("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 DF

if __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 model

x, 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.data

p_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文本分类算法_Python-基于向量机SVM的文本分类相关推荐

  1. python文本分类算法_python编写朴素贝叶斯用于文本分类

    朴素贝叶斯估计 朴素贝叶斯是基于贝叶斯定理与特征条件独立分布假设的分类方法.首先根据特征条件独立的假设学习输入/输出的联合概率分布,然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出 ...

  2. 支持向量机文本分类python_Python-基于向量机SVM的文本分类

    1.算法介绍 2.代码所用数据 文件结构 ├─doc_classification.py ├─stopwords.txt ├─vocabulary.txt ├─train.data ├─train.l ...

  3. python加密解密算法_Python基于DES算法加密解密实例

    #coding=utf-8 from functools import partial import base64 class DES(object): """ DES加 ...

  4. R语言构建文本分类模型:文本数据预处理、构建词袋模型(bag of words)、构建xgboost文本分类模型、基于自定义函数构建xgboost文本分类模型

    R语言构建文本分类模型:文本数据预处理.构建词袋模型(bag of words).构建xgboost文本分类模型.基于自定义函数构建xgboost文本分类模型 目录

  5. 基于Python实现的向量机SVM模型

    1. 理论知识 1.1 SVM 模型的基本理论 在之前的课程中讨论的分类器都是线性的,而在实际问题中,很多数据并不是线性可分的,也就是说找不到这样的超平面,能完全区分不同的数据.所以,需要在分类器中引 ...

  6. python分类算法_python数据挖掘中的分类算法有哪些?

    一直以来,对于机器学习领域,Python都是人们津津乐道的话题,大家知道我们在用python学习机器技术时候,用到的方法内容和一般情况下的是一样的吗?想必,了解过的小伙伴一定是知道有哪些的,不知道的小 ...

  7. python 分类算法_python机器学习之KNN分类算法

    本文为大家分享了python机器学习之KNN分类算法,供大家参考,具体内容如下 1.KNN分类算法 KNN分类算法(K-Nearest-Neighbors Classification),又叫K近邻算 ...

  8. python数据预测模型算法_基于机器学习的股票分析与预测模型研究

    摘 要:近年来,随着全球经济与股市的快速发展,股票投资成为人们最常用的理财方式之一.本文研究的主要目标是利用机器学习技术,应用Python编程语言构建股票预测模型,对我国股票市场进行分析与预测.采用S ...

  9. 用python实现skip-gram算法:AAAI-14 accepted papers(NLP)分类任务

    用python动手简易复现了下word2vec中的skip-gram方法,并将嵌入的特征向量与TF-IDF特征和gensim提供的word2vec方法进行了简易对比. 参考资料:A Neural Pr ...

最新文章

  1. Silve“.NET研究”rlight 游戏开发小技巧:传说中的透视跑马灯
  2. Machine Learning week 3 quiz : Regularization
  3. 【图像缩放】双立方(三次)卷积插值
  4. maven2 + tomcat6 + eclipse集成配置
  5. css 宽高最大值最小值 0303
  6. Postman转换为Jmeter
  7. H3C OSPF 单区域、多区域(虚连接)配置
  8. 在 Windows 下关闭135/139/445端口的图文方法
  9. Chemex 打印标签二维码扫不出信息,跳转地址不正确404,如何改代码?
  10. 被说了很多遍的设计模式---外观模式
  11. 【转载】大龄码农的新西兰移民之路
  12. 什么是mac os?它有哪些好的特点?有哪些应用小技巧
  13. 如何玩转OA系统业务审批流程
  14. “智多星”智能手机销售网后台管理系统设计
  15. Excel中建立数据透视表,想用计算字段功能,但是该选项灰色无法点击,怎么办?
  16. 解析在线教育培训APP开发
  17. JavaScript-154:关闭淘宝二维码案例
  18. ESXI-vCenter-NSX-系统虚拟化
  19. 慕课网跟练系列——侧边栏导航跟随案例
  20. 禁止浏览器空格下滑滚动条

热门文章

  1. cdr放大后内容消失了_今日推荐:AI智能图片清晰放大神器强势来袭,简直无敌了...
  2. 计算机网络考试单选及答案,计算机网络考试的选择题和填空题答案.doc
  3. php savepath,php中session_save_path另外一种用法
  4. 使用JAVA加jxl jar操作EXECL
  5. 报错,o.h.engine.jdbc.spi.SqlExceptionHelper : Data truncation: Data too long for column ‘verify_msg‘
  6. 每个人都该知道的数字
  7. 12.混淆——介绍,傅里叶变换抽样对,采样和重建_1
  8. 4.线性和卷积——相关与卷积、卷积的属性、计算复杂度和可分性_2
  9. 【英语学习】【English L06】U01 Breakfast L4 Drink Morning Tea
  10. 80386/386/Intel386 架构/流水线及其优化