文档章节

机学走起第四式:起飞

厉力文武
 厉力文武
发布于 2017/08/12 09:53
字数 643
阅读 25
收藏 0

    LDA(Latent Dirichlet Allocation)是一种文档主题提取模型,也叫词题档三层贝叶斯,按照单词 -> 主题 -> 文档从属分布概率来隐式推导归档类目,属于无监督机器学习范畴。实际效果和训练样本的质量关系极其密切,目标类目不宜期待过多过细,否则效果的衰减将远超预期,另外脸书一款开源监督机器学习主题提取模型效果更佳,今天先挖个坑留着以后再说。核心的实现借用吉布斯采样算法,自己要做的是输入输出和准备训练样本。样本导入需要两个参数,cps,二维向量对应文档,size,整数对应词表尺寸,定义目标主题数可以根据需要指定,主题概率和单词概率默认配置即可,训练完毕根据模型提取主题词。

获取词表:

	public static XxCorpus loadSample(String f) throws Exception {
		File fds = new File(f);
		XxCorpus cps = new XxCorpus ();
		
        for (File v : fds.listFiles()) {
        	String buf = new String();
    		List<String> lst = new LinkedList<String>();
    		BufferedReader brd = new BufferedReader(new InputStreamReader(new FileInputStream(v), "UTF-8"));
            
			while (null != (buf = brd.readLine())) {
				for (String w : buf.split(" ")) {
					if (w.trim().length() < 2) continue;
					lst.add(w);
				}
			}

			cps.addDoc(lst);
			brd.close();
        }
		
		return cps;
	}

	public int[] addDoc(List<String> l) {
		int idx = 0;
		int[] doc = new int[l.size()];
		
		for (String v : l) {
			doc[idx ++] = voc.getId(v, true);
		}
		lst.add(doc);
		
		return doc;
	}

	public Integer getId(String w, boolean b) {
		Integer id = w2i.get(w);
		if (true == b) {
			if (null == id) {
				id = w2i.size();
			}
			w2i.put(w, id);

			if (i2w.length - 1 < id) {
        		String[] arr = new String[w2i.size() * 2];
        		System.arraycopy(i2w, 0, arr, 0, i2w.length);
        		i2w = arr;
        	}
        	i2w[id] = w;
        }

        return id;
	}

样本训练:new LdaGibbsSampler(cps.getDoc(), cps.getSize()).gibbs(10);

提主题词:

    public static Map<String, Double>[] translate(double[][] p, CmVocab v, int l) {
		l = Math.min(l, p[0].length);
        Map<String, Double>[] rst = new Map[p.length];
        
        for (int k = 0; k < p.length; k++) {
        	Map<Double, String> map = new TreeMap<Double, String>(Collections.reverseOrder());
        	for (int i = 0; i < p[k].length; i++) {
        		map.put(p[k][i], v.getWord(i));
            }
            Iterator<Map.Entry<Double, String>> iterator = map.entrySet().iterator();
            rst[k] = new LinkedHashMap<String, Double>();
            for (int i = 0; i < l; ++i) {
                Map.Entry<Double, String> val = iterator.next();
                rst[k].put(val.getValue(), val.getKey());
            }
        }
        
        return rst;
    }

    主题预测:随机一篇文章去停用词分词备用,根据词表生成一份一维向量表,连同训练结果模型一并作为参数执行主题预测,返回结果是一个双精度向量集合。

   public static Map<String, Double> translate(double[] t/* 双精度向量 */, double[][] p, CmVocab v, int l) {
		int n = -1;
		double d = -1.0;
        Map<String, Double>[] tpc = translate(p, v, l);
        
        for (int k = 0; k < t.length; k++) {
        	if (t[k] > d) {
                d = t[k];
                n = k;
            }
        }
        
        return tpc[n];
    }

    把结果打印出来看看,亲咋样?

    预告:《机学走起第五式:加速》之基于TF向量的相似度算法与实现。

© 著作权归作者所有

共有 人打赏支持
厉力文武
粉丝 30
博文 83
码字总数 77362
作品 0
朝阳
程序员
数据库课程之分布式数据库设计(二)

前言 在第一篇文章中,笔者又做了一些补充。因为补充内容属于该课程第一章节的内容。此后笔者文章的更新主要会以完整章节为主,而不是上一次课更新一次。这篇文章将主要是记录分布式数据库系...

ZhengYaWei
03/26
0
0
嵌入式系统定制开发的分层与专业的分类

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

gunser
05/31
0
0
Husky数据分析——全球航班信息的研究

在莱特兄弟制造了第一架可控飞机100年后的今天,坐飞机已然成为了大众化的出行方式。可是我们大多数人对航空领域的相关情况了解得还并不多,例如历史上各国航空器制造公司的兴衰、全球各个机...

happengft
2017/01/13
0
0
AlphaGo教学工具正式上线 柯洁称要“重新学围棋”

北京时间12月11日晚间,Deepmind公司在自己官网上线了AlphaGo教学工具,旨在帮助公众用新的、启发性的方式下围棋。这样的举措,也进一步兑现了Deepmind在乌镇人机大战结束时的承诺:与全世界...

澎湃新闻
2017/12/12
0
0
真·脑筋急转弯 第一卷

写这一系列的脑筋急转弯是因为当前网络上流传的脑筋急转弯都是无厘头式的题目,很少有一些成系列的智力题。为了本人未来的孩子的智商高于他的父辈,我决定从现在开始收集一些能够锻炼脑力的脑...

刀狂剑痴
2015/08/27
20
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
0
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
0
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0
OSChina 周一乱弹 —— 有人要给本汪介绍妹子啦

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享水木年华的单曲《中学时代》@小小编辑 手机党少年们想听歌,请使劲儿戳(这里) @须臾时光:夏天还在做最后的挣扎,但是晚上...

小小编辑
今天
18
5
centos7安装redis及开机启动

配置编译环境: sudo yum install gcc-c++ 下载源码: wget http://download.redis.io/releases/redis-3.2.8.tar.gz 解压源码: tar -zxvf redis-3.2.8.tar.gz 进入到解压目录: cd redis-3......

hotsmile
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部