算法过程:
1. 读取样本文本
2. 对文本进行utf-8编码转换
3. 对文本进行预处理,完成中文分词,形成词条库,并去除停用词
4. 读取文本词条库,统计每个词条的词频,词频代表了每个词对一段文本的重要程度,字词的重要性随着它在文件中出现的次数成正比增加。
5. 对上一步整理形成的每个词的词频组成文本的词条词频特征码。
6. 使用1-5的方法分析待分类文本,生成待分类文本的词条词频特征码
7. 将待分类文本的词条词频与样本的词条词频特征码进行比较,应用余弦相似度算法判断待分类文本与样本的相似度,取最相似的类型为最终分类的类型。
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import sys
sys.path.append("../")
import jieba
import numpy as np
import copy
ftestfn_mobile= 'mobile1.txt'
ftestfn_war= 'war1.txt'
sampfn_test= 'sample.txt'
def get_cossimi(x,y):
myx=np.array(x)
myy=np.array(y)
cos1=np.sum(myx*myy)
cos21=np.sqrt(sum(myx*myx))
cos22=np.sqrt(sum(myy*myy))
return cos1/float(cos21*cos22)
# test 分别与war1 mobile比较
if __name__=='__main__':
# 去除停用词,同时构造样本词的字典
f_stop = open('stopwords.txt','rb')
try:
f_stop_text = f_stop.read().decode('utf-8')
# f_stop_text = unicode(f_stop_text,'utf-8')
finally:
f_stop.close()
f_stop_seg_list = f_stop_text.split('\n')
print('loading...')
f1_sample = open(sampfn_test, 'rb')
sample_words = {}
all_words = {}
try:
f1_sample_text = f1_sample.read().decode('utf-8')
#f1_text = unicode(f1_text,'utf-8')
finally:
f1_sample.close()
f1_seg_list_sample = jieba.cut(f1_sample_text)
for w in f1_seg_list_sample:
if not(w.strip() in f_stop_seg_list): # 抽取实体名词
sample_words.setdefault(w, 0) # 构建语料库字典
all_words.setdefault(w, 0) # 创建训练集词条字典,并统计词条词频
all_words[w] += 1
# 第一个待比较数据
ftest1_mobile = open(ftestfn_mobile, 'rb')
mytest1_words = copy.deepcopy(sample_words) # 复制语料库
try:
ftest1_text_war = ftest1_mobile.read().decode('utf-8')
#ftest1_text=unicode(ftest1_text,'utf-8')
finally:
ftest1_mobile.close()
ftest1_seg_list_mobile1 = jieba.cut(ftest1_text_war)
for w in ftest1_seg_list_mobile1:
if not(w.strip() in f_stop_seg_list):
if w in mytest1_words:
mytest1_words[w] += 1 # 统计语料库中的词条在测试集中的频数
#形成词条词频特征码
sampdata = [] # 特征码用列表,方便使用numpy计算
test1data = []
for key in all_words.keys():
sampdata.append(all_words[key]) # 训练集的特征码
test1data.append(mytest1_words[key]) # 测试集的特征码
test1simi = get_cossimi(sampdata, test1data) # 计算余弦相似度
# 第二个待比较数据
ftest1_war= open(ftestfn_war, 'rb')
mytest2_words = copy.deepcopy(sample_words) # 复制语料库
try:
ftest1_text_war = ftest1_war.read().decode('utf-8')
#ftest1_text=unicode(ftest1_text,'utf-8')
finally:
ftest1_war.close()
ftest1_seg_list_war = jieba.cut(ftest1_text_war)
for w in ftest1_seg_list_war:
if not(w.strip() in f_stop_seg_list):
if w in mytest2_words:
mytest2_words[w] += 1 # 统计语料库中的词条在测试集中的频数
#形成词条词频特征码
#sampdata = [] # 特征码用列表,方便使用numpy计算
test2data = []
for key in all_words.keys():
#sampdata.append(all_words[key]) # 训练集的特征码
test2data.append(mytest2_words[key]) # 测试集的特征码
test2simi = get_cossimi(sampdata, test2data) # 计算余弦相似度
print(u'%s与样本[%s]的余弦相似度:%f' % (ftestfn_mobile, sampfn_test, test1simi))
print(u'%s与样本[%s]的余弦相仿度:%f' % (ftestfn_war, sampfn_test, test2simi))
相似度结果异常,待复查。