Classifier4J是一个轻量级的分类工具,支持贝叶斯分类、向量空间模型、信息摘要等。然而它却不支持中文,异常信息大致如下:

Exception in thread "main" java.util.NoSuchElementException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:813)
at java.util.HashMap$ValueIterator.next(HashMap.java:839)
at java.util.Collections.max(Collections.java:657)

主要原因在于Classifier4J自带的DefaultTokenizer使用正则表达式“\W”进行分词,这种方式对英文还好,因为英文有着天然的分隔符,然而对中文则是不适用的。因而我们需要自己实现Classifier4J对中文的支持,分词工具选用庖丁分词。在包 net.sf.classifier4J中加入以下类:

package net.sf.classifier4J;

import java.io.IOException;
import java.io.StringReader;
import java.util.Vector; import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.TermAttribute; import net.paoding.analysis.analyzer.PaodingAnalyzer; /**
* @author hongyu
*/
public class PaodingTokenizer implements ITokenizer { private Analyzer paoding; public PaodingTokenizer() {
paoding = new PaodingAnalyzer();
} @Override
public String[] tokenize(String input) {
if(input != null) {
StringReader inputReader = new StringReader(input);
TokenStream ts = paoding.tokenStream("", inputReader);
TermAttribute termAtt = (TermAttribute)ts.getAttribute(TermAttribute.class); Vector<String> tokens = new Vector<String>();
try {
while(ts.incrementToken()) {
tokens.add(termAtt.term());
}
return tokens.toArray(new String[0]);
} catch (IOException e) {
return new String[0];
}
} else {
return new String[0];
}
} }

net.sf.classifier4J.Utilities的第二个构造方法修改如下:

    public static Map getWordFrequency(String input, boolean caseSensitive) {
//return getWordFrequency(input, caseSensitive, new DefaultTokenizer(), new DefaultStopWordsProvider());
return getWordFrequency(input, caseSensitive, new PaodingTokenizer(), new DefaultStopWordsProvider());
}

net.sf.classifier4J.vector.VectorClassifier中第一个构造方法第一行做如下修改:

        //tokenizer = new DefaultTokenizer();
tokenizer = new PaodingTokenizer();

另外还有一些其他小的bug:

1,为了能够正确处理查询字符串出现在首部的情况,SimpleClassifier最后一个方法修改如下:

    public double classify(String input) {
if ((input != null) && (input.indexOf(searchWord) >= 0)) {
return 1;
} else {
return 0;
}
}

2,为了能够正确的对中文信息提取摘要,Utilities的getSentences方法修改如下:

    public static String[] getSentences(String input) {
if (input == null) {
return new String[0];
} else {
// split on a ".", a "!", a "?" followed by a space or EOL
//return input.split("(\\.|!|\\?)+(\\s|\\z)");
return input.split("(\\。|\\.|!|\\?)+(\\s|\\z)?");
}
}

3,中文句子一般以句号结尾,因而SimpleSummariser中第122行修改为:

result.append("。");

以下是几个简单的测试类:

1,基本分类器:

public class BasicUsage {

	public static void main(String args[]) throws Exception {

		SimpleClassifier classifier = new SimpleClassifier();
classifier.setSearchWord("中华");
String sentence = "中华人民共和国"; System.out.println("The string '" + sentence +
"' contains the word '中华': " + classifier.isMatch(sentence));
System.out.println("The match rate is: " + classifier.classify(sentence));
} }

运行结果:

The string '中华人民共和国' contains the word '中华': true
The match rate is: 1.0

2,贝叶斯分类器:

public class Bayesian {

	public static void main(String args[]) throws Exception {

		IWordsDataSource wds = new SimpleWordsDataSource();
IClassifier classifier = new BayesianClassifier(wds);
System.out.println( "Matches = " + classifier.classify("中华人民共和国") );
} }

运行结果:

Matches = 0.5

3,信息摘要:

public class Summariser {

	public static void main(String args[]) {

		String input = "中华人民共和国简称中国,位于欧亚大陆东部,太平洋西岸。中国具有五千年的文明史,是世界四大文明古国之一。";
ISummariser summariser = new SimpleSummariser(); String result = summariser.summarise(input, 1);
System.out.println(result);
} }

运行结果:

中华人民共和国简称中国,位于欧亚大陆东部,太平洋西岸。

4,向量空间模型:

public class Vector {

	public static void main(String args[]) throws Exception {
TermVectorStorage storage = new HashMapTermVectorStorage();
VectorClassifier vc = new VectorClassifier(storage); vc.teachMatch("草本","含羞草");
double result = vc.classify("草本", "含羞草");
System.out.println(result);
} }

运行结果:

0.9999999999999998

最后,Classifier4J只定义了英文中的停用词,对于中文而言,庖丁分词的词典中已经包含了停用词。

Classifier4J的中文支持的更多相关文章

  1. CentOS安装中文支持

    部分文档突然成乱码了. 解决方法: 1.安装中文支持包 # yum groupinstall "Chinese Support" 2 修改# /etc/sysconfig/i18n ...

  2. linux环境下安装sphinx中文支持分词搜索(coreseek+mmseg)

     linux环境下安装sphinx中文支持分词搜索(coreseek+mmseg) 2013-11-10 16:51:14 分类: 系统运维 为什么要写这篇文章? 答:通过常规的三大步(./confi ...

  3. 移动开发之浅析cocos2d-x的中文支持问题

    题记:这阵子一直在学习cocos2d-x,其跨平台的特性确实让人舒爽,引擎的框架概念也很成熟,虽然相应的第三方工具略显单薄,但也无愧是一件移动开发的利器啊,有兴趣的朋友有时间就多了解吧. 使用引擎的过 ...

  4. Jupyter Notebook PDF输出的中文支持

    Jupyter Notebook是什么 Jupyter Notebook是ipython Notebook 的升级.Jupyter能够将实时代码,公式,可视化图表以Cell的方式组织在一起,形成一个对 ...

  5. inux 安装中文支持包及中文字符集配置 +i18n

    由于某些原因系统安装时未安装中文支持,导致后续应用出现中文方块乱码现象, 解决方法很简单,当然不是重装,只需以下三步即可搞定. .安装中文包: yum -y groupinstall chinese- ...

  6. linux 安装中文支持包及中文字符集配置

    由于某些原因系统安装时未安装中文支持,导致后续应用出现中文方块乱码现象,解决方法很简单,当然不是重装,只需以下三步即可搞定. 1.安装中文包: #yum -y groupinstall chinese ...

  7. OpenReports中文支持方案

    此文章在<OpenReports中文支持完全解决方案.doc>的基础上做优化,并贴出代码.已测试通过. 一.主要解决的问题 1 页面显示支持中文 2 与服务器或数据库的交互支持中文 3 查 ...

  8. 解决Boost.Regex对中文支持不好的问题

    解决Boost.Regex对中文支持不好的问题 - k.m.Cao - 博客频道 - CSDN.NET 解决Boost.Regex对中文支持不好的问题 k.m.Caov0.1   问题的提出: Boo ...

  9. centos安装中文支持(转)

    安装中文支持包. yum install fonts-chineseyum install fonts-ISO8859-2 -------- 一.安装中文支持方法1.在安装光盘中找到一下包进行安装.r ...

随机推荐

  1. UIDevice通知

    UIDevice通知 UIDevice类提供了一个单例对象,它代表着设备,通过它可以获得一些设备相关的信息,比如电池电量值(batteryLevel).电池状态(batteryState).设备的类型 ...

  2. Servlet的延迟加载和预加载

    我们什么时候使用了延迟加载呢? 先从hibernate引入这个概念吧. hibernate使用lazy属性设置延迟加载,load方法会使用延迟加载. 举个例子: 一个学生有多部手机,如果使用了延迟加载 ...

  3. BZOJ 1556 墓地秘密

    2333333333333333333333333333333333333333333333 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 辣鸡出题人辣鸡出题人辣鸡出题人辣鸡出题人辣鸡 ...

  4. POJ 2369 Permutations

    傻逼图论. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm& ...

  5. USACO 2013 Nov Silver Pogo-Cow

    最近因为闲的蛋疼(停课了),所以开始做一些 USACO 的银组题.被完虐啊 TAT 貌似 Pogo-Cow 这题是 2013 Nov Silver 唯一一道可说的题目? Pogo-Cow Descri ...

  6. 深入学习Heritrix---解析CrawlController(转)

    当我们以Web UI方式使用Heritrix时,点击任务开始(start)按钮时,Heritrix就开始了它的爬取工作.但它的内部 执行流程是怎样的呢?别急,下面将慢慢道来. (一)CrawlJobH ...

  7. 三:分布式事务一致性协议2pc和3pc

    一:分布式一致性协议--->对于一个分布式系统进行架构设计的过程中,往往会在系统的可用性和数据一致性之间进行反复的权衡,于是就产生了一系列的一致性协议.--->长期探索涌现出一大批经典的一 ...

  8. 一天一个Java基础——通过异常处理错误

    <Thinking in Java>上对这章的讲解不少,可见重要性,学习和总结一些主要的记录下来. 一.创建自定义异常 package Exception; class SimpleExc ...

  9. 【转】shell脚本调试(bash trap support bashdb )

    原文网址:http://zhu8337797.blog.163.com/blog/static/170617549201122512712136/ 命 令 选 项 功 能 bash –x 脚本名 回显 ...

  10. openlayers加载地图没有图片时有红叉的解决方法

    解决方式:设置样式隐藏图片 <style type="text/css"> .olImageLoadError { /*ol2.12 onImageLoadError ...