[C#] Lucene.net - 使用盤古建立分詞 PanGuAnalyzer

2012-10-30

 

有一篇文章說到有關於 盤古分詞 這東西…

可以參考這一篇 當麻許-盤古分詞,尋找句子中的分詞

之前我們建立Lucene.net 的索引的時候,我們用的都是Lucene 標準的分析器

IndexWriter indexWriter = new IndexWriter(dir, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29), true, IndexWriter.MaxFieldLength.UNLIMITED);


這時候我們用 NLuke  來看看我們建立得索引..


2012-10-04_135158



2012-10-04_135324



這時候我們使用 Lucene4Pangu


下載網址:


http://pangusegment.codeplex.com/


Source Code :


Stopwatch sw = new Stopwatch();
// 讀取所有資料
var di = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory + "\\Source\\");
sw.Start();
var allObjects = di.GetFiles().Select(
    x => JObject.Parse((File.ReadAllText(x.FullName)))).ToArray();
//Index 存放路徑
string indexPath = AppDomain.CurrentDomain.BaseDirectory + "\\Index1\\";
FSDirectory dir = FSDirectory.Open(new DirectoryInfo(indexPath));
//IndexWriter
//使用盤古分詞
var analyzer = new Lucene.Net.Analysis.PanGu.PanGuAnalyzer();
IndexWriter indexWriter = new IndexWriter(dir, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);
indexWriter.DeleteAll();
// 還原且加入需做 index 的欄位
foreach (JObject ds in allObjects)
{
    Document doc = new Document();
    // 把每一個欄位都建立索引
    Field f_Id = new Field("Id", ds["Id"].ToString(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO);
    Field f_Age = new Field("Age", ds["Age"].ToString(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO);
    Field f_Memo = new Field("Memo", ds["Memo"].ToString(), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO);
    Field f_BirthDay = new Field("BirthDay", DateTime.Parse(ds["Birthday"].ToString()).ToString("yyyyMMdd"), Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO);
    doc.Add(f_Id); doc.Add(f_Age); doc.Add(f_Memo); doc.Add(f_BirthDay);
    indexWriter.AddDocument(doc);
}
indexWriter.Optimize();
indexWriter.Commit();
indexWriter.Close();
sw.Stop();
Response.Write("建立" + allObjects.Length + "筆索引花費時間: " + sw.Elapsed + "");



這時候我們使用NLuke 來看看用盤古分析器所建立的索引會有什麼不同?!



2012-10-04_135339



2012-10-04_135352



2012-10-04_135405



這裡面結構已經改變 透過 標準的 LuceneStandardAnalyzer 看到的都是一個一個的中文字 他根本就搞不懂中文..


但是 PanGuAnalyzer 不同 在他眼睛中所看到的是你事先建立的中文分詞,當然內建的字典檔已經建立些基本的分詞


通常自行使用的分詞都會在進行調整…


當麻許的超技八 2014 | Donma Hsu Design.