青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

為生存而奔跑

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  271 Posts :: 0 Stories :: 58 Comments :: 0 Trackbacks

留言簿(5)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 331736
  • 排名 - 74

最新評論

閱讀排行榜

評論排行榜

 用Lucene建立索引時,需要指定索引的TermVector.YES. 

            Document document = new Document();
            document.Add(
new Field("word", pageText, Field.Store.NO, Field.Index.TOKENIZED, Field.TermVector.YES));
            document.Add(
new Field("concept",pageTitle,Field.Store.YES,Field.Index.NO));
            indexWriter.AddDocument(document);


建立索引后,如下代碼可以遍歷索引中所有的term,并且得到該term在每個文檔中的頻率

           IndexReader reader = IndexReader.Open(indexDir);
            TermEnum termEnum 
= reader.Terms();
            
while (termEnum.Next())
            {
                Console.WriteLine(termEnum.Term());
                Console.WriteLine(
"DocFreq="+termEnum.DocFreq());

                TermDocs termDocs 
= reader.TermDocs(termEnum.Term());
                
while (termDocs.Next())
                {
                    Console.WriteLine(
"DocNo:   "+termDocs.Doc()+"  Freq:   "+termDocs.Freq());
                }
            }




轉自http://lqgao.spaces.live.com/blog/cns!3BB36966ED98D3E5!408.entry?_c11_blogpart_blogpart=blogview&_c=blogpart#permalink

Lucene源碼分析(1) -- 如何讀取Lucene索引數據

終于清楚如何用讀Lucene的索引 :-)。本文要介紹一下如何利用IndexReader獲取信息。為什么要讀索引呢?因為我需要實現這些功能:
(1) 統計term在整個collection中的文檔頻度(document frequency, DF);
(2) 統計term在整個collection中出現的詞次(term frequency in whole collection);
(3) 統計term在某個文檔中出現的頻度(term frequency, TF);
(4) 列出term在某文檔中出現的位置(position);
(5) 整個collection中文檔的個數;
 
那么為什么要用到這些數據呢?這些數據是實現TR(Text Retrieval,文本檢索)的必備的“原料”,而且是經過加工的。在檢索之前,只有原始文本(raw data);經過索引器(indexer)的處理之后,原始文本變成了一個一個的term(或者token),然后被indexer紀錄下來所在的位置、出現的次數。有了這些數據,應用一些模型,就可以實現搜索引擎實現的功能——文本檢索。
 
聰明的讀者您可能會說,這看起來似乎很好做,不過就是計數(count)么。不錯,就是計數,或者說是統計。但是看似簡單的過程,如果加上空間(內存容量)的限制,就顯得不那么簡單了。假設如果每篇文檔有100個term,每個term需要存儲10字節信息,存1,000,000篇文檔需要 10x100x10^6=10^9=2^30字節,也就是1GB。雖然現在1G內存不算什么,可是總不能把1GB的數據時時刻刻都放入內存吧。那么放入硬盤好了,現在需要用數據的時候,再把1GB數據從硬盤搬到內存。OK,可以先去沖杯咖啡,回來在繼續下面的操作。這是1,000,000的文檔,如果更多一點呢,現在沒有任何輔助數據結構的方式,會導致很差的效率。
 
Lucene的索引會把數據分成段,并且在需要的時候才讀,不需要的時候就讓數據乖乖地呆在硬盤上。Lucene本身是一個優秀的索引引擎,能夠提供有效的索引和檢索機制。文本的目的是,介紹如用利用Lucene的API,如何從已經建好的索引的數據中讀取需要的信息。至于Lucene如何使用,我會在后續的文章中逐漸介紹。
 
我們一步一步來看。這里建設已經有實現建好索引,存放在index目錄下。好,要讀索引,總得先生成一個讀索引器(即Lucene中IndexReader的實例)。好,寫下面的程序(程序為C#程序,本文使用DotLucene)。
 IndexReader reader;
問題出來了,IndexReader是一個abstract類,不能實例化。那好,換派生類試試看。找到IndexReader的兩個孩子——SegmentReader和MultiReader。用哪個呢?無論是哪個都需要一大堆參數(我是頗費了周折才搞清楚它們的用途,后面再解釋),似乎想用Lucene的索引數據不是那么容易啊。通過跟蹤代碼和查閱文檔,我終于找到使用IndexReader的鑰匙。原來IndexReader有一個“工廠模式”的static interface——IndexReader.Open。定義如下:
#0001  public static IndexReader Open(System.String path)
#0002  public static IndexReader Open(System.IO.FileInfo path)
#0003  public static IndexReader Open(Directory directory)
#0004  private static IndexReader Open(Directory directory, bool closeDirectory)
其中有三個是public的接口,可供調用。打開一個索引,就是這么簡單:
#0001  IndexReader reader = IndexReader.Open(index);
實際上,這個打開索引經歷了這樣的一個過程:
#0001  SegmentInfos infos = new SegmentInfos();
#0002  Directory directory = FSDirectory.GetDirectory(index, false);
#0003  infos.Read(directory);
#0004  bool closeDirectory = false;
#0005  if (infos.Count == 1)
#0006  {
#0007   // index is optimized
#0008   return new SegmentReader(infos, infos.Info(0), closeDirectory);
#0009  }
#0010  else
#0011  {
#0012   IndexReader[] readers = new IndexReader[infos.Count];
#0013   for (int i = 0; i < infos.Count; i++)
#0014    readers[i] = new SegmentReader(infos.Info(i));
#0015   return new MultiReader(directory, infos, closeDirectory, readers);
#0016  }
首先要讀入索引的段信息(segment information, #0001~#0003),然后看一下有幾個段:如果只有一個,那么可能是優化過的,直接讀取這一個段就可以(#0008);否則需要一次讀入各個段(#0013~#0014),然后再拼成一個MultiReader(#0015)。打開索引文件的過程就是這樣。
 
接下來我們要看看如何讀取信息了。用下面這段代碼來說明。
#0001  public static void PrintIndex(IndexReader reader)
#0002  {
#0003      //顯示有多少個document
#0004      System.Console.WriteLine(reader + "\tNumDocs = " + reader.NumDocs());
#0005      for (int i = 0; i < reader.NumDocs(); i++)
#0006      {
#0007          System.Console.WriteLine(reader.Document(i));
#0008      }
#0009 
#0010      //枚舉term,獲得<document, term freq, position* >信息
#0011      TermEnum termEnum = reader.Terms();
#0012      while (termEnum.Next())
#0013      {
#0014          System.Console.Write(termEnum.Term());
#0015          System.Console.WriteLine("\tDocFreq=" + termEnum.DocFreq());
#0016 
#0017          TermPositions termPositions = reader.TermPositions(termEnum.Term());
#0018          int i = 0;
#0019          int j = 0;
#0020          while (termPositions.Next())
#0021          {
#0022              System.Console.WriteLine((i++) + "->" + " DocNo:" + termPositions.Doc() + ", Freq:" + termPositions.Freq());
#0023              for (j = 0; j < termPositions.Freq(); j++)
#0024                  System.Console.Write("[" + termPositions.NextPosition() + "]");
#0025              System.Console.WriteLine();
#0026          }
#0027 
#0028          //直接獲取 <term freq, document> 的信息
#0029          TermDocs termDocs = reader.TermDocs(termEnum.Term());
#0030          while (termDocs.Next())
#0031          {
#0032              System.Console.WriteLine((i++) + "->" + " DocNo:" + termDocs.Doc() + ", Freq:" + termDocs.Freq());
#0033          }
#0034      }
#0035 
#0036      // FieldInfos fieldInfos = reader.fieldInfos;
#0037      // FieldInfo pathFieldInfo = fieldInfos.FieldInfo("path");
#0038 
#0039      //顯示 term frequency vector
#0040      for (int i = 0; i < reader.NumDocs(); i++)
#0041      {
#0042          //對contents的token之后的term存于了TermFreqVector
#0043          TermFreqVector termFreqVector = reader.GetTermFreqVector(i, "contents");
#0044 
#0045          if (termFreqVector == null)
#0046          {
#0047              System.Console.WriteLine("termFreqVector is null.");
#0048              continue;
#0049          }
#0050 
#0051          String fieldName = termFreqVector.GetField();
#0052          String[] terms = termFreqVector.GetTerms();
#0053          int[] frequences = termFreqVector.GetTermFrequencies();
#0054 
#0055          System.Console.Write("FieldName:" + fieldName);
#0056          for (int j = 0; j < terms.Length; j++)
#0057          {
#0058              System.Console.Write("[" + terms[j] + ":" + frequences[j] + "]");
#0059          }
#0060          System.Console.WriteLine();
#0061      }
#0062      System.Console.WriteLine();
#0063  }
#0004 計算document的個數
#0012~#0034 枚舉collection中所有的term
其中#0017~#0026 枚舉每個term在出現的document中的所有位置(第幾個詞,從1開始計數);#0029~#0033 計算每個term出現在哪些文檔和相應的出現頻度(即DF和TF)。
#0036~#0037在reader是SegmentReader類型的情況下有效。
#0040~#0061可以快速的讀取某篇文檔中出現的term和相應的頻度。但是這部分需要在建索引時,設置storeTermVector為true。比如
 doc.Add(Field.Text("contents", reader, true));
其中的第三項即是。默認為false。
 
有了這些數據,就可以統計我需要的數據了。以后我會介紹如何建立索引,如何應用Lucene。
posted on 2010-03-08 15:31 baby-fly 閱讀(4529) 評論(0)  編輯 收藏 引用 所屬分類: Information Retrival / Data Mining
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一区二区三区男人的天堂| 亚洲国产视频直播| 久久视频在线免费观看| 免费不卡中文字幕视频| 亚洲一区中文| a91a精品视频在线观看| 欧美视频在线播放| 国产欧美日韩精品专区| 国产精品爱久久久久久久| 欧美日韩卡一卡二| 一区免费在线| 最新精品在线| 久久综合伊人77777| 亚洲精品久久久蜜桃| 亚洲久色影视| 黑人极品videos精品欧美裸| 亚洲黄色在线看| 国产精品伦理| 亚洲第一在线视频| 久久狠狠亚洲综合| 韩国一区二区三区在线观看 | 牛牛影视久久网| 中文在线资源观看网站视频免费不卡 | 模特精品裸拍一区| 久久精品91| 亚洲一区www| 蜜桃av久久久亚洲精品| 久久精品亚洲一区二区三区浴池| 久久在线免费视频| 久久精品成人欧美大片古装| 欧美日韩一区二区三区高清| 狠狠色综合网| 在线亚洲自拍| 亚洲一区免费| 国产伦精品一区二区三区四区免费| 亚洲第一区在线| 伊人精品在线| 欧美激情一级片一区二区| 亚洲精品国产精品国产自| 亚洲欧美精品伊人久久| 性伦欧美刺激片在线观看| 欧美日韩精品欧美日韩精品一| 欧美丝袜第一区| 久久gogo国模裸体人体| 老牛国产精品一区的观看方式| 性色一区二区| 国产欧美一级| 欧美中文字幕视频| 亚洲一级一区| 亚洲视频免费| aa级大片欧美三级| 美女诱惑黄网站一区| 亚洲免费观看| 日韩亚洲欧美一区二区三区| 亚洲高清一二三区| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美高清在线播放| 亚洲承认在线| 久久久夜夜夜| 亚洲欧洲精品一区二区三区不卡| 老色批av在线精品| 亚洲国产美女久久久久| 欧美成人综合| 一本久道久久综合婷婷鲸鱼| 欧美日韩综合视频网址| 欧美在线观看日本一区| 最新国产成人在线观看| 性色av一区二区三区红粉影视| 国产自产精品| 国产精品区免费视频| 欧美视频一区在线| 久久不射2019中文字幕| 亚洲无限av看| 亚洲午夜电影| 一区二区久久| 亚洲欧美日韩一区二区在线 | 国产精品久久91| 亚洲一区二区精品| 亚洲一级影院| 欧美福利视频在线| 国产网站欧美日韩免费精品在线观看 | 亚洲午夜精品| 午夜精品视频网站| 久久午夜电影| 国产精品大片免费观看| 国产视频久久网| 亚洲国产日韩欧美一区二区三区| 欧美一区二区视频97| 欧美一区国产在线| 欧美精选一区| 欧美日本簧片| 亚洲性xxxx| 日韩亚洲在线| 欧美视频精品一区| 亚洲精品欧美专区| 欧美凹凸一区二区三区视频| 欧美一区二区精品| 韩国成人精品a∨在线观看| 午夜精品久久久久久久99樱桃| 亚洲激情视频在线播放| 老鸭窝毛片一区二区三区| 亚洲大胆美女视频| 亚洲福利视频专区| 欧美日韩免费精品| 午夜在线电影亚洲一区| 亚洲欧美激情四射在线日| 午夜伦欧美伦电影理论片| 欧美精品一区二区三区很污很色的| 韩日欧美一区二区三区| 欧美一区二区三区免费观看视频| 99精品免费网| 国产精品五月天| 亚洲午夜极品| 午夜宅男欧美| 亚洲国产成人午夜在线一区| 欧美国产极速在线| 欧美久久久久久久久久| 中文精品一区二区三区| 亚洲精品视频一区| 亚洲欧美中文日韩在线| 欧美日韩视频在线一区二区| 亚洲一二三区视频在线观看| 久久国产精品久久国产精品| 亚洲人午夜精品| 麻豆国产va免费精品高清在线| 久久久久久久97| 亚洲欧美综合v| 国产午夜精品美女毛片视频| 久久国产精品久久w女人spa| 欧美资源在线| 久久久久久一区二区| 亚洲激情网站| 国产一区二区三区网站| 久久精品国产精品亚洲精品| 久久精品国产亚洲a| 亚洲国产另类精品专区| 亚洲美女在线看| 国产亚洲一本大道中文在线| 噜噜噜躁狠狠躁狠狠精品视频| 欧美不卡视频| 久久久久久久999精品视频| 久久久亚洲欧洲日产国码αv| 亚洲国产高清高潮精品美女| 中国成人黄色视屏| 亚洲欧洲在线视频| 欧美一区二区三区四区视频| 亚洲作爱视频| 蜜桃av一区| 久久色在线观看| 国产精品一二三视频| 亚洲国产精品电影| 亚洲第一天堂av| 午夜在线一区二区| 欧美一区2区三区4区公司二百| 欧美—级高清免费播放| 免播放器亚洲| 亚洲国产成人tv| 欧美一区二区三区另类| 性做久久久久久久久| 国产精品美女xx| 亚洲伊人一本大道中文字幕| 亚洲视频在线播放| 欧美吻胸吃奶大尺度电影| 日韩午夜在线播放| 亚洲永久免费精品| 国产乱码精品一区二区三| 香蕉成人久久| 免费久久99精品国产| 最近中文字幕日韩精品| 欧美极品在线观看| 一区二区三区高清不卡| 久久国产精品久久久久久| 国产一区二区三区的电影 | 开元免费观看欧美电视剧网站| 校园春色国产精品| 伊人成年综合电影网| 欧美成人高清| 亚洲一级二级| 免费成人高清在线视频| 亚洲三级性片| 国产日韩欧美另类| 欧美精品在线免费| 香蕉成人啪国产精品视频综合网| 另类春色校园亚洲| 亚洲综合电影| 亚洲欧洲一区二区三区在线观看| 欧美亚州一区二区三区| 久久久精品国产免大香伊| 亚洲精品少妇30p| 久久久久综合一区二区三区| 一二三区精品福利视频| 亚洲成人在线免费| 国产日韩欧美a| 国产精品久久久久久久app| 欧美成人小视频| 久久久91精品国产| 午夜精品免费视频| 亚洲综合色网站| 亚洲综合视频1区| 亚洲中字在线|