文档章节

机学走起第五式:加速

厉力文武
 厉力文武
发布于 2017/08/15 15:09
字数 820
阅读 18
收藏 1

    做互联网业务免不了和数据打交道,数据量一大各种问题层出不穷,磁盘空间是个问题吧,传输带宽是个问题吧,分析挖掘是个问题吧,增删改查是个问题吧。数据量大就算了,重复冗余带来存储传输计算压力也大幅度增长,所以数据排重很重要,方法很多,挑了几个有行业代表性、效果说得过去、简单易懂易实现的算法聊一聊,今儿个先谈谈基于TF向量和TF-IDF向量两种相似度计算的算法、实现与比较。
    第一步词表:将待计算相似度的文档分词后汇总成总词表,以便统计每篇文档的词频;
    第二步词频:以分词作为key,以词频作为val,将每个文档分别数字化到各自的向量空间中;
    第三步计算:将向量空间中的值逐一带入下面的公式,计算两个向量空间的夹角余弦值;

                    

    点评:这个方法简单粗暴好理解好实现工作量小分分钟搞定,缺点是没有考虑到每个词语在语句中的位置、权重等因素,频次高的未必权重高,缺乏对同义词近义词的容忍,适合硬相似度计算,对于软相似度计算没有效果。

    接下来对TF值进行调整,将向量值换成TF-IDF,并对该值设置阈值,低于阈值的项丢弃不参与余弦运算,这样做的目的是为了提升词语在语句权重中的价值,修正硬相似度计算中所导致的误差。

初始化IDF配置:

	private static void CompInitTfIdf(Map<String, Double> c) throws Exception {
		String buf = new String();
		BufferedReader br = new BufferedReader(new FileReader(XX_FIDF));
		
		while (null != (buf = br.readLine())) {
			String[] arr = buf.split("\t");
			c.put(arr[0], new Double(arr[1]));
		}
		
		br.close();
	}

获取TF-IDF并排序:

	private static void SimilDocTfIdf(Map<String, Double> c, Map<String, Double> b, String s) {
		Double val = null;
		String wds[] = null;
		Map<String, Double> doc = new HashMap<>();
		Vector<Map.Entry<String, Double>> rst = new Vector<>();
		
		for (String w : (wds = s.split(" "))) {
			doc.put(w, null != (val = doc.get(w)) ? val + 1 : 1);
		}
		
		for (Map.Entry<String, Double> v : doc.entrySet()) {
			if (null != (val = c.get(v.getKey()))) {
				v.setValue(v.getValue() / wds.length * val);
				rst.add(v);
			}
		}
		
		Collections.sort(rst, new Comparator<Map.Entry<String, Double>>() {
			public int compare(Map.Entry<String, Double> n, Map.Entry<String, Double> m) {
				return m.getValue().compareTo(n.getValue());
			}
		});
		
		for (int idx = 0; idx < rst.size() / 2; ++ idx) {
			b.put(rst.get(idx).getKey(), 0d);
		}
	}

余弦相似度计算:

	private static double SimilCosine(Vector<XxTfIdf> m, Vector<XxTfIdf> n) {
		double nmr = 0, dn1 = 0, dn2 = 0;
		int len = Math.min(m.size(), n.size()) - 1;
		
		/* 分子计算 */
		for (int idx = 0; idx < len; ++ idx) {
			nmr += m.get(idx).val * n.get(idx).val;
		}
		
		/* 左向量计算 */
		for (int idx = 0; idx < len; ++ idx) {
			dn1 += m.get(idx).val * m.get(idx).val;
		}
		dn1 = Math.sqrt(dn1);
		
		/* 右向量计算 */
		for (int idx = 0; idx < len; ++ idx) {
			dn2 += n.get(idx).val * n.get(idx).val;
		}
		dn2 = Math.sqrt(dn2);
		
		/* 余弦值计算 */
		return nmr / (dn1 * dn2);
	}

    点评:这两种方法对相似度计算中自然语言的语义因素的考量都显得过于粗放,TF-IDF也仅是在TF基础上有小幅提升,都适合各种长短尺寸的语句,并未因语句长度增加造成效果衰减,反之同理,显然要想进一步提升相似度计算的效果还需要换个思路。

    预告:《机学走起第六式:箭船分离》之局部哈希算法与实现。

© 著作权归作者所有

共有 人打赏支持
厉力文武
粉丝 30
博文 86
码字总数 81619
作品 0
朝阳
程序员
私信 提问
加载中

评论(1)

OSC_LqHdWS
OSC_LqHdWS

中科创达孙力:不迷信AI算法,智能视觉如何转型升级?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/85110672 近日,中科创达副总裁孙力在 Thunder World 2018 嵌入式 AI 人工...

AI科技大本营
2018/12/19
0
0
嵌入式系统定制开发的分层与专业的分类

嵌入式系统这个名词还是比较难以准确定义的,一般把“用于控制、监视或者辅助操作机器和设备的装置”称为嵌入式系统,系统包括一系列软硬件设施等,比如:手机的系统开发(Android、IOS等),...

gunser
2018/05/31
0
0
GPU 加速深度学习库--Hebel

Hebel 是一款用 Python 编写的支持 GPU 加速的深度学习库。 Hebel 是一个通过 PyCUDA 库使用 GPU CUDA 来加速建立神经网络的深度学习库。它实现了几类最重要的神经网络模型,提供各种激活函数...

匿名
2017/03/03
125
0
深思考杨志明:如何开启智慧医疗大门

     5月10日,全球人工智能产品应用博览会在苏州国际博览中心盛大开幕,在同期举行的2018医疗人工智能产学研医高峰论坛上,深思考CEO兼首席架构师杨志明博士就“如何开启智慧医疗大门”...

深思考人工智能
2018/05/21
0
0
3dmax2013-2019【3dsmax破解版】破解中文版(付破解教程)

界面语言:中文版/英文版 软件大小:5.32GB 运行环境:Win2003,WinXP,Win2000,Win9X,Win7 运行支持:64位 下载链接: 3DMAX全系列 (百度网盘)密码: 5y7k 3dmax2019【3dsmax2019破解版】破解...

炎黄V之怒
2018/04/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《傲慢与偏见》的读书笔记与读后感作文2400字

《傲慢与偏见》的读书笔记与读后感作文2400字: 作者:孙苑馨;笔者按:读书这个习惯是我爸妈养出来的。小时候父母赚的钱除了吃饭穿衣剩下的就是买书了,他们除了买各种新鲜出版的文艺派图书...

原创小博客
12分钟前
0
0
oozie job 的挂了监控报警或重启

oozie Coordinator 的job 和actioni状态很多,但好像不支持设置某状态如failed后30分钟后自动重新拉启,因他的条件只有几种:触发条件可以是一个时间频率、一个dataset实例是否可用,或者可能...

hblt-j
30分钟前
1
0
python精简笔记-[6]-[if,for,while]语句

1.if 条件判断 语法: if 判断条件: 执行语句……elif 判断条件:    执行语句……elif 判断条件:    执行语句……else: 执行语句…… 实例1: n = input("请输...

平头哥-Enjoystudy
33分钟前
0
0
RxJava 是如何实现线程切换的(上)

前言 通过前一篇的从观察者模式出发,聊聊RxJava,我们大致理解了RxJava的实现原理,在RxJava中可以非常方便的实现不同线程间的切换。subscribeOn 用于指定上游线程,observeOn 用于指定下游线...

亭子happy
今天
2
0
想晋级高级工程师只知道表面是不够的!Git内部原理介绍

本文由云+社区发表 作者:腾讯工蜂用户:王二卫 从不一样的视角了解git,以便更好的使用git 一、git & git 版本库认识 git 是一个内容寻址的文件系统,其核心部分是一个简单的键值对数据库(...

腾讯云加社区
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部