余弦相似性是指通过测量两个向量内积空间的夹角的余弦值来度量它们之间的相似性。0度角的余弦值是1,而其他任何角度的余弦值都不大于1;并且其最小值是-1。从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。在比较过程中,向量的规模大小不予考虑,仅仅考虑到向量的指向方向。余弦相似度通常用于两个向量的夹角小于90°之内,因此余弦相似度的值为0到1之间。
值得注意的是余弦相似度可以用在任何维度的向量比较中,它尤其在高维正空间中的利用尤为频繁。
两个向量间的余弦值可以很容易地通过使用欧几里得点积和量级公式推导:
鉴于两个向量的属性, A 和B的余弦相似性θ用一个点积形式来表示其大小,如下所示:
产生的相似性范围从-1到1:-1意味着两个向量指向的方向正好截然相反,1表示它们的指向是完全相同的,0通常表示它们之间是独立的,而在这之间的值则表示中度的相似性或相异性。
余弦相似度很适合做文本分类,我们把文本中的所有词映射到n维空间的一个向量
我们先下载和测试中文分词组件:"结巴"中文分词,该组件通过import jieba 来引用,如:
#encoding=utf-8 import jieba seg_list = jieba.cut("我来到北京清华大学", cut_all=True) print "Full Mode:", "/ ".join(seg_list) # 全模式 seg_list = jieba.cut("我来到北京清华大学", cut_all=False) print "Default Mode:", "/ ".join(seg_list) # 精确模式 seg_list = jieba.cut("他来到了网易杭研大厦") # 默认是精确模式 print ", ".join(seg_list) seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造") # 搜索引擎模式 print ", ".join(seg_list)
测试一下这个组件,效果还可以
>>> ================================ RESTART ================================
>>>
loading model cost 4.98799991608 seconds.
Trie has been built succesfully.
/ 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学/
Default Mode: 我/ 来到/ 北京/ 清华大学
他, 来到, 了, 网易, 杭研, 大厦
小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造
将计算余弦相似度的函数编写如下:
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)
我们建立4个文本,2个是关于移动和手机方面的新闻,2个是关于战争军事方面的新闻。我们将其中手机文本分词后结果如下:
>>> runfile(r'I:ook_prog ext_fl.py', wdir=r'I:ook_prog')
http://blog.csdn.net/myhaspl
myhaspl@qq.com
loading test1.jpg ...
working Full Mode: 中新网/ 9/ 月/ 1/ 日电/ (/ IT/ 频道/ / 姜莹/ )/ 今日/ 起/ ,/ 所有/ 新/ 入网/ 、/ 转入/ 网/ 用户/ 必须/ 在/ 办理/ 通信/ 业务/ 时/ 登记/ 真实/ 用户/ 信息/ ,/ 未登记/ 的/ 老/ 用户/ 在/ 办理/ 新/ 套餐/ 业务/ 时/ 将/ 重新/ 登记/ 真实/ 用户/ 信息/ 。/ 工信部/ 规定/ ,/ 如果/ 运营商/ 不/ 配合/ 登记/ ,/ 将/ 被/ 强制/ 处以/ 1/ 万元/ 以上/ 3/ 万元/ 以下/ 的/ 罚款/ 。/
/
/ / / 工信部/ “/ 动真格/ ”/ :/ 运营商/ 不/ 登记/ 就/ 罚款/
/
/ / / 其实/ 早/ 在/ 2010/ 年/ ,/ 工信部/ 就/ 提出/ 实行/ 手机/ 实名制/ 的/ 规定/ 。/ 但/ 截止/ 到/ 今年/ 3/ 月/ ,/ 根据/ 工信部/ 统计/ ,/ 仍/ 有/ 约/ 2.8/ 亿/ 的/ 用户/ 没有/ 进行/ 实名/ 登记/ 。/ 由于/ 部分/ 用户/ 担心/ 隐私/ 泄露/ 不/ 愿意/ 登记/ ,/ 而/ 书报亭/ 、/ 小卖部/ 、/ 网络/ 上/ 等/ 社会/ 代理商/ 也/ 存在/ 不/ 规范/ 现象/ ,/ 致使/ 有/ 相当/ 数量/ 的/ 预付费/ 手机卡/ 的/ 老/ 用户/ 尚/ 游离/ 于/ 实名制/ 之外/ ,/ 手机/ 实名制/ 并未/ 彻底/ 落实/ 。/
/
/ / / 手机/ 不/ 实名/ 背后/ 却/ 有着/ 巨大/ 隐患/ 。/ 据/ 工信部/ 相关/ 负责人/ 介绍/ ,/ 一些/ 不法分子/ 利用/ 未登记/ 真实/ 身份/ 信息/ 的/ 电话/ 传播/ 淫秽/ 电子信息/ 、/ 发送/ 垃圾/ 短信息/ 、/ 散布/ 有害信息/ 、/ 实施/ 诈骗/ 等/ 问题/ 突出/ ,/ 影响/ 了/ 用户/ 的/ 合法权益/ ,/ 扰乱/ 了/ 社会秩序/ ,/ 甚至/ 威胁/ 国家/ 安全/ 。/
/
/ / / 至此/ ,/ 7/ 月/ 16/ 日/ ,/ 工信部/ 公布/ 了/ 《/ 电话/ 用户/ 真实/ 身份/ 信息/ 登记/ 规定/ 》/ (/ 中华人民共和国/ 工业/ 和/ 信息化/ 部令/ 第/ 25/ 号/ )/ 。/ 《/ 规定/ 》/ 要求/ ,/ 电信业务/ 经营者/ 为/ 用户/ 办理/ 入网/ 手续/ 时/ ,/ 应当/ 要求/ 用户/ 或/ 委托人/ 出示/ 相应/ 有效证件/ 、/ 提供/ 真实/ 身份/ 信息/ ;/ 用户/ 拒绝/ 出示/ 有效证件/ ,/ 拒绝/ 提供/ 其/ 证件/ 上/ 所/ 记载/ 的/ 身份/ 信息/ ,/ 冒用/ 他人/ 的/ 证件/ ,/ 或者/ 使用/ 伪造/ 、/ 变造/ 的/ 证件/ 的/ ,/ 电信业务/ 经营者/ 不得/ 为/ 其/ 办理/ 入网/ 手续/ 。/
/
/ / / 不仅/ 将/ 手机/ 实名制/ 升级/ 为/ 电话/ 实名制/ ,/ 《/ 规定/ 》/ 还/ 首次/ 提出/ 对/ 不/ 实施/ 、/ 不/ 配合/ 的/ 电信/ 经营者/ 进行/ 行政处罚/ 的/ 说法/ 。/ 《/ 规定/ 》/ 要求/ ,/ 电信/ 运营商/ 要/ 主动/ 实施/ 新/ 用户/ 入网/ 实名/ 登记/ ,/ 并/ 每年/ 组织/ 一次/ 对/ 电话/ 实名制/ 实施/ 的/ 自我/ 检查/ ,/ 不/ 配合/ 电信/ 管理机构/ 检查/ 的/ ,/ 将/ 处/ 一万元/ 以上/ 三万元/ 以下/ 罚款/ 。/ 如此/ “/ 强硬/ ”/ 姿态/ ,/ 无疑/ 为/ 此次/ 实施/ 实名制/ 的/ 效果/ 提供/ 了/ 有力/ 的/ 保障/ 。
>>>
python代码如下:
#!/usr/bin/env python #-*- coding: utf-8 -*- #code:myhaspl@qq.com import cv2 import numpy as np import jieba 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) if __name__ == '__main__': print 'http://blog.csdn.net/myhaspl' print 'myhaspl@qq.com' print print 'loading %s ...' % fn print 'working', f1 = open('mobile1.txt') try: f1_text = f1.read( ) finally: f1.close( ) f1_seg_list = jieba.cut(f1_text) print "Full Mode:", "/ ".join(f1_seg_list)