前段時(shí)間我試著(zhù)在lucene中使用了自動(dòng)分詞技術(shù),有不少朋友都很感興趣。大致方法就是生成自動(dòng)分詞的dll,然后在java中用jni調用。前幾天我整理一下,做了一個(gè)方便使用的jar包,并寫(xiě)了一個(gè)演示的例子和一篇說(shuō)明文檔,以上資料和dll文件還有java源程序可以到我們的網(wǎng)站-新聞收割機下載http://www.newsreaper.info/download/AutoSplit.rar
在使用dll的前提下,在lucene中使用自動(dòng)分詞的方法如下:
建索引時(shí):
1)先調用SplitCaller將要處理的內容進(jìn)行分詞處理。示例代碼如下:(下面的代碼是對RSS文檔進(jìn)行建索引操作)
---RSSDocument.java-------
import com.blogever.RssReader.SplitCaller;
...
...
public static Document makeDocument(ItemIF item) {
Document doc = new Document();
//現在加了自動(dòng)分詞功能
doc.add(Field.Text(TITLE, SplitCaller.splits("將標題進(jìn)行分詞")));
doc.add(Field.Text(CONTENT,SplitCaller.splits("將內容進(jìn)行分詞")));
//下面的內容沒(méi)有分詞
doc.add(new Field("uid", uid(item), false, true, false));
return doc;
}
...
2)使用Analyzer時(shí)注意要使用 WhitespaceAnalyzer 分析器,因為自動(dòng)分詞程序已經(jīng)將文檔進(jìn)行了分詞,并用空格
空開(kāi),此時(shí)只要按空格進(jìn)行解析就行了。如:“將標題進(jìn)行分詞”已經(jīng)分成“將 標題 進(jìn)行 分詞”。
-----ChannelIndexer.java------
...
import org.apache.lucene.analysis.WhitespaceAnalyzer;
...
//其他代碼
...
Analyzer analyzer = new WhitespaceAnalyzer();
...
public void indexItems(boolean createNewIndex, Collection items) throws java.io.IOException
{
ArrayList al = (ArrayList) items;
Collections.sort(al, new ItemComparator());
writer = new IndexWriter(indexDir, analyzer, createNewIndex);
writer.maxFieldLength = 1000000;
...
//其他代碼
...
writer.addDocument(RssDocument.makeDocument(item));
...
writer.optimize();
nrOfIndexedItems = writer.docCount();
writer.close();
logger.info("Finished writing index.");
}
...
3)檢索時(shí),對檢索詞也采用上面同樣的方法即可:
...
Searcher searcher = new IndexSearcher("d:\\NewsSpider\\index");
Analyzer analyzer = new WhitespaceAnalyzer();
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
while (true) {
System.out.print("Query: ");
String line = in.readLine();
if (line.length() == -1)
break;
Query query = QueryParser.parse(SplitCaller.splits(line), "title", analyzer);
System.out.println("Searching for: " + query.toString("title"));
Hits hits = searcher.search(query);
System.out.println(hits.length() + " total matching documents");
...
通過(guò)上面的方法,就可以在lucene中使用自動(dòng)分詞的了。有人也許會(huì )問(wèn)為什么不直接寫(xiě)一個(gè)能自動(dòng)分詞的Analyzer。其實(shí)本來(lái)我想寫(xiě)一個(gè)的,但是我發(fā)現那樣很不方便,還不如先分詞然后再用WhitespaceAnalyzer解析來(lái)得方便。如果有人有更好的辦法,請一定和我探討一下。
- 作者: yuanlang 2005年01月20日, 星期四 18:07
你可以使用這個(gè)鏈接引用該篇日志 http://publishblog.blogdriver.com/blog/tb.b?diaryID=506224


yuanlang,你好,看到你blog上關(guān)于分詞的文章,感覺(jué)太棒了。
我正在做一個(gè)項目需要到這個(gè),能否發(fā)一份給我,太感謝了。
email: wjianj@163.com


http://www.newsreaper.info/download/AutoSplit.rar
下載不了了 能分享下嗎 謝謝 小女子急需得到您的指點(diǎn)
ruirui0370@sina.com.cn


多多聯(lián)系啊 msn:ceo@365a.com
搜索引擎研發(fā)論壇
http://lucene.com.cn


http://www.newsreaper.info/download/AutoSplit.rar
下載不了了 能分享下嗎 謝謝
hcqenjoy # 126.com


我用了一下,效果真不錯,可惜就是沒(méi)有錯誤處理.如果碰上一個(gè)不能切分的情況,會(huì )導致jvm退出


在tomcat下路徑如何配置?
已經(jīng)將dll與data拷貝到bean目錄下,但是只有通過(guò)調節path路徑才能獲得split的處理但是依然找不到data目錄中的字典文件,所以能否舉個(gè)例子說(shuō)明一下,在tomcat中split與data的安放與路徑的配置?

分詞變成一個(gè)一個(gè)單字是因為系統沒(méi)找到data目錄下面的詞典,所以把所有的詞都按單字來(lái)切詞。
原因有很多,是不是你tomcat路徑配置的問(wèn)題?
因為上次也有人出現了和你一樣的情況,老是分詞成一個(gè)一個(gè)單字。后來(lái)?yè)Q了用另一臺機器上的tomcat后就沒(méi)有問(wèn)題了。


把dll和data放到tomcat 的bin目錄下,分詞就會(huì )成了一個(gè)一個(gè)的單字了,為什么?謝謝


在tomcat中調用的話(huà),把dll和data目錄放到tomcat根目錄下的\bin目錄下就行了。


我想問(wèn)一下我怎么在網(wǎng)頁(yè)里面加不分詞功能阿??!我用的tomcat,在控制臺運行能正常分詞,放在tomcat中調用,老是不成功??偸欠殖梢粋€(gè)一個(gè)單字了。這是為什么??????
能不能詳細的講講在tomcat中如何配置??!


兄弟,split.dll是jni生成的,好像只能用java調用,能生成一個(gè)com版本么?多謝!

項目最近上線(xiàn)完成,只是有些小問(wèn)題,加上我們新手解決不了大問(wèn)題,所以就不是很忙了。2月4號最后一天上班,好好休息一下,明年繼續努力:)聽(tīng)說(shuō)你和蟲(chóng)蟲(chóng)都可能要過(guò)來(lái)的,呵呵,那時(shí)候咱們董門(mén)在深圳人就多了

:-)
是啊,比較忙呀,找工作呀,雜七雜八的事很多。
你們忙不忙,什么時(shí)候放假?
說(shuō)不定明年我們就都去深圳找你了。

呵呵,好久沒(méi)有見(jiàn)你出現了,上次聽(tīng)ddo說(shuō)你和曉陽(yáng)現在都很忙的說(shuō)。
聯(lián)系客服