??? 說到Nutch中要使用中文分詞,因為中文分詞程序的速度很快,需要分詞的每篇文章字數不會達到需要占用其很長時間的程度。因此,對于每篇文章分詞的請求可以看作是大量短小線程的請求,此時使用線程池技術是非常合適的,它可以極大減小線程的創建和銷毀次數,提高程序的工作效率。
??? 一個比較簡單的線程池應該包含線程管理器、工作線程、任務隊列以及任務接口。下面結合分詞程序來說說如何在分詞中使用線程池:
??? ??? ThreadPool 是我們的線程池管理器,其中含有任務隊列、
??? ??? Request 是任務接口、
??? ??? ChineseTokenizer 是中文分詞程序,具體的任務類,它實現了Request接口、
??? ??? WorkThread 實現了Java的Runnable接口,其中run()方法會獲取線程池中的任務請求,并調用ChineseTokenizer 類中的 tokenize()方法,來完成分詞工作。
如下是接口Request的示例:
1?package?cn.ac.cintcm.threadpool;
2?
3?import?java.io.IOException;
4?
5?public?interface?Request?{
6?????public?void?tokenize()?throws?IOException;
7?}
WorkThread 中的run()方法中會有:
?1?synchronized?(pool.taskList)?{
?2?????????????????????????//?got?a?task
?3?????????????????????????if?(pool.taskList.size()?>?0)?{
?4?????????????????????????????pool.freeNum--;
?5?????????????????????????????pool.workingNum++;
?6?????????????????????????????request?=?pool.taskList.removeFirst();
?7?????????????????????????????try?{
?8?????????????????????????????????request.tokenize();
?9?????????????????????????????}?catch?(IOException?e)?{
10?????????????????????????????????e.printStackTrace();
11?????????????????????????????}
12?????????????????????????????pool.taskList.notifyAll();
13?????????????????????????????break;
14?????????????????????????}
15?????????????????????????//?wait?for?task
16?????????????????????????else
17?????????????????????????????pool.taskList.wait();
18?????????????????????}
ChineseTokenizer 會使用到 Lucene的Token類
??? ??
import java.io.*;
import java.util.*;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.nutch.searcher.Query;
public?class?ChineseTokenizer?extends?Tokenizer?implements?Request?{
????public?void?tokenize()?throws?IOException?{
???????

???????

???????//對每一種情況進行一次詞語組合,生成一個Lucene的Token
???????Token?token?=?new?Token(currentWordStringBuffer.toString(),
????????????outLineStringBuffer.length(),?outLineStringBuffer.length()?+?outLineStringBuffer.length(),?????????????tokenType);
???????

????}
} ??? 現在的ChineseTokenizer 類中只實現了,初步的字典匹配分詞方法,但是對于普通的垂直搜索方面的應用已經足夠了,特定領域的詞匯比較固定,而且歧義很少出現,分析網絡上文章中特定詞語出現的概率,達到閾值之后就可以把這篇文章收錄到本地磁盤中了:)
??? 本文依據《創作共用約定》之“署名
-禁止派生
-非商業用途”方式發布,即你可以免費拷貝、分發、呈現和表演當前作品,但是必須基于以下條款:
對于任何二次使用或分發,你必須讓其他人明確當前作品的授權條款。
在得到作者的明確允許下,這里的某些條款可以放棄。