庖丁中文分词库是一个使用Java开发的,可结合到Lucene应用中的,为互联网、企业内部网使用的中文搜索引擎分词组件。Paoding填补了国内中文分词方面开源组件的空白,致力于此并希翼成为互联网网站首选的中文分词开源组件。 Paoding中文分词追求分词的高效率和用户良好体验。
Paoding's Knives 中文分词具有极 高效率 和 高扩展性 。
引入隐喻,采用完全的面向对象设计,构思先进。
高效率:在PIII 1G内存个人机器上,1秒 可准确分词 100万 汉字。
采用基于 不限制个数 的词典文件对文章进行有效切分,使能够将对词汇分类定义。
能够对未知的词汇进行合理解析。
缺点:官网:http://code.google.com/p/paoding/作者很早已不更新,跟不上Lucene的更新,可以找到支持Lucene4.8.*的Link: https://github.com/cslinmiso/paoding-analysis
一、下载Lucene(http://mirrors.cnnic.cn/apache/lucene/java/4.8.1/lucene-4.8.1.zip),下载后解压,Lucene所需要的基本jar文件如下列表:
lucene-core-4.8.1.jar Lucene核心jar
lucene-analyzers-4.8.1.jar Lucene分词jar
lucene-highlighter-4.8.1.jar Lucene高亮显示jar
二、由于Lucene中的中文分词实现不了我们所需要的功能,所以,需要下载第三方包(疱丁解牛)
(1)下载支持Lucene4.8.*的Link: https://github.com/cslinmiso/paoding-analysis
(2)修改pom.xml编译引用lib包lucene-4.8.1
(3)mvn package
(4) 找到Lucene使用'疱丁'所需要的jar文件如下列表:
paoding-analysis.jar Lucene针对中文分词需要jar
commons-logging.jar 日志文件
{PADODING_HOME}/dic 疱丁解牛词典目录(PAODING_HOME:代表解压后的paoding目录)
三、打开Eclipse并创建一个Java Project(项目名称和项目所在的路径不能包含空格),本例中Project Name:Paoding
1_1:在Paoding Project 创建一个Folder--lib(用于存放所有的jar),把前面所说的jar文件拷贝到lib目录下,并把lib下所有的jar添加到项目ClassPath下.
1_2:拷贝{PAODING_HOME}/dic目录 至 Paoding项目/src下整个项目结构图如下:
四、创建TestFileIndex.java类,实现功能是:把./data/*.txt所有文件读入内存中,并写入索引目录(./luceneindex)下
TestFileIndex.java
package com.wugang.paoding.index;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import net.paoding.analysis.analyzer.PaodingAnalyzer;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class TestFileIndex {
public static void main(String[] args) throws Exception {
String dataDir="data";
String indexDir="luceneindex";
File[] files=new File(dataDir).listFiles();
System.out.println(files.length);
Analyzer analyzer=new PaodingAnalyzer();
Directory dir=FSDirectory.open(new File(indexDir));
IndexWriter writer=new IndexWriter(dir, new IndexWriterConfig(Version.LUCENE_48,analyzer));
for(int i=0;i<files.length;i++){
StringBuffer strBuffer=new StringBuffer();
String line="";
FileInputStream is=new FileInputStream(files[i].getCanonicalPath());
BufferedReader reader=new BufferedReader(new InputStreamReader(is,"utf8"));
line=reader.readLine();
while(line != null){
strBuffer.append(line);
strBuffer.append("\n");
line=reader.readLine();
}
Document doc=new Document();
doc.add(new Field("fileName", files[i].getName(), Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("contents", strBuffer.toString(), Field.Store.YES, Field.Index.ANALYZED));
writer.addDocument(doc);
reader.close();
is.close();
}
writer.commit();
writer.close();
dir.close();
System.out.println("ok");
}
}
五、创建TestFileSearcher.java,实现在的功能是:读取索引中的内容:
TestFileSearcerh.java
package com.wugang.paoding.index;
import java.io.File;
import java.io.StringReader;
import java.util.Set;
import net.paoding.analysis.analyzer.PaodingAnalyzer;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.util.AttributeImpl;
public class TestFileSearcher {
public static void main(String[] args) throws Exception {
String indexDir = "luceneindex";
Analyzer analyzer = new PaodingAnalyzer();
String search_text = "六小龄童的眼睛和耳朵变成小和尚";
StringReader reader = new StringReader(search_text);
TokenStream ts = analyzer.tokenStream(search_text, reader);
boolean hasnext = ts.incrementToken();
while (hasnext) {
CharTermAttribute ta = ts.getAttribute(CharTermAttribute.class);
System.out.print(ta.toString() + " ");
hasnext = ts.incrementToken();
}
ts.close();
Directory dir = FSDirectory.open(new File(indexDir));
DirectoryReader dr = DirectoryReader.open(dir);
IndexSearcher searcher = new IndexSearcher(dr);
QueryParser parser = new QueryParser(Version.LUCENE_48, "contents",
analyzer);
Query query = parser.parse(search_text);
//Term term=new Term("contents", search_text);
//TermQuery query=new TermQuery(term);
System.out.println("\n"+ query.toString());
TopDocs docs = searcher.search(query, 1000);
ScoreDoc[] hits = docs.scoreDocs;
System.out.println(hits.length);
for (int i = 0; i < hits.length; i++) {
Document doc = searcher.doc(hits[i].doc);
System.out.print(doc.get("fileName") + "--:\n");
System.out.println(doc.get("contents") + "\n");
}
// searcher.close();
dir.close();
}
}