??? 說到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 類中只實現了,初步的字典匹配分詞方法,但是對于普通的垂直搜索方面的應用已經足夠了,特定領域的詞匯比較固定,而且歧義很少出現,分析網絡上文章中特定詞語出現的概率,達到閾值之后就可以把這篇文章收錄到本地磁盤中了:)






??? 本文依據《創作共用約定》之“署名-禁止派生-非商業用途”方式發布,即你可以免費拷貝、分發、呈現和表演當前作品,但是必須基于以下條款:
  • 署名:你必須明確標明作者的名字。

  • 非商業用途:你不可將當前作品用于商業目的。

  • 禁止派生:你不可更改、轉變或者基于此作品重新構造為新作品。

對于任何二次使用或分發,你必須讓其他人明確當前作品的授權條款。

在得到作者的明確允許下,這里的某些條款可以放棄。