文档章节

机学走起第五式:加速

厉力文武
 厉力文武
发布于 2017/08/15 15:09
字数 820
阅读 18
收藏 1
点赞 0
评论 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基础上有小幅提升,都适合各种长短尺寸的语句,并未因语句长度增加造成效果衰减,反之同理,显然要想进一步提升相似度计算的效果还需要换个思路。

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

© 著作权归作者所有

共有 人打赏支持
厉力文武
粉丝 27
博文 80
码字总数 73556
作品 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
深思考杨志明:如何开启智慧医疗大门

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

深思考人工智能
05/21
0
0
GPU 加速深度学习库--Hebel

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

匿名
2017/03/03
125
0
互联网造福人民 人工智能让生活更精彩

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

人工智能大观
2017/04/22
0
0
我使用NHibernate在.NET中遇到的问题一记!

.Net ORM映射框架 NHibernate,本来是Java的东西,一群牛B轰轰的码农,移植到了.NET平台、是个非常不错的 ORM 映射框架、 故事开始啦 ~_~ ! 下班的钟声已经敲响了,远远望去。打卡机处排着长...

点儿都不扯
2015/03/27
0
0
异构计算加速平台有效满足AI及高性能计算业务需求

近日,致力于提供异构计算加速整体解决方案、业界领先的异构加速和业务卸载方案厂商——杭州加速云信息技术有限公司(简称:加速云)正式启动跨越北京、上海、成都、西安四大城市的 “加速新...

yssycz
04/24
0
0
利用Deskpool 搭建 桌面云教室

1 产品概述 Deskpool是一个精简高效的桌面云教学平台,通过统一的管理平台全面管理位于数据中心的物理和虚拟资源,用户仅需要使用低成本的ARM架构云终端或者显示器一体机就可以连接到数据中心...

yangtzi
2016/07/07
0
0
浙大的游戏设计教程

第一部分 游戏程序设计概览 计算机游戏简介:什么是游戏、游戏的分类等 游戏的基本开发流程? 游戏开发的基本理念及方法 游戏软件的体系结构:包括三维游戏引擎的架构分析 游戏的调试与测试 ...

Matrix4X4
2012/08/19
361
2
【AAAI 2018】中大商汤等提出深度网络加速新方法,具有强大兼容能力

深度网络不断地提升计算机视觉任务的性能,然而,性能提高往往却伴随着愈高的计算复杂度,这严重限制了深度网络在资源受限的平台(如手机,移动嵌入式设备等)的应用。因此,研究深度网络的加...

技术小能手
2017/12/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringBoot | 第十章:Swagger2的集成和使用

前言 前一章节介绍了mybatisPlus的集成和简单使用,本章节开始接着上一章节的用户表,进行Swagger2的集成。现在都奉行前后端分离开发和微服务大行其道,分微服务及前后端分离后,前后端开发的...

oKong
今天
2
0
Python 最小二乘法 拟合 二次曲线

Python 二次拟合 随机生成数据,并且加上噪声干扰 构造需要拟合的函数形式,使用最小二乘法进行拟合 输出拟合后的参数 将拟合后的函数与原始数据绘图后进行对比 import numpy as npimport...

阿豪boy
今天
1
0
云拿 无人便利店

附近(上海市-航南路)开了家无人便利店.特意进去体验了一下.下面把自己看到的跟大家分享下. 经得现场工作人员同意后拍了几张照片.从外面看是这样.店门口的指导里强调:不要一次扫码多个人进入....

周翔
昨天
1
0
Java设计模式学习之工厂模式

在Java(或者叫做面向对象语言)的世界中,工厂模式被广泛应用于项目中,也许你并没有听说过,不过也许你已经在使用了。 简单来说,工厂模式的出现源于增加程序序的可扩展性,降低耦合度。之...

路小磊
昨天
156
1
npm profile 新功能介绍

转载地址 npm profile 新功能介绍 npm新版本新推来一个功能,npm profile,这个可以更改自己简介信息的命令,以后可以不用去登录网站来修改自己的简介了 具体的这个功能的支持大概是在6这个版...

durban
昨天
1
0
Serial2Ethernet Bi-redirection

Serial Tool Serial Tool is a utility for developing serial communications, custom protocols or device testing. You can set up bytes to send accordingly to your protocol and save......

zungyiu
昨天
1
0
python里求解物理学上的双弹簧质能系统

物理的模型如下: 在这个系统里有两个物体,它们的质量分别是m1和m2,被两个弹簧连接在一起,伸缩系统为k1和k2,左端固定。假定没有外力时,两个弹簧的长度为L1和L2。 由于两物体有重力,那么...

wangxuwei
昨天
0
0
apolloxlua 介绍

##项目介绍 apolloxlua 目前支持javascript到lua的翻译。可以在openresty和luajit里使用。这个工具分为两种模式, 一种是web模式,可以通过网页使用。另外一种是tool模式, 通常作为大规模翻...

钟元OSS
昨天
2
0
Mybatis入门

简介: 定义:Mybatis是一个支持普通SQL查询、存储过程和高级映射的持久层框架。 途径:MyBatis通过XML文件或者注解的形式配置映射,实现数据库查询。 特性:动态SQL语句。 文件结构:Mybat...

霍淇滨
昨天
2
0
开发技术瓶颈期,如何突破

前言 读书、学习的那些事情,以前我也陆续叨叨了不少,但总觉得 “学习方法” 就是一个永远在路上的话题。个人的能力、经验积累与习惯方法不尽相同,而且一篇文章甚至一本书都很难将学习方法...

_小迷糊
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部