使用Lucene的Highlighter實現文件摘要的自動提取
使用Lucene自帶的Highlighter就可以實現對原始文件摘要的提取工作。Highlighter類有一個getBestFragment方法,這個方法有多個重載的方法,其中,使用:
public final String getBestFragment(Analyzer analyzer, String fieldName,String text)
就可以提取摘要,它實現了從指定的原始文件中,提取檢索關鍵字出現頻率最高的一段文字作為摘要,默認情況下提取100個字符,同時加上自定義的高亮顯示代碼,又可實現關鍵字高亮顯示。
測試程序如下所示:
package org.shirdrn.lucene.learn.digest;
import java.io.IOException;
import net.teamhot.lucene.ThesaurusAnalyzer;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
public class ExtractDigest {
private String indexPath = "H:\\index";
private Analyzer analyzer;
private IndexSearcher searcher;
private String prefixHTML = "<font color='red'>";
private String suffixHTML = "</font>";
public ExtractDigest(){
analyzer = new ThesaurusAnalyzer();
}
public void createIndex() throws IOException {
IndexWriter writer = new IndexWriter(indexPath,analyzer,true);
Document docA = new Document();
String fileTextA = "挖掘頻繁項集的方法可以擴展到挖掘閉頻繁項集(由它們容易導出頻繁項集的集合)。這些方法結合了附加的優化技術,如項合并、子項剪枝和項跳過,以及模式樹中產生的項集的有效子集檢查。挖掘頻繁項集和關聯已經用不同的方法擴展,包括挖掘多層關聯規則和多維關聯規則。多層關聯規則可以根據每個抽象層的最小支持度閾值如何定義,使用多種策略挖掘。如一致的支持度、遞減的支持度和基于分組的支持度。冗余的多層(后代)關聯規則可以刪除,如果根據其對應的祖先規則,他們的支持度和置信度接近于期望值的話。挖掘多維關聯規則的技術可以根據對量化屬性的處理分為若干類。第一,量化屬性可以根據預定義的概念分層靜態離散化。數據立方體非常適合這種方法,因為數據立方體和量化屬性都可以利用概念分層。第二,可以挖掘量化關聯規則,其中量化屬性根據分箱和/或聚類動態離散化,“鄰近的”關聯規則可以用聚類合并,產生更簡潔、更有意義的規則。基于約束的規則挖掘允許用戶通過提供元規則(即模式模板)和其他挖掘約束對規則搜索聚焦。這種挖掘推動了說明性數據挖掘查詢語言和用戶界面的使用,并對挖掘查詢優化提出了巨大挑戰。規則約束可以分為五類:反單調的、單調的、簡潔的、可轉變的和不可轉變的。前四類約束可以在頻繁項集挖掘中使用,使挖掘更有功效,更有效率。沒有進一步分析或領域知識,關聯規則不應該直接用于預測。它們不必指示因果關系。然而,對于進一步探查,它們是有幫助的切入點,使得它們成為理解數據的流行工具。流數據不斷地在計算機系統中流進流出并且具有變化的更新速度,涉及數據流的應用非常廣泛。大綱提供數據流的匯總,通常用來返回查詢的近似解答。隨機抽樣、滑動窗口、直方圖、多分辨率方法、梗概以及隨機算法都是大綱的形式。傾斜時間框架模型允許數據以多個時間粒度存儲,最近的時間記錄在最細的粒度上,最遠的時間記錄在最粗的粒度上。流立方體可以存儲壓縮的數據,對時間維度使用傾斜時間框架模型,并且僅在一些關鍵的層上存儲數據,關鍵層反映了分析人員最感興趣的數據層,從而基于到關鍵層的“常用路徑”進行部分物化。";
Field fieldA = new Field("contents", fileTextA, Field.Store.YES,Field.Index.TOKENIZED);
docA.add(fieldA);
Document docB = new Document();
String fileTextB = " 數據挖掘(Data Mining),又稱為數據庫中的知識發現(Knowledge Discovery in Database, KDD),就是從大量數據中獲取有效的、新穎的、潛在有用的、最終可理解的模式的非平凡過程,簡單的說,數據挖掘就是從大量數據中提取或“挖掘”知識。";
Field fieldB = new Field("contents", fileTextB, Field.Store.YES,Field.Index.TOKENIZED);
docB.add(fieldB);
writer.addDocument(docA);
writer.addDocument(docB);
writer.optimize();
writer.close();
}
public void search(String fieldName,String keyword) throws CorruptIndexException, IOException, ParseException{
searcher = new IndexSearcher(indexPath);
QueryParser queryParse = new QueryParser(fieldName, analyzer);
Query query = queryParse.parse(keyword);
Hits hits = searcher.search(query);
for(int i=0;i<hits.length();i++){
Document doc = hits.doc(i);
String text = doc.get(fieldName);
//System.out.println("||||||||||||"+text);
int htmlLength = prefixHTML.length()+suffixHTML.length();
System.out.println("高亮HTML的總長度為"+htmlLength);
SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter(prefixHTML, suffixHTML);
Highlighter highlighter = new Highlighter(simpleHTMLFormatter,new QueryScorer(query));
String highLightText = highlighter.getBestFragment(analyzer,"contents",text);
System.out.println("★高亮顯示第 "+(i+1) +" 條檢索結果如下所示:");
System.out.println(highLightText);
System.out.println("顯示第 "+(i+1) +" 條檢索結果摘要的長度為(含高亮HTML代碼):"+highLightText.length());
}
searcher.close();
}
public static void main(String[] args) {
ExtractDigest ed = new ExtractDigest();
try {
ed.createIndex();
ed.search("contents", "根據 挖掘");
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
}
上面程序,檢索“根據 挖掘”,首先使用QueryParser解析,提取Term為“根據”和“挖掘”,檢索結果應該在提取的摘要中高亮顯示這兩個Term的text。
運行結果如下所示:
詞庫尚未被初始化,開始初始化詞庫.
初始化詞庫結束。用時:3985毫秒;
共添加195574個詞語。
高亮HTML的總長度為25
★高亮顯示第 1 條檢索結果如下所示:
同的方法擴展,包括<font color='red'>挖掘</font>多層關聯規則和多維關聯規則。多層關聯規則可以<font color='red'>根據</font>每個抽象層的最小支持度閾值如何定義,使用多種策略<font color='red'>挖掘</font>。如一致的支持度、遞減的支持度和基于分組的支持度。冗余的多層(后代)關聯規則
顯示第 1 條檢索結果摘要的長度為(含高亮HTML代碼):174
高亮HTML的總長度為25
★高亮顯示第 2 條檢索結果如下所示:
數據<font color='red'>挖掘</font>(Data Mining),又稱為數據庫中的知識發現(Knowledge Discovery in Database, KDD),就是從大量數據中獲取有效的、新穎的、潛在有用的、最終可理解
顯示第 2 條檢索結果摘要的長度為(含高亮HTML代碼):124
上面程序中,在進行分析的時候,構造Field,同時對指定原始文本進行了存儲,如下所示:
Field fieldA = new Field("contents", fileTextA, Field.Store.YES,Field.Index.TOKENIZED);
這個Field.Store.YES指定的存儲,但是在實際中這樣會浪費存儲空間,而且造成索引管理的困難,所以在實際中是直接從數據庫中查詢出原始文件的文本內容,然后對這個文本進行處理,對其進行提取摘要的操作。也就是在上面String text = doc.get(fieldName);這一步,text的內容是根據Document的ID,從數據庫中查詢出來的,避免了IO操作,從而提高了檢索速度,而且便利了索引文件的管理。

浙公網安備 33010602011771號