乙個程式設計師的自省

2021-07-05 08:26:06 字數 2600 閱讀 3221

首先宣告:我對lucene.net並不熟悉,但搜尋確實是分詞的乙個重要應用,所以這裡還是嘗試將兩者整合起來,也許對你有一參考。

看到了兩個中文分詞與lucene.net的整合專案:lucene.net.analysis.pangu和lucene.net.analysis.mmseg,參考其中的**實現了最簡單的整合:jiebaforlucenenet。下面給出簡單的介紹。

主要的整合點是自定義乙個tokenizer的子類,此時必須要實現它的抽象方法incrementtoken,該方法用於對文字流中的文字生成的token進行遍歷,這正是分詞元件發揮作用的地方。

public

override

bool

incrementtoken()

end();

return

false

;}

termatt和offsetatt所在的兩行**需要用到每乙個token的詞本身、起始索引和終止索引,而這三個值恰好是jiebasegmenter.tokenize方法所實現的,所以只要在初始化jiebatokenizer時使用:

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

override tokenstream tokenstream(string

fieldname, textreader reader)

除了jiebatokenizer,jiebaanalyzer還會用到lowercasefilterstopfilter。前者可將索引和搜尋的內容正則化,忽略大小寫,後者則過濾掉停用詞。這裡使用的停用詞列表合併了nltk的英文停用詞和哈工大的中文停用詞。

建立索引時,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

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;}}

}

這裡的searchfield引數可以指定特定字段進行搜尋,如果為空,則對所有字段進行搜尋。至此實現了最基本的整合。

jiebatokenizer、jiebaanalyzer的實現和示例**都可在jiebaforlucenenet找到。

luke.net可以檢視lucene.net生成的索引內容,這在開發和除錯lucene的時候會特別有幫助。

參考:lucene.net ultra fast search for mvc or webforms site

lucene.net – custom synonym analyzer

程式設計師自省錄

前言 本文具有批判性,如有誤解請移步右上角叉叉。為什麼做程式設計師?我相信每位入行的童鞋 除了高工資,有免費大桶水喝的辦公室,不幹體力活的各種原因外 都有想用 改變世界的想法。我也是這樣,在苦苦掙扎了五年後,我發現我並未成功改變世界,而是讓 改變了自己。為什麼要做程式設計師?是對程式的熱愛,對 的忠...

程式設計師自省錄

本文具有批判性,如有誤解請移步右上角叉叉。我相信每位入行的童鞋 除了高工資,有免費大桶水喝的辦公室,不幹體力活的各種原因外 都有想用 改變世界的想法。我也是這樣,在苦苦掙扎了五年後,我發現我並未成功改變世界,而是讓 改變了自己。為什麼要做程式設計師?是對程式的熱愛,對 的忠誠,如果看到這裡,你並非如...

程式設計師自省錄

本文具有批判性,如有誤解請移步右上角叉叉。我相信每位入行的童鞋 除了高工資,有免費大桶水喝的辦公室,不幹體力活的各種原因外 都有想用 改變世界的想法。我也是這樣,在苦苦掙扎了五年後,我發現我並未成功改變世界,而是讓 改變了自己。為什麼要做程式設計師?是對程式的熱愛,對 的忠誠,如果看到這裡,你並非如...