首先宣告:我對lucene.net並不熟悉,但搜尋確實是分詞的乙個重要應用,所以這裡還是嘗試將兩者整合起來,也許對你有一參考。
看到了兩個中文分詞與lucene.net的整合專案:lucene.net.analysis.pangu和lucene.net.analysis.mmseg,參考其中的**實現了最簡單的整合:jiebaforlucenenet。下面給出簡單的介紹。
主要的整合點是自定義乙個tokenizer的子類,此時必須要實現它的抽象方法incrementtoken,該方法用於對文字流中的文字生成的token進行遍歷,這正是分詞元件發揮作用的地方。
publictermatt和offsetatt所在的兩行**需要用到每乙個token的詞本身、起始索引和終止索引,而這三個值恰好是jiebasegmenter.tokenize方法所實現的,所以只要在初始化jiebatokenizer時使用:override
bool
incrementtoken()
end();
return
false
;}
tokens = segmenter.tokenize(text, tokenizermode.search).tolist();就可以得到所有分詞所得的token,另外tokenizermode.search引數使得tokenize方法的結果中包含更全面的分詞結果,比如「語言學家」會得到四個token,即「[語言, (0, 2)], [學家, (2, 4)], [語言學, (0, 3)], [語言學家, (0, 4)]」,這在建立索引和搜尋時都很有幫助。
tokenizer類實現分詞,而新增索引和搜尋需要的是analyzer,jiebaanalyzer只要呼叫jiebatokenizer即可。
public除了jiebatokenizer,jiebaanalyzer還會用到lowercasefilter和stopfilter。前者可將索引和搜尋的內容正則化,忽略大小寫,後者則過濾掉停用詞。這裡使用的停用詞列表合併了nltk的英文停用詞和哈工大的中文停用詞。override tokenstream tokenstream(string
fieldname, textreader reader)
建立索引時,indexwriter要使用jiebaanalyzer的例項:
var analyzer = new搜尋的時候,先將使用者的輸入分詞:jiebaanalyzer();
using (var writer = new
indexwriter(directory, analyzer, indexwriter.maxfieldlength.unlimited))
analyzer.close();
}
private比如如果使用者輸入的是「語言學家」,那麼該函式的返回值是「語言 學家 語言學 語言學家」,為後面的搜尋做好準備(另外,我們還可以為每個詞加上乙個*,這樣只要部分匹配就可以搜到結果)。最後的搜尋實現是:static
string getkeywordssplitbyspace(string
keywords, jiebatokenizer tokenizer)"
", word.word);
}return
result.tostring().trim();
}
private這裡的searchfield引數可以指定特定字段進行搜尋,如果為空,則對所有字段進行搜尋。至此實現了最基本的整合。static ienumerablesearchquery(string searchquery, string searchfield = ""
)
using (var searcher = new indexsearcher(directory, false
))
else
, analyzer);
var query =parsequery(searchquery, parser);
var hits = searcher.search(query, null
, hitslimit, sort.relevance).scoredocs;
var results =maplucenetodatalist(hits, searcher);
analyzer.close();
return
results;}}
}
jiebatokenizer、jiebaanalyzer的實現和示例**都可在jiebaforlucenenet找到。
luke.net可以檢視lucene.net生成的索引內容,這在開發和除錯lucene的時候會特別有幫助。
參考:lucene.net ultra fast search for mvc or webforms site
lucene.net – custom synonym analyzer
程式設計師自省錄
前言 本文具有批判性,如有誤解請移步右上角叉叉。為什麼做程式設計師?我相信每位入行的童鞋 除了高工資,有免費大桶水喝的辦公室,不幹體力活的各種原因外 都有想用 改變世界的想法。我也是這樣,在苦苦掙扎了五年後,我發現我並未成功改變世界,而是讓 改變了自己。為什麼要做程式設計師?是對程式的熱愛,對 的忠...
程式設計師自省錄
本文具有批判性,如有誤解請移步右上角叉叉。我相信每位入行的童鞋 除了高工資,有免費大桶水喝的辦公室,不幹體力活的各種原因外 都有想用 改變世界的想法。我也是這樣,在苦苦掙扎了五年後,我發現我並未成功改變世界,而是讓 改變了自己。為什麼要做程式設計師?是對程式的熱愛,對 的忠誠,如果看到這裡,你並非如...
程式設計師自省錄
本文具有批判性,如有誤解請移步右上角叉叉。我相信每位入行的童鞋 除了高工資,有免費大桶水喝的辦公室,不幹體力活的各種原因外 都有想用 改變世界的想法。我也是這樣,在苦苦掙扎了五年後,我發現我並未成功改變世界,而是讓 改變了自己。為什麼要做程式設計師?是對程式的熱愛,對 的忠誠,如果看到這裡,你並非如...