文本分类流程:
1、特征选取:
网页爬取-》网页预处理获取汉字-》中文分词及词性标注-》保留名词-》词频统计-》输出词-文档矩阵-》计算词的信息增益值-》选取增益大的前N个词作为特征词-》计算每个词在文档中的权重-》生成文档-词矩阵-》对词的权重进行归一化处理-》即每个训练文档特征词及权重选取完毕。
2、匹配流程
获取新的网页重复上面步骤到分词,得到分词后统计此文档所对应的特征词的词频-》采用KNN等机器学习算法对要分类的文档与现有训练样本中的每个样本进行夹角余弦计算-》夹角余弦最大值为其所最接近的分类,分类成功。
KNN算法实现文本分类,程序及输出结果如下:
1、程序
# -*- coding: cp936 -*-
import urllib2
import re
import sys
import os
import math
#os.system(cmd)os.system('ls')
#class MyClass:
# key_word
doc_no = 1
def start_fun():
reload(sys)
sys.setdefaultencoding('utf-8')
print sys.getdefaultencoding()
def testfun():
str_test = "http://hao123.com\" class is >china"
searchstr= re.findall(r'http://(.*?)\"',str_test)
print searchstr[0]
def split_word(webpage_chinese_file,webpage_chinese_word_file):
#调用命令行对中文文档进行分词处理
os.system('cd splitword && ictclas_demo_c.exe ../'+ webpage_chinese_file + ' ../'+webpage_chinese_word_file )
def doc_word_count_deal(webpage_chinese_word_file,webpage_all_word_count_docno):
global doc_no
word_dicts = dict()
#1、读取中文分词内容到缓存中
word_file = open(webpage_chinese_word_file,"r")
word_buf = word_file.read()
word_file.close()
#2、将分词以空格分隔并按/过滤提取分词中文内容和词性,不是名词或者长度小于2的不进行记录
word_sets = word_buf.split(' ')
for i in word_sets:
#print i
if i == "" :
continue
j = i.index('/')
#print 'j='+str(j)
k = i[j+1:j+2]
i = i[0:j]
#print i
#word_dicts[i]如果不存在KEY则会报KeyError错误
if len(i) <= 2 or (k != None and k != 'n'):
#print 'k='+k
continue
if word_dicts.get(i) == None :
word_dicts[i] = 1
else:
word_dicts[i] = word_dicts[i] + 1
#sorted(word_dicts.viewvalues())
#list ->word_dicts = [ v for v in sorted(word_dicts.values())]
#3、将过滤后的中文分词按照出现次数进行排序,将排序好的数据存储到相应的文件中
word_count = open(webpage_all_word_count_docno,'w')
word_dicts_list = sorted([(v, k) for k, v in word_dicts.items()], reverse=True)
for i in word_dicts_list:
print i[1],i[0]
word_count.write(str(doc_no)+" "+i[1]+" "+str(i[0])+"\n")
word_count.close()
doc_no = doc_no + 1
"""
for i in word_dicts.viewkeys():
print i,word_dicts[i]
"""
def get_webpage_china(url_addr,webpage_src_file,webpage_chinese_file):
#reload( sys )
#sys.setdefaultencoding('utf-8')
print sys.getdefaultencoding()
#1、获取URL地址网页内容,默认为ascii,GB2312编码
url = url_addr
content = urllib2.urlopen(url).read()
#2、打开文件将网页内容写入文件
file = open(webpage_src_file,'w')
file.write(content)
file.close
#str=f.read()
#fp.write(str.encode("utf-8"))
#3、正则匹配获取网页中alert中所对应的内容
"""
pattern1 = re.findall(r'alert\(\"(.*)\"\)',content)
for i in pattern1:
print i
print 'hello world!\n'
sub1 = re.sub(r'alert\(\"(.*)\"\)','Hello World!',content)
"""
#chinaeseStr = re.match(ur".*[\u4e00-\u9fa5]+",content)
#a="
百度知道
"2、输出结果
ascii
系统 5
账号 2
密码 2
分辨率 2
用户名 1
用户 1
软件 1
苹果 1
密码技术 1
宽度 1
火狐 1
0、rd-doc—count矩阵
分辨率 2 2
2 [1, 1]
用户名 1 1
2 [1, 1]
鼠标 0 1
1 [0, 1]
密码技术 1 1
2 [1, 1]
密码 2 2
2 [1, 1]
账号 2 2
2 [1, 1]
电脑 0 1
1 [0, 1]
火狐 1 1
2 [1, 1]
系统 5 3
2 [1, 1]
苹果 1 1
2 [1, 1]
软件 1 1
2 [1, 1]
用户 1 1
2 [1, 1]
宽度 1 1
2 [1, 1]
键盘 0 1
1 [0, 1]
1、word IG
分辨率 -0.50171665944
用户 -0.50171665944
鼠标 -0.401373327552
密码技术 -0.50171665944
系统 -0.50171665944
账号 -0.50171665944
电脑 -0.401373327552
软件 -0.50171665944
密码 -0.50171665944
苹果 -0.50171665944
火狐 -0.50171665944
用户名 -0.50171665944
宽度 -0.50171665944
键盘 -0.401373327552
1、sort word IG
鼠标 -0.401373327552
键盘 -0.401373327552
电脑 -0.401373327552
账号 -0.50171665944
用户名 -0.50171665944
用户 -0.50171665944
系统 -0.50171665944
软件 -0.50171665944
苹果 -0.50171665944
密码技术 -0.50171665944
密码 -0.50171665944
宽度 -0.50171665944
火狐 -0.50171665944
分辨率 -0.50171665944
2、feature values
电脑 -0.401373327552
账号 -0.50171665944
鼠标 -0.401373327552
用户名 -0.50171665944
键盘 -0.401373327552
3、weight values
鼠标 0.0 0.47712125472
电脑 0.0 0.47712125472
账号 0.352182518111 0.352182518111
用户名 0.176091259056 0.176091259056
键盘 0.0 0.47712125472
鼠标 0.0 0.47712125472
电脑 0.0 0.47712125472
账号 0.352182518111 0.352182518111
用户名 0.176091259056 0.176091259056
键盘 0.0 0.47712125472
4、归一化doc-word martix
doc num 0
电脑 账号 鼠标 用户名 键盘
0.0 0.666666666667 0.0 0.333333333333 0.0
doc num 1
电脑 账号 鼠标 用户名 键盘
0.24347423677 0.179718193127 0.24347423677 0.0898590965636 0.24347423677
5、KNN分类算法对如下样本进行分类
电脑 1
账号 1
鼠标 1
用户名 1
键盘 1
样本0计算结果=0.6
电脑 1
账号 1
鼠标 1
用户名 1
键盘 1
样本1计算结果=0.718992940348
最终分类编号为:1