2014-03-05 60 views
1

我有一個項目,它使用Lucene.net(最新版本)使用StandardAnalyzer索引包含大量(200萬)文本行的文件。如何使用Lucene.net獲得頂級單詞的詞典及其出現次數?

我正在將每行寫入索引作爲單個文檔;使用生成的索引我現在想要獲取每個單詞的字典及其在所有文檔中的總數。

達到此目的的最佳方法是什麼?

在此先感謝。

回答

1

Luke.NET這樣做。以下是它的源代碼中的功能,它可以幫助你順利完成任務:

public static TermInfo[] GetHighFreqTerms(Directory dir, 
              Hashtable junkWords, 
              int numTerms, 
              String[] fields) 
{ 
    if (dir == null || fields == null) return new TermInfo[0]; 

    IndexReader reader = IndexReader.Open(dir, true); 
    TermInfoQueue tiq = new TermInfoQueue(numTerms); 
    TermEnum terms = reader.Terms(); 

    int minFreq = 0; 

    while (terms.Next()) 
    { 
     String field = terms.Term.Field; 

     if (fields != null && fields.Length > 0) 
     { 
      bool skip = true; 

      for (int i = 0; i < fields.Length; i++) 
      { 
       if (field.Equals(fields[i])) 
       { 
        skip = false; 
        break; 
       } 
      } 
      if (skip) continue; 
     } 

     if (junkWords != null && junkWords[terms.Term.Text] != null) 
      continue; 

     if (terms.DocFreq() > minFreq) 
     { 
      tiq.Add(new TermInfo(terms.Term, terms.DocFreq())); 
      if (tiq.Size() >= numTerms)    // if tiq overfull 
      { 
       tiq.Pop();     // remove lowest in tiq 
       minFreq = ((TermInfo)tiq.Top()).DocFreq; // reset minFreq 
      } 
     } 
    } 

    TermInfo[] res = new TermInfo[tiq.Size()]; 

    for (int i = 0; i < res.Length; i++) 
    { 
     res[res.Length - i - 1] = (TermInfo)tiq.Pop(); 
    } 

    reader.Dispose(); 

    return res; 
} 
+0

太棒了,謝謝你:-) – MaYaN

相關問題