文档章节

机学走起第五式:加速

厉力文武
 厉力文武
发布于 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

嵌入式系统定制开发的分层与专业的分类

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

gunser
05/31
0
0
3dmax2013-2019【3dsmax破解版】破解中文版(付破解教程)

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

炎黄V之怒
04/16
0
0
GPU 加速深度学习库--Hebel

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

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

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

深思考人工智能
05/21
0
0
互联网造福人民 人工智能让生活更精彩

  人工智能为新常态注入新动力   近年来,国家从顶层设计入手,勾勒出中国网信战略的宏观框架,明确了中国网信事业肩负的历史使命。我国多措并举、多方参与,开创出互联网发展、治理的新...

人工智能大观
2017/04/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

创建第一个react项目

sudo npm i -g create-react-app@1.5.2 create-react-app react-app cd react-apprm -rf package-lock.jsonrm -rf node_modules #主要是为了避免报错npm installnpm start......

lilugirl
51分钟前
1
0
在浏览器中进行深度学习:TensorFlow.js (八)生成对抗网络 (GAN)

Generative Adversarial Network 是深度学习中非常有趣的一种方法。GAN最早源自Ian Goodfellow的这篇论文。LeCun对GAN给出了极高的评价: “There are many interesting recent development...

naughty
今天
0
0
搬瓦工镜像站bwh1.net被DNS污染,国内打不开搬瓦工官网

今天下午(2018年10月17日),继搬瓦工主域名bandwagonhost.com被污染后,这个国内的镜像地址bwh1.net也被墙了。那么目前应该怎么访问搬瓦工官网呢? 消息来源:搬瓦工优惠网->搬瓦工镜像站b...

flyzy2005
今天
2
0
SpringBoot自动配置

本篇介绍下,如何通过springboot的自动配置,将公司项目内的依赖jar,不需要扫描路径,依赖jar的情况下,就能将jar内配置了@configuration注解的类,创建到IOC里面 介绍下开发环境 JDK版本1.8 spr...

贺小五
今天
3
0
命令行新建Maven多项目

参考地址 # DgroupId 可以理解为包名# DartifactId 可以理解为项目名mvn archetype:generate -DgroupId=cn.modfun -DartifactId=scaffold -DarchetypeArtifactId=maven-archetype-quickst......

阿白
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部