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

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

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

  1. package net.sf.classifier4J;
  2.  
  3. import java.io.IOException;
  4. import java.io.StringReader;
  5. import java.util.Vector;
  6.  
  7. import org.apache.lucene.analysis.Analyzer;
  8. import org.apache.lucene.analysis.TokenStream;
  9. import org.apache.lucene.analysis.tokenattributes.TermAttribute;
  10.  
  11. import net.paoding.analysis.analyzer.PaodingAnalyzer;
  12.  
  13. /**
  14. * @author hongyu
  15. */
  16. public class PaodingTokenizer implements ITokenizer {
  17.  
  18. private Analyzer paoding;
  19.  
  20. public PaodingTokenizer() {
  21. paoding = new PaodingAnalyzer();
  22. }
  23.  
  24. @Override
  25. public String[] tokenize(String input) {
  26. if(input != null) {
  27. StringReader inputReader = new StringReader(input);
  28. TokenStream ts = paoding.tokenStream("", inputReader);
  29. TermAttribute termAtt = (TermAttribute)ts.getAttribute(TermAttribute.class);
  30.  
  31. Vector<String> tokens = new Vector<String>();
  32. try {
  33. while(ts.incrementToken()) {
  34. tokens.add(termAtt.term());
  35. }
  36. return tokens.toArray(new String[0]);
  37. } catch (IOException e) {
  38. return new String[0];
  39. }
  40. } else {
  41. return new String[0];
  42. }
  43. }
  44.  
  45. }

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

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

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

  1. //tokenizer = new DefaultTokenizer();
  2. tokenizer = new PaodingTokenizer();

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

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

  1. public double classify(String input) {
  2. if ((input != null) && (input.indexOf(searchWord) >= 0)) {
  3. return 1;
  4. } else {
  5. return 0;
  6. }
  7. }

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

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

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

  1. result.append("。");

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

1,基本分类器:

  1. public class BasicUsage {
  2.  
  3. public static void main(String args[]) throws Exception {
  4.  
  5. SimpleClassifier classifier = new SimpleClassifier();
  6. classifier.setSearchWord("中华");
  7. String sentence = "中华人民共和国";
  8.  
  9. System.out.println("The string '" + sentence +
  10. "' contains the word '中华': " + classifier.isMatch(sentence));
  11. System.out.println("The match rate is: " + classifier.classify(sentence));
  12. }
  13.  
  14. }

运行结果:

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

2,贝叶斯分类器:

  1. public class Bayesian {
  2.  
  3. public static void main(String args[]) throws Exception {
  4.  
  5. IWordsDataSource wds = new SimpleWordsDataSource();
  6. IClassifier classifier = new BayesianClassifier(wds);
  7. System.out.println( "Matches = " + classifier.classify("中华人民共和国") );
  8. }
  9.  
  10. }

运行结果:

  1. Matches = 0.5

3,信息摘要:

  1. public class Summariser {
  2.  
  3. public static void main(String args[]) {
  4.  
  5. String input = "中华人民共和国简称中国,位于欧亚大陆东部,太平洋西岸。中国具有五千年的文明史,是世界四大文明古国之一。";
  6. ISummariser summariser = new SimpleSummariser();
  7.  
  8. String result = summariser.summarise(input, 1);
  9. System.out.println(result);
  10. }
  11.  
  12. }

运行结果:

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

4,向量空间模型:

  1. public class Vector {
  2.  
  3. public static void main(String args[]) throws Exception {
  4. TermVectorStorage storage = new HashMapTermVectorStorage();
  5. VectorClassifier vc = new VectorClassifier(storage);
  6.  
  7. vc.teachMatch("草本","含羞草");
  8. double result = vc.classify("草本", "含羞草");
  9. System.out.println(result);
  10. }
  11.  
  12. }

运行结果:

  1. 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. hihoCoder #1195 高斯消元·一

    题意:便利店老板为了促销,推出了组合包的形式,将不同数量的各类商品打包成一个组合.比如2袋薯片,1听可乐的组合只要5元,而1袋薯片,2听可乐的组合只要4元.通过询问老板知道:一共有N种不同的商品和M种 ...

  2. Xdebug的安装与使用

    php下搭配使用xdebug是十分好的组合,用于php的调试工作,下面分别介绍之: 1 WINDOWS下的安装   下载站点http://www.xdebug.org/ 要确定使用一个跟你的PHP配合 ...

  3. Android 网络流量监听开源项目-ConnectionClass源码分析

    很多App要做到极致的话,对网络状态的监听是很有必要的,比如在网络差的时候加载质量一般的小图,缩略图,在网络好的时候,加载高清大图,脸书的android 客户端就是这么做的, 当然伟大的脸书也把这部分 ...

  4. Javascript高级程序设计

    根据叶小钗同学的建议,觉得有必要去读读Javascript高级程序设计,不想装B,只想仔细读读,源代码参考. 偶第一个想法,就是去读面向对象和事件那块,不仅关键,而且是薄弱点儿,所以必须去干掉这个短板 ...

  5. Arduino报错

    avrdude: stk500_recv(): programmer is not respondingavrdude: stk500_getsync() attempt 1 of 10: not i ...

  6. explain SQL语句性能检测

    一般用来分析sql语句如何执行,使用了那些键 mysql>explain select * from table;+----+-------------+-------+------+----- ...

  7. Media Player 把光盘中的内容拷贝出来的方法

    http://jingyan.baidu.com/article/cb5d610529f0c1005c2fe0b4.html  这个链接是通过Media  Player 把光盘中的内容拷贝出来的方法h ...

  8. 性能测试之系统监控工具nmon

    一.概述 本篇文章主要讲解nmon,以下为目录 1.nmon介绍 2.nmon下载.安装及使用 3.nmon analysis 分析及使用,各个项的含义 二.详细信息: 1.nmon介绍: nmon( ...

  9. Intent传输数据的补充

    发现用intent的putExtra()或者putExtras()传输的都是基本数据类型. 如果要传输自定义数据类型,就要用到其他方法,老罗介绍的大概有3种: 1.  静态变量 2.  全局变量 3. ...

  10. python中的多线程【转】

    转载自: http://c4fun.cn/blog/2014/05/06/python-threading/ python中关于多线程的操作可以使用thread和threading模块来实现,其中th ...