使用“庖丁解牛”进行中文分词


#Java 笔记


2014-11-26

作为一款分词工具,“庖丁解牛”(Paoding Analysis)为lucene设计,其官方网站是https://code.google.com/p/paoding/。下面看一看如何用它来分词。

需要的jar

https://code.google.com/p/paoding/下载paoding-analysis-2.0.4-beta.zip,解压后移动到/home/letian/paoding-analysis-2.0.4-beta

Lucene当前版本是4.*,不过对于“庖丁解牛”,建议使用2.*系列的版本,我是在Download lucene-core-2.9.3.jar下载的Download lucene-core-2.9.3.jar。

在apache 官网下载commons-logging-1.2.jar。

创建项目并引入jar

在eclipse下创建项目Fenci,之后,引入paoding-analysis.jarlucene-core-2.9.3.jarcommons-logging-1.2.jar

代码

创建文件PaoDingFenci.java,内容如下:

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.apache.lucene.analysis.tokenattributes.TermAttribute;

import net.paoding.analysis.analyzer.PaodingAnalyzer;

public class PaoDingFenci {

	Analyzer analyzer = new PaodingAnalyzer();

	public PaoDingFenci() {
		//
	}

	public String fenci01(String text) throws IOException {
		StringBuffer sb = new StringBuffer();
		StringReader reader = new StringReader(text);
		TokenStream ts = this.analyzer.tokenStream(text, reader);

		TermAttribute termAtt = (TermAttribute) ts
				.addAttribute(TermAttribute.class);
		while (ts.incrementToken()) {
			sb.append(termAtt.term());
			sb.append(" ");
		}
		return sb.toString();
	}

	public String fenci02(String text) throws IOException {
		StringBuffer sb = new StringBuffer();
		StringReader reader = new StringReader(text);
		TokenStream ts = this.analyzer.tokenStream(text, reader);

		Token t;
		t = ts.next();
		while (t != null) {
			sb.append(t.termText());
			sb.append(" ");
			t = ts.next();
		}
		return sb.toString();
	}
}

方法fenci01fenci02都可以拿来用,不过fenci02中的ts.next()t.termText()是被弃用的。

创建文件FenciMain.java,内容如下:

import java.io.IOException;

public class FenciMain {
	public static void main(String[] args) throws IOException {
		PaoDingFenci pd = new PaoDingFenci();
		String text = "自己翻译的官方文档,需要的人可以参考一下,有翻译错误还请指正。 \nHello world";
		System.out.println(pd.fenci01(text));
		System.out.println(pd.fenci02(text));
	}
}

然后建立文件paoding-dic-home.properties,内容如下:

# values are "system-env" or "this";
# if value is "this" , using the paoding.dic.home as dicHome if configed!
paoding.dic.home.config-fisrt=this

# dictionary home (directory)
# "classpath:xxx" means dictionary home is in classpath.
# e.g "classpath:dic" means dictionaries are in "classes/dic" directory or any other classpath directory
paoding.dic.home=/home/letian/paoding-analysis-2.0.4-beta/dic

# seconds for dic modification detection
# paoding.dic.detector.interval=60

运行FenciMain.java,结果如下:

翻译 官方 文档 需要 要的 的人 参考 一下 翻译 译错 错误 还请 指正 hello world 
翻译 官方 文档 需要 要的 的人 参考 一下 翻译 译错 错误 还请 指正 hello world 

两种分词模式

默认模式是most-words。 文件FenciMain2.java

import java.io.IOException;

public class FenciMain2 {
	public static void main(String[] args) throws IOException {
		PaoDingFenci pd = new PaoDingFenci();
		String text = "中华人民共和国";
		System.out.println(pd.fenci01(text));
	}
}

结果如下:

中华 华人 人民 共和 共和国 

在项目中添加paoding-analyzer.properties文件,内容如下:

# PaodingAnlyzer Mode, "most-words", "max-word-length", "class:com.xxx.MyTokenCollectorImpl"...

paoding.analyzer.mode=most-words
paoding.analyzer.dictionaries.compiler=net.paoding.analysis.analyzer.impl.MostWordsModeDictionariesCompiler

# paoding.analyzer.mode=max-word-length
# paoding.analyzer.dictionaries.compiler=net.paoding.analysis.analyzer.impl.SortingDictionariesCompiler

上面的配置代表启用most-words模式,FenciMain2.java运行结果如下:

中华 华人 人民 共和 共和国 

修改paoding-analyzer.properties文件,启用max-word-length模式:

# PaodingAnlyzer Mode, "most-words", "max-word-length", "class:com.xxx.MyTokenCollectorImpl"...

# paoding.analyzer.mode=most-words
# paoding.analyzer.dictionaries.compiler=net.paoding.analysis.analyzer.impl.MostWordsModeDictionariesCompiler

paoding.analyzer.mode=max-word-length
paoding.analyzer.dictionaries.compiler=net.paoding.analysis.analyzer.impl.SortingDictionariesCompiler

注意,“max-word-length”等的后面不要有空格,否则会出现下面的错误:

java.lang.IllegalArgumentException: 不合法的分析器Mode参数设置:max-word-length  

最后一行"net.paoding.analysis.analyzer.impl.SortingDictionariesCompiler"的后面也不要有空格,否则会出现下面的错误:

java.lang.ClassNotFoundException: net.paoding.analysis.analyzer.impl.SortingDictionariesCompiler  

FenciMain2.java运行结果如下:

中华人民共和国 

下面这段文字:

互联网安全事件层出不穷,用户每时每刻都有可能会遭受攻击者袭击。

most-words模式分词结果如下:

互联 联网 安全 事件 层出 层出不穷 用户 每时 每刻 都有 可能 有可能 可能会 遭受 攻击 攻击者 袭击 

max-word-length模式分词结果如下:

互联网 安全 事件 层出不穷 用户 每时每刻 都有 有可能 可能会 遭受 攻击者 袭击

该工具作者的博客

Qieqie

遇到的问题

运行时出现下面的错误:

Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory

原因:没有引入commons-logging-1.2.jar



( 本文完 )