`

文档过滤

    博客分类:
  • java
阅读更多

算法来自于《集体智慧编程》-第六章

原书代码用 Python 实现,这两天看这章书,改用 Java 实现。

 

package ch6DocumentFiltering;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class Classifier {
	private HashMap<String, Integer[]> fc = new HashMap<String, Integer[]>();
	private HashMap<String, Integer> cc = new HashMap<String, Integer>();
	private HashMap<String, Integer> catMap = new HashMap<String, Integer>();
	private HashMap<String, Double> threshold = new HashMap<String, Double>();

	// private String[] features;

	public Classifier() {
		// fc = null;
		// cc = null;
		// this.features = getFeatures(content);
	}

	public double getThreshold(String key) {
		if(this.threshold.get(key) == null)
			return 1.0;
		return this.threshold.get(key);
	}

	public void setThreshold(String key, double t) {
		this.threshold.put(key, t);
	}

	/**
	 * 
	 * @param content
	 * @return
	 */
	public String[] getFeatures(String content) {
		DocClass doc = new DocClass();
		return doc.getWords(content);
	}

	/**
	 * 增加某一分类的计数值
	 * 
	 * @param self
	 * @param key
	 * @param cat
	 * @return
	 */
	public void infc(String key, int cat) {
		if (this.fc.get(key) != null) {
			Integer[] temp = this.fc.get(key);
			if (temp.length > cat) {
				Integer[] result = new Integer[temp.length];
				for (int i = 0; i < temp.length; i++) {
					if (i == cat)
						result[i] = temp[i] + 1;
					else
						result[i] = temp[i];
				}
				this.fc.put(key, result);
			} else {
				Integer[] result = new Integer[cat + 1];
				for (int i = 0; i < temp.length; i++) {
					result[i] = temp[i];
				}
				for (int j = temp.length; j < cat + 1; j++) {
					result[j] = 1;
				}
				this.fc.put(key, result);
			}
		} else {
			Integer[] result = new Integer[cat + 1];
			result[cat] = 1;
			this.fc.put(key, result);
		}
	}

	public void incc(String key) {
		if (this.cc.get(key) != null)
			this.cc.put(key, this.cc.get(key) + 1);
		else
			this.cc.put(key, 1);
	}

	/**
	 * 某一特征出现在某分类中的次数
	 * 
	 * @param key
	 * @param cat
	 * @return
	 */
	public double fcount(String key, int cat) {
		if (this.fc.get(key) != null) {
			Integer[] temp = this.fc.get(key);
			if (temp.length > cat) {
				if (this.fc.get(key)[cat] != null)
					return (double) this.fc.get(key)[cat];
			}
		}
		return 0.0;
	}

	/**
	 * 某一分类的内容项数量
	 * 
	 * @param cat
	 * @return
	 */
	public int catCount(String cat) {
		if (this.cc.get(cat) != null)
			return this.cc.get(cat);
		return 0;
	}

	/**
	 * 所有内容项数量
	 * 
	 * @return
	 */
	public int totalCount() {
		int count = 0;
		for(Iterator<String> i = this.cc.keySet().iterator(); i.hasNext();){
			String key = i.next();
			count += this.cc.get(key);
		}
		return count;
	}

	/**
	 * 分类列表
	 * 
	 * @return
	 */
	public Set<String> getCategories() {
		return this.cc.keySet();
	}

	/**
	 * 
	 * @param item
	 * @param cat
	 */
	public void train(String item, String cat) {
		String[] features = getFeatures(item);

		int intCat = -1;
		if (this.catMap.get(cat) == null) {
			this.catMap.put(cat, new Integer(this.catMap.size()));
		}
		intCat = this.catMap.get(cat);

		for (String f : features) {
			this.infc(f, intCat);
		}

		this.incc(cat);
	}

	/**
	 * 计算单词咋分类中出现的概率
	 * 
	 * @param key
	 * @param cat
	 * @return
	 */
	public double fprob(String key, String cat) {
		if (this.catCount(cat) == 0)
			return 0.0;
		return this.fcount(key, this.catMap.get(cat)) / (double)this.catCount(cat);
	}

	/**
	 * 
	 * @param key
	 * @param cat
	 * @param weight
	 * @param ap
	 * @return
	 */
	public double weightedProb(String key, String cat, double weight, double ap) {
		double basicProb = fprob(key, cat);

		int totals = 0;
		String[] cats = this.getCategories().toArray(new String[0]);
		for (String c : cats) {
			totals = (int) (totals + this.fcount(key, this.catMap.get(c)));
		}

		double bp = ((weight * ap) + (totals * basicProb)) / (weight + totals);
		return bp;
	}
	
	/**
	 * 找出最可能的分类
	 * 
	 * @param item
	 * @param defaultCat
	 * @return
	 */
	public String classify(String item, String defaultCat){
		String best = defaultCat;
		double max = 0.0;
		HashMap<String, Double> probs = new HashMap<String, Double>();
		Naivebayes n = new Naivebayes();
		for(Iterator<String> i = this.getCategories().iterator(); i.hasNext();){
			String cat = i.next();
			probs.put(cat, n.prob(this, item, cat));
			if(probs.get(cat) > max){
				max = probs.get(cat);
				best = cat;
			}
		}
		
		for(Iterator<String> i = probs.keySet().iterator(); i.hasNext(); ){
			String cat = i.next();
			if(cat == best) continue;
			if(probs.get(cat)*this.getThreshold(best) > probs.get(best))
				return defaultCat;
		}
		return best;
	}

	/**
	 * 
	 * @param c1
	 */
	public void sampleTrain() {
		this.train("the quick brown fox jumps over the lazy dog", "good");
		this.train("make quick monkey in the online casino", "bad");
		this.train("Nobody owns the water.", "good");
		this.train("the quick rabbit jumps fences", "good");
		this.train("buy pharmaceuticals now", "bad");
	}

	public static void main(String[] args) {
		Classifier c1 = new Classifier();
		c1.sampleTrain();
//		c1.setThreshold("bad", 3);
//		System.out.println(c1.classify("quick monkey", "unknow"));
		
		Fisher fisher = new Fisher();
//		System.out.println(fisher.cprob(c1, "money", "bad"));
		System.out.println(fisher.fisherProb(c1, "quick rabbit", "bad"));
	}
}

package ch6DocumentFiltering;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DocClass {
	private Pattern p = Pattern.compile("\\w*");

	/**
	 * 得到一组文件中包含的不重复单词
	 * 
	 * @param content
	 * @return
	 */
	public String[] getWords(String content) {
		String[] dict;
		HashMap<String, Integer> wordsMap = new HashMap<String, Integer>();
		Matcher m = p.matcher(content);
		while (m.find()) {
			int start = m.start();
			int end = m.end();
			String word = content.substring(start, end).toLowerCase();
			if (word.length() < 20 && word.length() > 2) {
				Integer count = wordsMap.get(word);
				if (count == null)
					count = 1;
				else
					count += 1;
				wordsMap.put(word, count);
			}
		}
		Set<String> wordsSet = wordsMap.keySet();
		dict = wordsSet.toArray(new String[0]);
		return dict;
	}

	public static void main(String[] args) {
		String sample = "A wiki ( /ˈwɪki/ WIK-ee) is a website that allows the easy[1] creation and editing of any number of interlinked web pages via a web browser using a simplified markup language or a WYSIWYG text editor.";
		String[] result = new DocClass().getWords(sample);
		for (String word : result) {
			System.out.println(word);
		}
	}
}

 

package ch6DocumentFiltering;

public class Naivebayes {
	/**
	 * pr(Document|Category)
	 * 
	 * @param c
	 * @param item
	 * @param cat
	 * @return
	 */
	public double docProb(Classifier c, String item, String cat) {
		String[] features = c.getFeatures(item);
		double p = 1.0;
		for (String f : features) {
			p *= c.weightedProb(f, cat, 1.0, 0.5);
		}
		return p;
	}
	
	/**
	 * pr(Category|Document)*pr(Document)
	 * @param c
	 * @param item
	 * @param cat
	 * @return
	 */
	public double prob(Classifier c, String item, String cat){
		double catProb = ((double)c.catCount(cat)/c.totalCount());
		//System.out.println(c.totalCount());
		double douDocProb = docProb(c, item, cat);
		return catProb*douDocProb;
	}
	
	public static void main(String[] args){
		Classifier c = new Classifier();
		c.sampleTrain();
		Naivebayes n = new Naivebayes();
		System.out.println(n.prob(c, "quick monkey", "good"));
		System.out.println(n.prob(c, "rabbit", "bad"));
	}
}

 

package ch6DocumentFiltering;

import java.util.HashMap;
import java.util.Iterator;

public class Fisher {
	private HashMap<String, Double> minimum = new HashMap<String, Double>();

	public double getMinimum(String cat) {
		if(this.minimum.get(cat) == null)
			return 0.0;
		return this.minimum.get(cat);
	}

	public void setMinimum(String cat, double min) {
		this.minimum.put(cat, new Double(min));
	}

	/**
	 * 
	 * @param c
	 * @param f
	 * @param cat
	 * @return
	 */
	public double cprob(Classifier c, String f, String cat) {
		// 该特征在某分类中出现的概率
		double clf = c.fprob(f, cat);
		if (clf == 0)
			return 0;

		// 该特征在所有分类中出现的概率之和
		double freqSum = 0;
		for (Iterator<String> i = c.getCategories().iterator(); i.hasNext();) {
			String catTemp = i.next();
			freqSum += c.fprob(f, catTemp);
		}

		return clf / freqSum;
	}

	/**
	 * 
	 * @param c
	 * @param item
	 * @param cat
	 * @return
	 */
	public double fisherProb(Classifier c, String item, String cat) {
		double p = 1.0;
		String[] features = c.getFeatures(item);
		for (String f : features) {
			p *= c.weightedProb(f, cat, 1.0, 0.5);
		}
		double fScore = -2 * Math.log(p);

		return invchi2(fScore, 2 * features.length);
	}

	/**
	 * 倒置<a href = "http://baike.baidu.com/view/859454.htm">对数卡方</a>函数
	 * 
	 * @param chi
	 * @param df
	 * @return
	 */
	public double invchi2(double chi, double df) {
		double m = chi / 2.5;
		double sum, term;
		sum = term = Math.exp(-m);
		int temp = (int) (df / 2);
		for (int i = 1; i < temp; i++) {
			term *= m / i;
			sum += term;
		}

		return Math.min(sum, 1.0);
	}

	/**
	 * 
	 * @param c
	 * @param item
	 * @param defaultCat
	 * @return
	 */
	public String classify(Classifier c, String item, String defaultCat) {
		String best = defaultCat;
		double max = 0.0;
		for (Iterator<String> i = c.getCategories().iterator(); i.hasNext();) {
			String catTemp = i.next();
			double p = this.fisherProb(c, item, catTemp);
			if (p > this.getMinimum(catTemp) && p > max) {
				best = catTemp;
				max = p;
			}
		}
		System.out.println(max);
		return best;
	}
	
	public static void main(String[] args){
		Classifier c = new Classifier();
		Fisher fisher = new Fisher();
		fisher.setMinimum("bad", 0.8);
		fisher.setMinimum("good", 0.4);
		c.sampleTrain();
		System.out.println(fisher.classify(c, "casino", "none"));
	}
}
 
分享到:
评论

相关推荐

    过滤器文档过滤器使用中的方法过滤器.pdf

    本文档将深入探讨过滤器的使用及其功能。 **过滤器概述** 过滤器(Filter)的主要作用是对客户端发起的HTTP请求进行预处理,也可以在响应返回给客户端之前进行后处理。例如,过滤器可以用于以下用途: 1. **敏感...

    txt过滤重复

    文档过滤重复软件说明: 比如你采集了很多个QQ号码或者QQ邮箱,你把他们放在txt里面一行一个。 但是里面有重复的QQ,那么就直接用我们软件把这些QQ重复的全部过滤。 生成你指定方式的分割的内容文本。分割符如果...

    Text-Filter:使用 RegExp 构建的文本文档过滤器应用程序

    这个名为"Text-Filter"的项目是利用正则表达式(RegExp)来实现的一个文本文档过滤工具。正则表达式是编程语言中的一种强大工具,用于模式匹配和字符串处理,它能帮助我们快速有效地查找、替换或者提取符合特定规则...

    零关联文档过滤的深度关联模型

    本文提出了一种新颖的深度关联模型,用于零样本文档过滤,命名为DAZER。DAZER通过使用一小部分与类别相关的种子词来估计文档与类别之间的相关性。利用大规模外部语料库预训练的词嵌入,DAZER被设计用来通过建模词...

    过滤盘整震荡指标源码文华财经软件期货指标极品CCI指标.doc

    过滤盘整震荡指标源码文华财经软件期货指标极品CCI指标.doc

    电话号码过滤工具(第二压缩包)v2.2

    已经有对本版的改进版,请尽量使用3.0版本!!!! ... 2、工具采用了非常高效的算法,可以在及短时间内完成百万级号码的过滤,支持批量文件过滤、特殊表达式过滤功能,是一个人见人爱的好工具。

    基于协同过滤算法商品推荐系统论文-java-文档-基于协同过滤算法商品推荐系统文档

    ### 基于协同过滤算法的商品推荐系统设计与实现 #### 一、绪论 - **选题动因**:随着互联网技术的发展和电子商务平台的兴起,如何在海量的商品信息中帮助用户找到他们真正感兴趣的商品成为了商家面临的一个重大...

    Learning Sufficient Queries for Entity Filtering

    实体中心的文档过滤任务关注的是分析时间排序的文档流,并输出与特定实体集合(例如,人、地点、组织机构)相关的文档。实体中心的过滤任务需要对每个实体维护一个查询,并使用这些查询来过滤文档。通过学习高质量的...

    大数据-算法-概率XML文档中Holistic省略Twig查询处理算法的研究与实现.pdf

    在结构化和半结构化的互联网数据中,XML广泛应用,随之而来的是对XML数据查询处理和文档过滤的需求增加。 在处理不确定数据方面,概率XML文档提供了一种模型,其中数据的存在具有一定的概率性。传统的查询处理方法...

    Servlet过滤器的简单使用源码+文档

    在标题"Servlet过滤器的简单使用源码+文档"中,我们可以理解为这个压缩包包含了一个关于Servlet过滤器的基础应用示例,以及相关的源代码和文档资料。描述中提到的"实现一个登陆界面",表明了过滤器可能被用作验证...

    微过滤器开发指南文档

    【微过滤器开发指南文档】是一本专注于使用微过滤器(Minifilter)技术开发文件过滤系统的参考手册。微过滤器驱动是Windows文件系统过滤管理器的一个重要组成部分,它允许开发者在I/O管理器和基本文件系统之间插入...

    文档代码过滤插件

    文档代码过滤插件.html

    Wireshark过滤器说明文档中文版

    Wireshark 过滤器说明文档中文版 Wireshark 过滤器是 Wireshark 和 TShark 中的一个强大功能,能够帮助用户从数据包跟踪中去除干扰,只显示感兴趣的数据包。过滤器可以比较协议中的字段与特定值之间的差异,比较...

    Archivarius3000 v4.69简体中文破解版.rar

    支持文档过滤,在选择文件索引时过滤不需要的数据模块,选择的模块越少索引就越快。在开始搜索前,你需要索引你的文档。索引是文档的词语字典,它有助于实时搜索需要的文档。如果文档不改变的话,那么你只需要创建一...

    Django内置过滤器帮助文档.pdf

    文档内容涵盖了多个内置过滤器的功能和用法。例如,`widthratio`过滤器用于计算给定值与最大值的比例,然后应用这个比例到一个常量宽度值。在HTML模板中可以这样使用: ```html ``` 如果`this_value`是175,`max_...

    过滤txt文档的重复号码 asp

    描述中提到的"用asp写的过滤txt文档内的重复号码,并显示在页面上"进一步明确了任务的执行流程:首先,使用ASP读取TXT文档;接着,通过编程逻辑判断哪些号码是重复的;最后,将过滤后的结果以适当格式输出到网页上,...

    solr cache部分 中文解释

    2. 索引碎片字段值缓存(FieldValueCache):缓存单个字段的值,以加速文档过滤和排序。例如,当对某个分类字段进行快速筛选时,这个缓存能提供帮助。 3. 热点文档缓存(DocumentCache):存储文档ID到文档本身映射...

    行业文档-设计装置-通风过滤窗纸.zip

    2. **过滤技术**:通风过滤窗纸的核心在于其过滤功能,文档可能会详细讲解不同类型的过滤材料和过滤等级,如HEPA(高效颗粒空气)过滤器,活性炭过滤器等,以及它们对不同粒径污染物的捕获能力。 3. **设计考量**:...

Global site tag (gtag.js) - Google Analytics