`
MyEyeOfJava
  • 浏览: 1151859 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7af2d6ca-4fe1-3e9a-be85-3f65f7120bd0
测试开发
浏览量:71167
533896eb-dd7b-3cde-b4d3-cc1ce02c1c14
晨记
浏览量:0
社区版块
存档分类
最新评论

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

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

Java代码 复制代码
  1. <SPAN style="FONT-SIZE: small">package ik.com.cn.test;   
  2.   
  3. import java.io.IOException;   
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()); 
		} 
  }
}

 

 

Java代码 复制代码
  1.   

 输出结果:

Java代码 复制代码
  1. <SPAN style="FONT-SIZE: small">中华人民共和国   
  2. 中华人民   
  3. 中华   
  4. 华人   
  5. 人民共和国   
  6. 人民   
  7. 共和国   
  8. 共和</SPAN>  
中华人民共和国
中华人民
中华
华人
人民共和国
人民
共和国
共和

 

Java代码 复制代码
  1.   

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

 

Java代码 复制代码
  1. <SPAN style="FONT-SIZE: small">package com.cn.bayes;   
  2.   
  3. import java.util.*;   
  4.   
  5. public class Bayes {   
  6.     private Hashtable<String, Integer> hashtable_good;   
  7.     private Hashtable<String, Integer> hashtabel_bad;   
  8.     private Hashtable<String, Double> hashtable_good_p;   
  9.     private Hashtable<String, Double> hashtable_bad_p;   
  10.     private Hashtable<String, Double> hashtable_probability;   
  11.   
  12.     public Hashtable<String, Double> getHashtable_probability() {   
  13.         return hashtable_probability;   
  14.     }   
  15.   
  16.     public void setHashtable_probability(   
  17.             Hashtable<String, Double> hashtableProbability) {   
  18.         hashtable_probability = hashtableProbability;   
  19.     }   
  20.   
  21.     public Bayes(Hashtable<String, Integer> hashtable_good,   
  22.             Hashtable<String, Integer> hashtabel_bad) {   
  23.         this.hashtable_good = hashtable_good;   
  24.         this.hashtabel_bad = hashtabel_bad;   
  25.         this.hashtable_good_p = this.getGoodOrBadPercent(hashtable_good);   
  26.         this.hashtable_bad_p = this.getGoodOrBadPercent(hashtabel_bad);   
  27.   
  28.         Set<String> set_allkeys = this.combineHasetableByKeys(this  
  29.                 .getHashtable_good(), this.getHashtabel_bad());   
  30. //      Set s=hashtable_good_p.entrySet();   
  31. //      System.out.println("hashtable_good_p");   
  32. //      for (Object o :s.toArray()) {   
  33. //          System.out.print("  "+o);   
  34. //      }   
  35. //      s=hashtable_bad_p.entrySet();   
  36. //      System.out.println("hashtable_bad_p");   
  37. //      for (Object o :s.toArray()) {   
  38. //          System.out.print("  "+o);   
  39. //      }   
  40. //         
  41. //      for (Object o : set_allkeys.toArray()) {   
  42. //          System.out.print("  "+o);   
  43. //      }   
  44.         this.hashtable_probability = this  
  45.                 .calcHashtable_probability(set_allkeys);   
  46. //      System.out.println();   
  47. //        s=hashtable_probability.entrySet();   
  48. //      for (Object o : s.toArray()) {   
  49. //          System.out.print("  "+o);   
  50. //      }   
  51.     }   
  52.   
  53.     /*  
  54.      * 通过统计计算 得到 hashtable_good_p 或 hashtable_bad_p  
  55.      */  
  56.     @SuppressWarnings("unchecked")   
  57.     private Hashtable<String, Double> getGoodOrBadPercent(   
  58.             Hashtable hashtable_goodOrBad) {   
  59.         Hashtable<String, Double> percent = new Hashtable<String, Double>();   
  60.         int total = 0;   
  61.         String key;   
  62.         Integer value;   
  63.         Enumeration enumeration = hashtable_goodOrBad.elements();   
  64.         while (enumeration.hasMoreElements()) {   
  65.             total = total + (Integer) enumeration.nextElement();   
  66.         }   
  67. //      System.out.println("total=" + total);   
  68.   
  69.         enumeration = hashtable_goodOrBad.keys();   
  70.         while (enumeration.hasMoreElements()) {   
  71.             key = (String) enumeration.nextElement();   
  72.             value = (Integer) hashtable_goodOrBad.get(key);   
  73. //          System.out.println(key + "   " + value);   
  74.             percent.put(key, new Double((value + 0.0) / total));   
  75.         }   
  76. //       Set s = percent.entrySet();   
  77. //       for (Object o : s.toArray()) {   
  78. //       System.out.println(o);   
  79. //       }   
  80.         return percent;   
  81.     }   
  82.   
  83.     /*  
  84.      * 将两个hash表的所有key值保存在一个Set中,Set是不允许出现重复的元素  
  85.      *   
  86.      * 注意:这个也比较容易扩展将多个hash表的所有key保存在一个Set中  
  87.      *   
  88.      */  
  89.     @SuppressWarnings("unchecked")   
  90.     private Set<String> combineHasetableByKeys(   
  91.             Hashtable<String, Integer> hashtable_good,   
  92.             Hashtable<String, Integer> hashtabel_bad) {   
  93.         Set<String> allkeysSet = new HashSet();   
  94.   
  95.         Set<String> goodKeysSet = hashtable_good.keySet();   
  96.         Set<String> badKeysSet = hashtabel_bad.keySet();   
  97.         Iterator it;   
  98.         it = goodKeysSet.iterator();   
  99.         while (it.hasNext()) {   
  100.             allkeysSet.add(it.next().toString());   
  101.         }   
  102.         it = badKeysSet.iterator();   
  103.         while (it.hasNext()) {   
  104.             allkeysSet.add(it.next().toString());   
  105.         }   
  106.         return allkeysSet;   
  107.     }   
  108.   
  109.     /*  
  110.      * 根据Set提供的key值,计算每个key对应出现的可能性,并封装到hashtable中  
  111.      *   
  112.      */  
  113.     @SuppressWarnings("unchecked")   
  114.     private Hashtable<String, Double> calcHashtable_probability(   
  115.             Set<String> set_allkeys) {   
  116.         Iterator it = set_allkeys.iterator();   
  117.         Hashtable<String, Double> hashtable_probability = new Hashtable();   
  118.         while (it.hasNext()) {   
  119.             String key = it.next().toString();   
  120.             Double good_p_value = this.hashtable_good_p.get(key);   
  121.             Double bad_p_value = this.hashtable_bad_p.get(key);   
  122.             if (null == good_p_value) {   
  123.                 good_p_value = 0.0;   
  124.             }   
  125.             if (null == bad_p_value) {   
  126.                 bad_p_value = 0.0;   
  127.             }   
  128.             Double result = good_p_value + bad_p_value;   
  129.             Double percent=null;   
  130.             if (result != 0.0) {   
  131.                 percent = bad_p_value / result;   
  132.             }   
  133.             hashtable_probability.put(key, percent);   
  134.         }   
  135.         return hashtable_probability;   
  136.     }   
  137.   
  138.     public Hashtable<String, Integer> getHashtable_good() {   
  139.         return hashtable_good;   
  140.     }   
  141.   
  142.     public Hashtable<String, Integer> getHashtabel_bad() {   
  143.         return hashtabel_bad;   
  144.     }   
  145. }</SPAN> 
分享到:
评论

相关推荐

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

    标题中的“利用IKAnalyzer中文分词器模拟Bayes算法对垃圾邮件的过滤的实现”涉及到两个主要技术点:IKAnalyzer中文分词器和Bayes算法。这两种技术在文本处理和信息检索领域有着广泛的应用,特别是在自然语言处理和...

    python垃圾邮件过滤利用贝叶斯分类器写的垃圾邮件过滤器,准确率达98.zip

    Python垃圾邮件过滤器是利用机器学习中的贝叶斯分类器实现的一种高效文本分类技术,尤其适用于电子邮件的自动筛选。在给定的项目中,"Filter.py"可能是实现这个功能的核心代码文件,而"G2"和"A"可能是数据集或者辅助...

    利用贝叶斯算法实现垃圾邮件分类

    贝叶斯算法是一种基于概率统计的机器学习方法,广泛应用于文本分类、垃圾邮件过滤等领域。在这个项目中,我们将通过Python代码`bayes.py`来实现这一功能。 首先,让我们了解贝叶斯分类的基本原理。贝叶斯定理是...

    使用朴素贝叶斯过滤垃圾邮件数据集

    朴素贝叶斯(Naive Bayes)是一种基于概率的分类算法,它在处理文本分类问题,如垃圾邮件识别,上表现得相当有效。这个数据集提供了两种类型的邮件样本,即"spam"(垃圾邮件)和"ham"(非垃圾邮件),它们分别存储在...

    朴素贝叶斯过滤垃圾邮件源码及数据

    在本案例中,我们看到一个Python实现的朴素贝叶斯算法,用于识别和过滤垃圾邮件。源代码文件"bayes.py"很可能是算法的实现,而"chinesespam.xlsx"可能包含训练数据集,即带有标签的中文邮件样本。 **朴素贝叶斯算法...

    基于Naive Bayes模型的垃圾邮件过滤方法 (2008年)

    采用信息增益进行特征选择,以改进的朴素贝叶斯分类算法进行邮件分类.利用文本特征估算文本属于两种类型的偏测度,以此构造二维文本空间.将文本映射为二维空间中的一个点,将分类算法看作是在二维空间中寻求一条...

    python基于朴素贝叶斯算法的垃圾邮件分类

    总的来说,这个项目旨在教你如何利用Python和朴素贝叶斯算法解决实际问题,即垃圾邮件过滤。通过实践这个项目,你可以深入理解朴素贝叶斯算法的工作原理,以及如何在Python环境中处理文本数据。同时,这也是一个很好...

    Bayes算法新版的实现

    **正文** Bayes算法是一种基于概率统计的分类方法,它以贝叶斯定理为基础,广泛...通过简单的应用示例,我们可以直观地了解Bayes算法在实际问题中的应用,例如垃圾邮件检测,从而更好地掌握这一强大的统计学习工具。

    NaiveBayes算法

    NaiveBayes算法

    面向垃圾邮件过滤的典型机器学习算法比较研究.pdf

    【垃圾邮件过滤的机器学习算法比较研究】 垃圾邮件过滤是电子邮件系统中不可或缺的一部分,它通过自动识别和拦截垃圾邮件,保护用户免受垃圾信息的侵扰。机器学习在这方面的应用非常广泛,尤其以朴素贝叶斯(Naive ...

    垃圾邮件过滤课件及数据、代码

    这些算法通过对已知的垃圾邮件和正常邮件进行分类学习,形成一个可以预测新邮件类别的模型。 三、数据集与特征工程 在"数据"目录中,可能包含了用于训练和测试模型的邮件数据集。这些数据集通常包含大量标记好的...

    基于内容的垃圾邮件过滤技术综述(draft).pdf

    这类方法通常利用机器学习算法(如贝叶斯分类器、支持向量机等)对邮件内容进行分析,通过训练模型来预测新邮件是否为垃圾邮件。这种方法能够随着训练数据的增长而不断提高识别精度。 #### 具体技术与方法 文章中...

    Navie Bayes算法 matlab

    在机器学习领域,它被广泛应用于文本分类、情感分析、垃圾邮件过滤等多个场景。Matlab作为一种强大的数值计算环境,提供了实现Navie Bayes算法的工具和接口。 在提供的Matlab压缩包中,包含4个数据集分别存储在4个...

    垃圾邮件过滤器的设计与实现1

    * Bayes.java:实现了朴素贝叶斯分类算法进行垃圾邮件的识别 * MLP.java:实现了多层感知器分类器对垃圾邮件的识别 * MakeFeature.java:实现了从英文邮件文本转换为特征向量的功能 * ClassifyController.java:根据...

    机器学习算法之NaiveBayes算法实现.zip

    在机器学习领域,Naive Bayes算法是一种广泛应用的分类方法,尤其在文本分类、垃圾邮件过滤和情感分析等任务中表现出色。它基于概率论中的贝叶斯定理,因此得名“贝叶斯算法”。Naive Bayes算法的“naive”一词源于...

    贝叶斯垃圾邮件过滤

    **贝叶斯垃圾邮件过滤**是一种广泛应用于电子邮件系统的算法,其主要目的是通过分析邮件内容来判断是否为垃圾邮件。这种过滤方法基于统计学中的贝叶斯定理,它利用概率模型来识别邮件中的特征,从而决定邮件是否属于...

    基于贝叶斯公式的垃圾邮件分类

    贝叶斯公式结合了先验概率(邮件是垃圾邮件的总体概率)和似然概率(给定单词出现时邮件是垃圾邮件的概率),从而计算出新邮件是垃圾邮件的概率。 R语言是一个强大的统计计算和图形生成工具,非常适合这种数据分析...

    Python代码实现基于朴素贝叶斯算法的垃圾邮件分类

    资源概要:Python代码实现基于朴素贝叶斯算法的垃圾邮件...2. NaiveBayes.py:朴素贝叶斯算法解垃圾邮件分类的全部代码 适用人群:学习贝叶斯算法的朋友 学习难度:简单(一共只有100多行代码,注释详细,容易理解)

Global site tag (gtag.js) - Google Analytics