`
zhangcong170
  • 浏览: 71199 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

利用IKAnalyzer中文分词器模拟Bayes算法对垃圾邮件的过滤的实现(附源码)

阅读更多

        这段时间抽空做了一个利用Bayes算法来模拟对邮件进行过滤的小东东,算是对自己的一个锻炼吧。前前后后总共花了一周多的时间。 
      有关Bayes算法在反垃圾邮件中的应用,请看这里:

            http://www.5dmail.net/html/2006-5-18/2006518234548.htm

      很显然,上面的链接给的一个demo中,有一个比较大的缺陷,那就是它只是一个一个地统计字,而不是词语。在处理中文的问题上,demo的思路是行不通的,必须统计词语而不是一个一个的单字。从大量的文本中提取一个一个的我们熟悉的词语,说起来容易,做起来就相当的困难了,这个问题纠结了我很多天,终于发现原来就在javaEye首页上有对中文分词器IKAnalyzer的介绍,真的是“踏破铁鞋无觅处,得来全不费功夫”,立马把IKAnalyzer“偷”了过去,自己使用了一下,果然是非常的强大。

      有关IKAnalyzer中文分词器,请参看如下地址:

           http://www.iteye.com/wiki/interview/1899-ik-analyzer

     下面贴一段代码,看看这个分词器的强大: 

package ik.com.cn.test;

import java.io.IOException;
import java.io.StringReader;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.TokenStream;
import org.wltea.analyzer.lucene.IKAnalyzer;
/*
 * 分词的小Demo
 * 这个分词工具确实比较强悍
 * 相关的jar包在附件eclipse工程下lib包下
 */
public class SecondTest {
  public static void main(String args[]) throws IOException{
	    Analyzer analyzer = new IKAnalyzer();
		String text="中华人民共和国"; 
		StringReader reader = new StringReader(text); 
		TokenStream ts = analyzer.tokenStream(text, reader); 
		Token t = ts.next(new Token()); 
		while (t != null) {
		    String s=t.term();
		    System.out.println(s); 
		    t = ts.next(new Token()); 
		} 
  }
}



 输出结果:

中华人民共和国
中华人民
中华
华人
人民共和国
人民
共和国
共和



   下面贴出一个比较核心的类Bayes,主要是实现具体的算法。

 

package com.cn.bayes;

import java.util.*;

public class Bayes {
	private Hashtable<String, Integer> hashtable_good;
	private Hashtable<String, Integer> hashtabel_bad;
	private Hashtable<String, Double> hashtable_good_p;
	private Hashtable<String, Double> hashtable_bad_p;
	private Hashtable<String, Double> hashtable_probability;

	public Hashtable<String, Double> getHashtable_probability() {
		return hashtable_probability;
	}

	public void setHashtable_probability(
			Hashtable<String, Double> hashtableProbability) {
		hashtable_probability = hashtableProbability;
	}

	public Bayes(Hashtable<String, Integer> hashtable_good,
			Hashtable<String, Integer> hashtabel_bad) {
		this.hashtable_good = hashtable_good;
		this.hashtabel_bad = hashtabel_bad;
		this.hashtable_good_p = this.getGoodOrBadPercent(hashtable_good);
		this.hashtable_bad_p = this.getGoodOrBadPercent(hashtabel_bad);

		Set<String> set_allkeys = this.combineHasetableByKeys(this
				.getHashtable_good(), this.getHashtabel_bad());
//		Set s=hashtable_good_p.entrySet();
//		System.out.println("hashtable_good_p");
//		for (Object o :s.toArray()) {
//			System.out.print("  "+o);
//		}
//		s=hashtable_bad_p.entrySet();
//		System.out.println("hashtable_bad_p");
//		for (Object o :s.toArray()) {
//			System.out.print("  "+o);
//		}
//		
//		for (Object o : set_allkeys.toArray()) {
//			System.out.print("  "+o);
//		}
		this.hashtable_probability = this
				.calcHashtable_probability(set_allkeys);
//		System.out.println();
//        s=hashtable_probability.entrySet();
//		for (Object o : s.toArray()) {
//			System.out.print("  "+o);
//		}
	}

	/*
	 * 通过统计计算 得到 hashtable_good_p 或 hashtable_bad_p
	 */
	@SuppressWarnings("unchecked")
	private Hashtable<String, Double> getGoodOrBadPercent(
			Hashtable hashtable_goodOrBad) {
		Hashtable<String, Double> percent = new Hashtable<String, Double>();
		int total = 0;
		String key;
		Integer value;
		Enumeration enumeration = hashtable_goodOrBad.elements();
		while (enumeration.hasMoreElements()) {
			total = total + (Integer) enumeration.nextElement();
		}
//		System.out.println("total=" + total);

		enumeration = hashtable_goodOrBad.keys();
		while (enumeration.hasMoreElements()) {
			key = (String) enumeration.nextElement();
			value = (Integer) hashtable_goodOrBad.get(key);
//			System.out.println(key + "   " + value);
			percent.put(key, new Double((value + 0.0) / total));
		}
//		 Set s = percent.entrySet();
//		 for (Object o : s.toArray()) {
//		 System.out.println(o);
//		 }
		return percent;
	}

	/*
	 * 将两个hash表的所有key值保存在一个Set中,Set是不允许出现重复的元素
	 * 
	 * 注意:这个也比较容易扩展将多个hash表的所有key保存在一个Set中
	 * 
	 */
	@SuppressWarnings("unchecked")
	private Set<String> combineHasetableByKeys(
			Hashtable<String, Integer> hashtable_good,
			Hashtable<String, Integer> hashtabel_bad) {
		Set<String> allkeysSet = new HashSet();

		Set<String> goodKeysSet = hashtable_good.keySet();
		Set<String> badKeysSet = hashtabel_bad.keySet();
		Iterator it;
		it = goodKeysSet.iterator();
		while (it.hasNext()) {
			allkeysSet.add(it.next().toString());
		}
		it = badKeysSet.iterator();
		while (it.hasNext()) {
			allkeysSet.add(it.next().toString());
		}
		return allkeysSet;
	}

	/*
	 * 根据Set提供的key值,计算每个key对应出现的可能性,并封装到hashtable中
	 * 
	 */
	@SuppressWarnings("unchecked")
	private Hashtable<String, Double> calcHashtable_probability(
			Set<String> set_allkeys) {
		Iterator it = set_allkeys.iterator();
		Hashtable<String, Double> hashtable_probability = new Hashtable();
		while (it.hasNext()) {
			String key = it.next().toString();
			Double good_p_value = this.hashtable_good_p.get(key);
			Double bad_p_value = this.hashtable_bad_p.get(key);
			if (null == good_p_value) {
				good_p_value = 0.0;
			}
			if (null == bad_p_value) {
				bad_p_value = 0.0;
			}
			Double result = good_p_value + bad_p_value;
			Double percent=null;
			if (result != 0.0) {
				percent = bad_p_value / result;
			}
			hashtable_probability.put(key, percent);
		}
		return hashtable_probability;
	}

	public Hashtable<String, Integer> getHashtable_good() {
		return hashtable_good;
	}

	public Hashtable<String, Integer> getHashtabel_bad() {
		return hashtabel_bad;
	}
}

 

 

  具体的代码都在附件中,欢迎各位指导

分享到:
评论
2 楼 great656747 2012-05-08  
正在看,有点吃力,不过这方面的资料实在是不多 ,楼主的资料很有帮助
1 楼 ftp51423121 2010-02-08  
不是很理解??

相关推荐

    IKAnalyzer中文分词器

    IKAnalyzer是一款专为中文处理设计的开源分词器,它主要应用于搜索引擎、信息检索系统、文本挖掘等领域。这款工具能够高效地对中文文本进行分词,使得计算机可以更好地理解和处理中文信息。IKAnalyzer的名字来源于...

    IKAnalyzer中文分词计算句子相似度

    IKAnalyzer是一款开源的、基于Java实现的中文分词工具,它在中文信息处理领域有着广泛的应用。该工具最初由尹军平(IkGuo)开发,设计目标是提供一个轻量级、高效能的中文分词引擎,用于满足各种中文文本分析的需求...

    使用IK Analyzer实现中文分词之Java实现

    IK Analyzer 是一个开源的,基于 java 语言开发的轻量级的中文分词工具包。从 2006年 12 月推出 1.0 版... 在 2012 版本中,IK 实现了简单的分词歧义排除算法,标志着 IK 分词器从单纯的词典分词向模拟语义分词衍化。

    IKAnalyzer中文分词器v2012使用手册.pdf

    文档内容详细地介绍了IKAnalyzer中文分词器的每一个版本的特性和升级细节,对分词效果进行了示范,并提供了详尽的使用说明,对于希望在Java环境下进行中文文本分词的开发者来说,是一个不可或缺的参考资料。通过IK...

    IK Analyzer中文分词器

    **IK Analyzer中文分词器详解** IK Analyzer是一个在IT领域广泛应用的开源项目,它专注于Java平台上的中文分词处理。中文分词是自然语言处理(NLP)中的基础任务,对于信息检索、文本挖掘、机器翻译等领域至关重要...

    IK Analyzer 中文分词器下载

    IK Analyzer 是一个开源的、基于Java实现的中文分词器,专为全文检索或信息提取等任务设计。它由尹力(Wu Li)在2006年发起,最初是为了改善Lucene的中文处理能力。自那时起,IK Analyzer已经发展成为一个广泛使用的...

    IKAnalyzer中文分词器V2012使用手册_20190806.pdf

    这个分词器最初是基于开源项目Lucene的词典分词和文法分析算法开发的,但到了3.0版本之后,IKAnalyzer发展成为了一个独立于Lucene的通用分词组件,并提供了对Lucene的默认优化实现。 IKAnalyzer2012的结构设计采用...

    IKAnalyzer中文分词器 java

    - **IK Analyzer 2012FF_hf1_source.rar**:这是IKAnalyzer 2012版本的源码压缩包,开发人员可以深入研究其内部实现,了解分词算法和逻辑,也可以根据需要进行定制和二次开发。 - **IKAnalyzer2012_u6.zip**:这是...

    IKAnalyzer中文分词器V3.2使用

    **IKAnalyzer中文分词器V3.2使用详解** IKAnalyzer是一款开源的、适用于Java环境的中文分词器,主要用于解决在信息检索、文本挖掘等领域中遇到的中文处理问题。这款分词器的设计目标是提高分词的准确率,并且具有...

    IKAnalyzer中文分词器 v3.2.0 源码包

    IKAnalyzer是一款广泛应用于Java环境中的开源中文...通过对IKAnalyzer v3.2.0源码的深入学习,开发者不仅可以提升对中文分词技术的理解,还能为自己的项目提供一个强大的中文处理工具,进一步提高软件的智能化水平。

    Java IKAnalyzer 中文分词器

    IK-Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包,也就是可以将一串中文字符分割成一个个的词组或者字词 文件中包含分词工具 ikanalyzer-2012_u6.jar 中文分词配置 IKAnalyzer.cfg..xml

    IKAnalyzer中文分词.rar

    IKAnalyzer继承Lucene的Analyzer抽象类,使用IKAnalyzer和Lucene自带的分析器方法一样,将Analyzer测试代码改为IKAnalyzer测试中文分词效果。 如果使用中文分词器ik-analyzer,就需要在索引和搜索程序中使用一致的...

    ikanalyzer中文分词支持lucene7.1.0

    总的来说,ikanalyzer中文分词支持lucene7.1.0是为了解决旧版ikanalyzer与新Lucene版本的兼容性问题而推出的,它使得开发者能够充分利用Lucene的最新特性,同时保持ikanalyzer的优秀分词性能,对于处理中文内容的...

    IKAnalyzer分词器

    IKAnalyzer是一款专为Java平台设计的开源中文分词器,主要应用于搜索引擎、信息检索系统以及文本分析等领域。这款工具在中文处理方面具有高效、灵活和易扩展的特点,为开发者提供了强大的支持。 标题中的"IK...

    IKAnalyzer中文分词器支持Lucene6.0以上

    提示:IKAnalyzer中文分词器支持Lucene6.0以上,IKAnalyzer中文分词器支持Lucene6.0以上。

    IKAnalyzer 中文分词demo

    标题 "IKAnalyzer中文分词demo" 指的是一个基于IKAnalyzer的中文分词演示项目。IKAnalyzer是一款开源的、适用于Java平台的全文检索引擎工具,主要功能是对中文文本进行有效的分词处理,广泛应用于搜索引擎、信息检索...

    IKAnalyzer 中文分词 完整java项目demo

    IKAnalyzer非常易用的java分词工具。可以自定义扩展词汇。 这个是一个完整的java项目demo。直接可以用,不用再去google下载了。添加了几个自定义词汇,测试好用。 运行ika.java里的main方法即可

    IKAnalyzer中文分词器文档和Jar包

    IKAnalyzer是一款专为Lucene设计的高性能中文分词器,其主要目标是提供一个轻量级、高效且可扩展的解决方案,以便在信息检索、文本分析等场景中处理中文文本。这款工具因其易于使用和出色的性能,在开源社区中备受...

Global site tag (gtag.js) - Google Analytics