文档章节

机学走起第五式:加速

厉力文武
 厉力文武
发布于 2017/08/15 15:09
字数 820
阅读 19
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

推荐一款接口 API 设计神器!

今天栈长给大家推荐一款接口 API 设计神器,传说中的,牛逼哄洪的 Swagger,它到底是什么?今天为大家揭开谜底! Swagger是什么? 官网:https://swagger.io/ Swagger 如官网所示,它是最好的...

Java技术栈
26分钟前
5
0
AMD直奔5nm!这一步棋下得妙

AMD今年将推出采用7nm工艺的第二代EPYC霄龙、第三代Ryzen锐龙处理器,其中后者已经在CES 2019上公开首秀,性能追评i9-9900K,功耗则低得多。 虽然被称为“女友”的GlobalFoundries临时决定放...

linuxCool
32分钟前
2
0
《Migrating to Cloud-Native Application Architectures》学习笔记之Chapter 1. The Rise of Cloud-Native

是什么让互联网公司实现了快速增长? Speed of innovation (快速的创新) Always-available services (服务高可用) Web scale (web高可扩展) Mobile-centric user experiences (以移动...

梦朝思夕
36分钟前
1
0
骄傲的技术人,技术是你的全部吗?

[一] 惊喜 2019年01月30日笔者发布了一篇 <自我剖析,坚持有多难?> 文章,本以为很平常的一篇文章没想到受到了广大技术人员的关注,算是19年的美好开端,继续开拔! 下面进入本篇的正题。 ...

风象南
52分钟前
12
0
Spring boot 入门--1

Spring 简介 spring的诞生历史 微框架,与Spring 4 一起诞生,比如 @RestController。 可以快速上手,整合子项目。 依赖很少的配置就可以快速搭建并且运行项目。...

细节探索者
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部