这段时间抽空做了一个利用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;
}
}
具体的代码都在附件中,欢迎各位指导
分享到:
相关推荐
IKAnalyzer是一款专为中文处理设计的开源分词器,它主要应用于搜索引擎、信息检索系统、文本挖掘等领域。这款工具能够高效地对中文文本进行分词,使得计算机可以更好地理解和处理中文信息。IKAnalyzer的名字来源于...
IKAnalyzer是一款开源的、基于Java实现的中文分词工具,它在中文信息处理领域有着广泛的应用。该工具最初由尹军平(IkGuo)开发,设计目标是提供一个轻量级、高效能的中文分词引擎,用于满足各种中文文本分析的需求...
IK Analyzer 是一个开源的,基于 java 语言开发的轻量级的中文分词工具包。从 2006年 12 月推出 1.0 版... 在 2012 版本中,IK 实现了简单的分词歧义排除算法,标志着 IK 分词器从单纯的词典分词向模拟语义分词衍化。
文档内容详细地介绍了IKAnalyzer中文分词器的每一个版本的特性和升级细节,对分词效果进行了示范,并提供了详尽的使用说明,对于希望在Java环境下进行中文文本分词的开发者来说,是一个不可或缺的参考资料。通过IK...
**IK Analyzer中文分词器详解** IK Analyzer是一个在IT领域广泛应用的开源项目,它专注于Java平台上的中文分词处理。中文分词是自然语言处理(NLP)中的基础任务,对于信息检索、文本挖掘、机器翻译等领域至关重要...
IK Analyzer 是一个开源的、基于Java实现的中文分词器,专为全文检索或信息提取等任务设计。它由尹力(Wu Li)在2006年发起,最初是为了改善Lucene的中文处理能力。自那时起,IK Analyzer已经发展成为一个广泛使用的...
这个分词器最初是基于开源项目Lucene的词典分词和文法分析算法开发的,但到了3.0版本之后,IKAnalyzer发展成为了一个独立于Lucene的通用分词组件,并提供了对Lucene的默认优化实现。 IKAnalyzer2012的结构设计采用...
- **IK Analyzer 2012FF_hf1_source.rar**:这是IKAnalyzer 2012版本的源码压缩包,开发人员可以深入研究其内部实现,了解分词算法和逻辑,也可以根据需要进行定制和二次开发。 - **IKAnalyzer2012_u6.zip**:这是...
**IKAnalyzer中文分词器V3.2使用详解** IKAnalyzer是一款开源的、适用于Java环境的中文分词器,主要用于解决在信息检索、文本挖掘等领域中遇到的中文处理问题。这款分词器的设计目标是提高分词的准确率,并且具有...
IKAnalyzer是一款广泛应用于Java环境中的开源中文...通过对IKAnalyzer v3.2.0源码的深入学习,开发者不仅可以提升对中文分词技术的理解,还能为自己的项目提供一个强大的中文处理工具,进一步提高软件的智能化水平。
IK-Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包,也就是可以将一串中文字符分割成一个个的词组或者字词 文件中包含分词工具 ikanalyzer-2012_u6.jar 中文分词配置 IKAnalyzer.cfg..xml
IKAnalyzer继承Lucene的Analyzer抽象类,使用IKAnalyzer和Lucene自带的分析器方法一样,将Analyzer测试代码改为IKAnalyzer测试中文分词效果。 如果使用中文分词器ik-analyzer,就需要在索引和搜索程序中使用一致的...
总的来说,ikanalyzer中文分词支持lucene7.1.0是为了解决旧版ikanalyzer与新Lucene版本的兼容性问题而推出的,它使得开发者能够充分利用Lucene的最新特性,同时保持ikanalyzer的优秀分词性能,对于处理中文内容的...
IKAnalyzer是一款专为Java平台设计的开源中文分词器,主要应用于搜索引擎、信息检索系统以及文本分析等领域。这款工具在中文处理方面具有高效、灵活和易扩展的特点,为开发者提供了强大的支持。 标题中的"IK...
提示:IKAnalyzer中文分词器支持Lucene6.0以上,IKAnalyzer中文分词器支持Lucene6.0以上。
标题 "IKAnalyzer中文分词demo" 指的是一个基于IKAnalyzer的中文分词演示项目。IKAnalyzer是一款开源的、适用于Java平台的全文检索引擎工具,主要功能是对中文文本进行有效的分词处理,广泛应用于搜索引擎、信息检索...
IKAnalyzer非常易用的java分词工具。可以自定义扩展词汇。 这个是一个完整的java项目demo。直接可以用,不用再去google下载了。添加了几个自定义词汇,测试好用。 运行ika.java里的main方法即可
IKAnalyzer是一款专为Lucene设计的高性能中文分词器,其主要目标是提供一个轻量级、高效且可扩展的解决方案,以便在信息检索、文本分析等场景中处理中文文本。这款工具因其易于使用和出色的性能,在开源社区中备受...