??? 說(shuō)到Nutch中要使用中文分詞,因?yàn)橹形姆衷~程序的速度很快,需要分詞的每篇文章字?jǐn)?shù)不會(huì)達(dá)到需要占用其很長(zhǎng)時(shí)間的程度。因此,對(duì)于每篇文章分詞的請(qǐng)求可以看作是大量短小線程的請(qǐng)求,此時(shí)使用線程池技術(shù)是非常合適的,它可以極大減小線程的創(chuàng)建和銷毀次數(shù),提高程序的工作效率。
??? 一個(gè)比較簡(jiǎn)單的線程池應(yīng)該包含線程管理器、工作線程、任務(wù)隊(duì)列以及任務(wù)接口。下面結(jié)合分詞程序來(lái)說(shuō)說(shuō)如何在分詞中使用線程池:
??? ??? ThreadPool 是我們的線程池管理器,其中含有任務(wù)隊(duì)列、
??? ??? Request 是任務(wù)接口、
??? ??? ChineseTokenizer 是中文分詞程序,具體的任務(wù)類,它實(shí)現(xiàn)了Request接口、
??? ??? WorkThread 實(shí)現(xiàn)了Java的Runnable接口,其中run()方法會(huì)獲取線程池中的任務(wù)請(qǐng)求,并調(diào)用ChineseTokenizer 類中的 tokenize()方法,來(lái)完成分詞工作。

如下是接口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()方法中會(huì)有:
?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 會(huì)使用到 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?{
???????
???????
???????
//對(duì)每一種情況進(jìn)行一次詞語(yǔ)組合,生成一個(gè)Lucene的Token
???????Token?token?=?new?Token(currentWordStringBuffer.toString(),
????????????outLineStringBuffer.length(),?outLineStringBuffer.length()?
+?outLineStringBuffer.length(),?????????????tokenType);
???????
????}
}

??? 現(xiàn)在的ChineseTokenizer 類中只實(shí)現(xiàn)了,初步的字典匹配分詞方法,但是對(duì)于普通的垂直搜索方面的應(yīng)用已經(jīng)足夠了,特定領(lǐng)域的詞匯比較固定,而且歧義很少出現(xiàn),分析網(wǎng)絡(luò)上文章中特定詞語(yǔ)出現(xiàn)的概率,達(dá)到閾值之后就可以把這篇文章收錄到本地磁盤中了:)






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

  • 非商業(yè)用途:你不可將當(dāng)前作品用于商業(yè)目的。

  • 禁止派生:你不可更改、轉(zhuǎn)變或者基于此作品重新構(gòu)造為新作品。

對(duì)于任何二次使用或分發(fā),你必須讓其他人明確當(dāng)前作品的授權(quán)條款。

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