中文分词工具
当前几个主要的Lucene中文分词器的比较 (ZZ)
1. 基本介绍:
paoding :Lucene中文分词“庖丁解牛” Paoding Analysis
imdict :imdict智能词典所采用的智能中文分词程序
mmseg4j : 用 Chih-Hao Tsai 的 MMSeg 算法 实现的中文分词器
ik :采用了特有的“正向迭代最细粒度切分算法“,多子处理器分析模式
2. 开发者及开发活跃度:
paoding :qieqie.wang, google code 上最后一次代码提交:2008-06-12,svn 版本号 132 imdict :XiaoPingGao, 进入了 lucene contribute,lucene trunk 中 contrib/analyzers/smartcn/ 最后一次提交:2009-07-24,
mmseg4j :chenlb2008,google code 中 2009-08-03 (昨天),版本号 57,log为:mmseg4j-1.7 创建分支
ik :linliangyi2005,google code 中 2009-07-31,版本号 41
3. 用户自定义词库:
paoding :支持不限制个数的用户自定义词库,纯文本格式,一行一词,使用后台线程检测词库的更新,自动编译更新过的词库到二进制版本,并加载
imdict :暂时不支持用户自定义词库。但 原版 ICTCLAS 支持。支持用户自定义 stop words mmseg4j :自带sogou词库,支持名为 wordsxxx.dic, utf8文本格式的用户自定义词库,一行一词。不支持自动检测。 -Dmmseg.dic.path
ik :支持api级的用户词库加载,和配置级的词库文件指定,无 BOM 的 UTF-8 编码, 分割。不支持自动检测。
4. 速度(基于官方介绍,非自己测试)
paoding :在PIII 1G内存个人机器上,1秒 可准确分词 100万 汉字
imdict :483.64 (字节/秒),259517(汉字/秒)
mmseg4j : complex 1200kb/s左右, simple 1900kb/s左右
ik :具有50万字/秒的高速处理能力
5. 算法和代码复杂度
paoding :svn src 目录一共1.3M,6个properties文件,48个java文件,6895 行。使用不用的 Knife 切不同类型的流,不算很复杂。
imdict :词库 6.7M(这个词库是必须的),src 目录 152k,20个java文件,2399行。使用 ICTCLAS HHMM隐马尔科夫模型,“利用大量语料库的训练来统计汉语词汇的词频和跳转概率,从而根据这些统计结果对整个汉语句子计算最似然(likelihood)的切分”
mmseg4j : svn src 目录一共 132k,23个java文件,2089行。MMSeg 算法 ,有点复杂。 ik : svn src 目录一共6.6M(词典文件也在里面),22个java文件,4217行。多子处理器分析,跟paoding类似,歧义分析算法还没有弄明白。
6. 文档
paoding :几乎无。代码里有一些注释,但因为实现比较复杂,读代码还是有一些难度的。 imdict : 几乎无。 ICTCLAS 也没有详细的文档,HHMM隐马尔科夫模型的数学性太强,不太好理解。
mmseg4j : MMSeg 算法 是英文的,但原理比较简单。实现也比较清晰。
ik :有一个pdf使用手册,里面有使用示例和配置说明。
7. 其它
paoding :引入隐喻,设计比较合理。search 1.0 版本就用的这个。主要优势在于原生支持词库更新检测。主要劣势为作者已经不更新甚至不维护了。
imdict :进入了 lucene trunk,原版 ictclas 在各种评测中都有不错的表现,有坚实的理论基础,不是个人山寨。缺点为暂时不支持用户词库。
mmseg4j :在complex基础上实现了最多分词(max-word),但是还不成熟,还有很多需要改进的地方。
ik :针对Lucene全文检索优化的查询分析器IKQueryParser
8. 结论
个人觉得,可以在 mmseg4j 和 paoding 中选一个。关于这两个分词效果的对比,可以参考:
或者自己再包装一下,将 paoding 的词库更新检测做一个单独的模块实现,然后就可以在所有基于词库的分词算法之间无缝切换了。
ps,对不同的 field 使用不同的分词器是一个可以考虑的方法。比如 tag 字段,就应该使用一个最简单的分词器,按空格分词就可以了。
==============================以上部分为网上转载=============================
Paoding 的具体使用:
最新版本JAR包在Lucene3.0下会报错,直接使用Lucene2.9.4即可。另外其论坛说也可以直接使用源码编译。
字典的添加:添加新字典,需删除dic文件夹下.compiled文件,重新编译。
http:///posts/list/344.page
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.DateTools;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.mira.lucene.analysis.IK_CAnalyzer;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.FileReader;
import java.util.Date;
public class Searcher {
private static String INDEX_DIR = Searcher.class.getResource("/").getPath()+"/data/index";//"c:luceneindex";
private static String DOC_DIR =Searcher.class.getResource("/").getPath();//"c:lucenedoc";public static void main(String[] args) throws Exception {String queryString;
queryString = "²âÊÔ";
File indexDir = new File(INDEX_DIR);
File docDir = new File(DOC_DIR);
Date start = new Date();
//±ØÐëÏȽ¨Ë÷Òý
try {
IndexWriter writer = new IndexWriter(INDEX_DIR, new IK_CAnalyzer(), true);
System.out.println("Indexing to directory + INDEX_DIR + ...");
indexDocs(writer, docDir);
System.out.println("Optimizing...");
writer.optimize();
writer.close();
Date end = new Date();
System.out.println(end.getTime()start) + "milliseconds) that matched query" + q + ":");
for (int i = 0; i < hits.length(); i++) {
Document doc = hits.doc(i); // ¢Ü µÃµ½Æ¥ÅäµÄÎĵµSystem.out.println("file: " + doc.get("path"));}
}
}
讓 Nutch 支援中文分詞 方法教學Nutch 1.0 + IK-Analyzer 3.1.6 中文分詞庫
1. 前言
2. 何謂中文分詞
3. 方法
1. 修改程式碼
2. 重編 nutch
3. 開始使用
4. 完成
1. 選項:加入字典檔
2. 資訊不正確或麻煩
前言
Nutch 1.0 + IK-Analyzer 3.1.6 中文分詞庫 的詳細方法 本篇參考 ,並且修正與補充 何謂中文分詞
中文自動分詞指的是使用計算機自動對中文文本進行詞語的切分,即像英文那樣使得中文句子中的詞之間有空格以標識。中文自動分詞被認為是中文自然語言處理中的一個最基本的環節。
簡單來說,以"今天天氣真好"這段字而言,若搜尋"氣真"沒有中文分詞的結果為:1筆 => 今天天氣真好
有中文分詞:0筆 (因為詞庫為今天、天天、天氣、真、真好、好) 下面的例子即為,透過完成括充中文分詞(ik-analyzer)之後的nutch搜尋引擎,對"國家高速網路中心"的首頁(http://.tw/tw/) 作資料爬取,並以此為搜尋資料庫。
搜尋"中心"兩字 有74筆資料,但搜尋單一一個"心"字只有 4筆資料;反觀若是沒有經過中文分詞,則單搜尋"心"必定比搜尋"中心"的資料更多
1. 搜尋 中心 這個字串
2. 單搜尋 心 這個字
3. 搜尋 "冀此" 或單獨 "冀" 都沒有資料
ps : 搜尋"希冀"才會有資料
方法
你下載nutch-1.0 並解壓縮的資料如:$nutch-1.0/夾目錄位址,也是用來重編nutch的/home/user/nutch-1.0/資料夾原有的nutch資料夾,接著會被擴充$my_nutch_dir/opt/nutchez/nutch/ika中文詞庫
原本被用來放nutch網頁(在tomcat$my_tomcat_dir/opt/nutchez/tomcat內)的資料夾
修改程式碼
安裝必要工具(java 已經安裝)
sudo apt-get install javacc unrar ant
修改NutchAnalysis.jj 約130行左右的程式碼 (原本為:|
>)
cd $nutch-1.0/
vim src/java/org/apache/nutch/analysis/NutchAnalysis.jj
| )+ >
用編譯器 javacc 編譯出七個java檔
CharStream.javaNutchAnalysisTokenManager.java
TokenMgrError.java
NutchAnalysisConstants.javaParseException.java NutchAnalysis.javaToken.java
cd $nutch-1.0/src/java/org/apache/nutch/analysis
javacc -OUTPUT_DIRECTORY=./ika/ NutchAnalysis.jj
mv ./ika/* ./ ; rm -rf ./ika/
編譯剛編出來的 .java
vim $nutch-1.0/src/java/org/apache/nutch/analysis/NutchAnalysis.java 在第48行加入ParseException:
public static Query parseQuery(String queryString, Configuration conf) throws IOException,ParseException
在第54行加入ParseException:
throws IOException,ParseException {
下載 IKAnalyzer3.1.6GA.jar 解壓縮
o nutch 1.0 用的是 lucene 2.4.0 hadoop 0.19
o 因此ik分詞器最新僅能用 3.1.6ga (3.2.0GA 以上版本只支援
lucene 2.9以上版本)
cd $nutch-1.0/
wget http://ik-analyzer.googlecode.com/files/IKAnalyzer3.1.6GA_AllInOne.rar mkdir ika
unrar x ./IKAnalyzer3.1.6GA_AllInOne.rar ika/
分別放到以下三個資料夾
用來重新編譯nutch
用來給 nutch 進行 crawl時所匯
入函式庫$nutch-1.0/lib/$my_nutch_dir/lib/
用來給網頁的搜尋介面使用的函$my_tomcat_dir/webapps/ROOT/WEB-INF/lib式庫
cp ika/IKAnalyzer3.1.6GA.jar lib/
cp $nutch-1.0/lib/IKAnalyzer3.1.6GA.jar $my_nutch_dir/lib/ cp $nutch-1.0/lib/IKAnalyzer3.1.6GA.jar
$my_tomcat_dir/webapps/ROOT/WEB-INF/lib 修改 NutchDocumentAnalyzer.java 程式碼
cd $nutch-1.0/
vim src/java/org/apache/nutch/analysis/NutchDocumentAnalyzer.java 將
public TokenStream tokenStream(String fieldName, Reader reader) {Analyzer analyzer;
if ("anchor".equals(fieldName))
analyzer = ANCHOR_ANALYZER;
else
analyzer = CONTENT_ANALYZER;
return analyzer.tokenStream(fieldName, reader);
}
修改成
public TokenStream tokenStream(String fieldName, Reader reader) {Analyzer analyzer = new org.wltea.analyzer.lucene.IKAnalyzer();return analyzer.tokenStream(fieldName, reader);
}
修改 build.xml,在 下(約195行),
加入
cd $nutch-1.0/
vim build.xml
重編 nutch
重新編譯 nutch-1.0
ant
完成則多一個資料夾 build,
o build/ 目錄裡面的 nutch-job-1.0.job 就是重編後的核心
ant jar; ant war
分別產生 build/nutch-xxx.jar 與 build/nutch-xxx.war
開始使用
最後,將nutch-job-1.0.jar複製到我的nutchez資料夾內取代使用
o (下面的步驟小心的把原本的job作備份,也可以不用,改用新編
出來的直接取代)
cd $nutch-1.0/
mv $my_nutch_dir/nutch-1.0.job $my_nutch_dir/nutch-1.0-ori.job
cp build/nutch-1.0.job $my_nutch_dir/nutch-1.0-ika-waue-100715.job ln -sf $my_nutch_dir/nutch-1.0-ika-waue-100715.job
$my_nutch_dir/nutch-1.0.job
把nutch-1.0.war(原本nutch附的即可),解壓縮後放在你的tomcat
目錄內(以下用 $my_tomcat_dir 代表我tomcat的實際目錄)的
/webapps/ROOT/中,並且再把"IKAnalyzer3.1.6GA.jar"、新編的
"nutch-1.0.jar" 放進 $my_tomcat_dir/webapps/ROOT/WEB-INF/lib 還有 $my_nutch_dir/lib/ 內
cd $nutch-1.0/
cp $nutch-1.0/build/ $my_nutch_dir/lib/
cd $my_tomcat_dir/webapps/ROOT/WEB-INF/lib
cp $nutch-1.0/build/nutch-1.0.jar ./
cp $nutch-1.0/lib/IKAnalyzer3.1.6GA.jar ./ 最後用nutch 的 crawl 抓取網頁,搜索的結果就是按ik分過的中文詞完成
爬取後的資料就會依照中文分詞來分。中文分詞之後的結果並不會比較多,反而更少。但是精簡過後的搜尋結果
才能提供更準確的搜尋內容。
選項:加入字典檔
將 nutch-*.job 的檔案,用zip 工具解開,並將以下兩個檔案放入nutch-*.job 中即可
IKAnalyzer.cfg.xmlIK Analyzer/mydic.dic mydic.doc
國家高速
國家高速網路
國家高速網路與計算中心
資訊不正確或麻煩
接著將 build/classes 內的程式碼打包起來,建立nutch-1.0-ika.jar 函式庫 (麻煩,根本不需要)
cd $nutch-1.0/build/classes
jar cvf nutch-1.0-ika.jar .
cp nutch-1.0-ika.jar /opt/nutchez/nutch/lib/ 即使用原始的nutch所crawl下來的資料,將 重編後的nutch-1.0.jar nutch-1.0.job IKAnalyzer3.1.6 正確放到你原本的nutch搜尋網頁中,重新啟動tomcat後,也可直接享用有分詞的結果 (不正確)
將 IKAnalyzer3.1.6GA.jar 的 /org/wltea/analyzer/dic/ 資料夾內 ,放入你要得字典檔,可以參考同資料夾內的 main.dic (不正確,沒用) Attachments
(162.6 kB)added by waueago.(13.7 kB)added by waueago. Download in other formats:
推荐阅读:
中文分词工具java05-07
浅谈中文分词技术11-04
中文分词程序(精选5篇)12-15
中文期刊类检索工具(精选6篇)07-21
现在分词和过去分词做状语的用法比较09-12
考研中文自我介绍(推荐6篇)08-15
中文自我介绍面试(推荐6篇)09-13
求职自我介绍中文(精选6篇)04-15
护士中文自我介绍(通用6篇)04-30
面试中文自我介绍(精选6篇)05-30