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.jar
、lucene-core-2.9.3.jar
、commons-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();
}
}
方法fenci01
和fenci02
都可以拿来用,不过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
模式分词结果如下:
互联网 安全 事件 层出不穷 用户 每时每刻 都有 有可能 可能会 遭受 攻击者 袭击
该工具作者的博客
遇到的问题
运行时出现下面的错误:
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
原因:没有引入commons-logging-1.2.jar
。