文本自动分类案例(源码)

使用机器学习方法 做文档的自动分类

套路:

1.根据每个文件 生成该文件的一个特征

2.根据特征 选择 分类器 进行文本分类

3.(可选)根据 2 步结果,调整参数/特征等

示例:

数据:搜狗文本分类语料库 精简版

分类器:朴素贝叶斯

编程语言:Python+nltk自然语言处理库+jieba分词库

[python] view plaincopy

  1. __author__ = 'LiFeiteng'
  2. # -*- coding: utf-8 -*-
  3. import os
  4. import jieba
  5. import nltk
  6. ## 由搜狗语料库 生成数据
  7. folder_path = 'C:\LIFEITENG\SogouC.reduced\\Reduced'
  8. #folder_path = 'C:\LIFEITENG\SogouC.mini\Sample'
  9. folder_list = os.listdir(folder_path)
  10. class_list = [] ##由于乱码等问题 仅以数字[0,1,...]来代表文件分类
  11. nClass = 0
  12. N = 100 #每类文件 最多取 100 个样本 70%train 30%test
  13. train_set = []
  14. test_set = []
  15. all_words = {}
  16. import time
  17. process_times = [] ## 统计处理每个文件的时间
  18. for i in range(len(folder_list)):
  19. new_folder_path = folder_path + '\\' + folder_list[i]
  20. files = os.listdir(new_folder_path)
  21. class_list.append(nClass)
  22. nClass += 1
  23. j = 0
  24. nFile = min([len(files), N])
  25. for file in files:
  26. if j > N:
  27. break
  28. starttime = time.clock()
  29. fobj = open(new_folder_path+'\\'+file, 'r')
  30. raw = fobj.read()
  31. word_cut = jieba.cut(raw, cut_all=False)
  32. word_list = list(word_cut)
  33. for word in word_list:
  34. if word in all_words.keys():
  35. all_words[word] += 1
  36. else:
  37. all_words[word] = 0
  38. if j > 0.3 * nFile:
  39. train_set.append((word_list, class_list[i]))
  40. else:
  41. test_set.append((word_list, class_list[i]))
  42. j += 1
  43. endtime = time.clock()
  44. process_times.append(endtime-starttime)
  45. print "Folder ",i,"-file-",j, "all_words length = ", len(all_words.keys()),\
  46. "process time:",(endtime-starttime)
  47. print len(all_words)
  48. ## 根据word的词频排序
  49. all_words_list = sorted(all_words.items(), key=lambda e:e[1], reverse=True)
  50. word_features = []
  51. ## 由于乱码的问题,没有正确使用 stopwords;简单去掉 前100个高频项
  52. ## word_features 是选用的 word-词典
  53. for t in range(100, 1100, 1):
  54. word_features.append(all_words_list[t][0])
  55. def document_features(document):
  56. document_words = set(document)
  57. features = {}
  58. for word in word_features: ## 根据词典生成 每个document的feature True or False
  59. features['contains(%s)' % word] = (word in document_words)
  60. return features
  61. ## 根据每个document 分词生成的 word_list 生成 feature
  62. train_data = [(document_features(d), c) for (d,c) in train_set]
  63. test_data = [(document_features(d), c) for (d,c) in test_set]
  64. print "train number:",len(train_data),"\n test number:",len(test_data)
  65. ## 朴素贝叶斯分类器
  66. classifier = nltk.NaiveBayesClassifier.train(train_data)
  67. print "test accuracy:",nltk.classify.accuracy(classifier, test_data)
  68. ## 处理每个文件所用的时间 可见到后面 处理单个文件的时间显著增长
  69. ## 原因 已查明
  70. import pylab
  71. pylab.plot(range(len(process_times)), process_times, 'b.')
  72. pylab.show()

test上的正确率: 9个类别 74%

处理每个文件所用时间:

===============================

朴素贝叶斯:From 《数据挖掘概念与技术》

1.中文乱码问题,由于这个问题,在stopwords上简单去掉 前100个高频项 数据清洗不足

2.字典的选择上——简单以统计 所有文件词频,选用101-1100 1000个词作字典

我觉得 字典完全可以从 数据上 学习(要比上面方法高明些),就像在图像处理中 稀疏模型 学习字典(KSVD)一样

自然语言处理/文本处理 中也应该存在这样的方法

3.文件的特征 是[0,0,1,0,0,1,...]并不是统计每个文件的词频,

这跟选择的分类器相关,如果选择svm等 就要对文件 生成词频特征

4.到后面(见上图),单个文件处理时间显著增长,原因待查明——已查明

if word in all_words.keys(): 改为all_words.has_key(word)

(python 读取文件速度变慢是什么原因http://www.douban.com/group/topic/44472300/?start=0&post=ok#last )

以 机器学习 的小无相 打了一套 自然语言处理/文本挖掘 的招数

难免有些生硬 望专家指点

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2015-11-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

资源 | 清华大学发布OpenNE:用于网络嵌入的开源工具包

2867
来自专栏AI研习社

实时识别字母:深度学习和 OpenCV 应用搭建实用教程

这是一个关于如何构建深度学习应用程序的教程,该应用程序可以实时识别由感兴趣的对象(在这个案例中为瓶盖)写出的字母。

591
来自专栏CVer

OpenCV实战 | EAST算法实现自然场景文本检测

今天要介绍的内容是利用EAST算法检测自然场景下的文本。EAST算法是CVPR 2017的paper,很早就开源了,如今移植到OpenCV中,实在太cool了。...

3453
来自专栏Java与Android技术栈

App基于手机壳颜色换肤?先尝试一下用 KMeans 来提取图像中的主色

上周,某公司的产品经理提了一个需求:根据用户手机壳颜色来改变 App 主题颜色。可能是由于这天马行空的需求激怒了程序员,导致程序员和产品经理打了起来,最后双双被...

722
来自专栏FreeBuf

基于大数据和机器学习的Web异常参数检测系统Demo实现

前 言 如何在网络安全领域利用数据科学解决安全问题一直是一个火热的话题,讨论算法和实现的文章也不少。前段时间看到楚安的文章《数据科学在Web威胁感知中的应...

2338
来自专栏marsggbo

Andrew Ng机器学习课程笔记--week11(图像识别&总结划重点)

一、内容概要 Photo OCR Problem Decription and pipeline(问题描述和流程图) Sliding Windows(滑动窗口...

1865
来自专栏磐创AI技术团队的专栏

10分钟上手,OpenCV自然场景文本检测(Python代码+实现)

EAST文本检测器需要OpenCV3.4.2或更高版本,有需要的读者可以先安装OpenCV。

783
来自专栏量子位

亚马逊发布新版MXNet:支持英伟达Volta和稀疏张量

安妮 编译自 AWS官博 量子位 出品 | 公众号 QbitAI Apache MXNet v0.12来了。 今天凌晨,亚马逊宣布了MXNet新版本,在这个版本...

3616
来自专栏ATYUN订阅号

使用FastText(Facebook的NLP库)进行文本分类和word representatio...

介绍 现在, 社交软件Facebook面临诸多挑战。Facebook每天处理大量的各种形式的文本数据,例如状态更新、评论等等。而对Facebook来说,更重要...

1.1K5
来自专栏程序你好

使用ML.Net和CSharp语言进行机器学习

本文介绍.net中的机器学习技术实现,不涉及数学方面的内容。它将重点关注在.net中的基本工作流程及其数据处理结构,以及怎么样通过使用开源项目ML.Net 0....

1863

扫码关注云+社区