机器学习笔记二十六 余弦相似度进行文本分类

算法过程:
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))

这里写图片描述

相似度结果异常,待复查。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程圈子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值