2017-08-03 115 views
-2

Iam試圖在java中實現一個程序,該程序應該能夠獲取文檔列表,例如3,然後使用一些單項查詢,我應該能夠得到多少次字出現在文件中。Java - 倒排索引

結果應該以元組形式返回,例如[doc 1,doc 2]。它應該作爲在內存中運行的倒排索引來實現。

例如,如果我有:

  • 文檔1: 「魚在水中」
  • 文檔2: 「魚被比利命名爲」
  • 文檔3:「魚是游泳「

搜索 」水「 給出結果:[DOC 1]

搜索魚應該給:[doc1,doc2,doc3]

Iam試圖將問題分成更小的段,因此我更容易專注於如何實際執行它。我想更多的是這樣的:

1)開始用某種方式索引文件

2)支持單字詞的搜索

3)返回排序匹配文檔的列表TF-IDF

如果我們從第一點開始,我該如何開始解決這個問題?

+0

只是爲了重述你的問題:每個單詞應該映射**到包含文檔的**列表**那個詞。這不是給你一個明顯的方法來解決這個問題嗎?如果你不知道如何將任何給定的字符串拆分成單詞(或者你正在努力的任何特定部分),你應該廢除大部分問題,而只是集中在那部分上(因爲沒有其他問題將在那裏相關,它只是讓你的問題太廣泛)。 – Dukeling

+0

作爲一個算法問題可能會很好,但是您要求提供Java代碼,這會擴大這個問題的範圍,因爲我們不僅需要解釋算法,還需要我們提供的任何代碼,不知道你在Java方面已經知道了什麼。 – Dukeling

+0

我知道java的基礎知識和更多一點。正如我所說iam試圖專注於將這個大問題縮小到更小的問題,所以我首先關注如何索引文件,是否有可能使用這個特定子問題的散列表? – Genesis

回答

0
  1. 爲每個包含文檔中所有單詞和出現次數的文檔創建一個Map<String, Long>(在SO上搜索 - 已多次提到)。使用String::split可以幫助提取單個單詞。您可能希望以小寫形式存儲單詞以便於搜索(請注意,在某些語言(例如土耳其語)中,這不起作用)。
  2. 然後可以使用Map::get找到每個文檔
  3. 輸出一個字的出現次數的數量結果
0

我覺得Assylias解決方案是最好的。但我會建議使用Lucene,它正是你想要達到的。

0

什麼是這樣的例子:

  String keyword = "fish"; 
      List<String> results = new ArrayList<String>(); 

      for(Document doc:documents){ 
       if(doc.getTextContent().contains(keyword)){ 
        results.add(doc); 
       } 
      } 
      System.out.println(results); 
+0

這隻在每個文件中搜索魚字嗎?但你如何存儲文件?文件是否應該存儲在與程序相同的地圖中,還是還有更多內容? – Genesis

0

爲什麼你需要計算TF-IDF權重?

如果你只是返回該比賽一句話,你做布爾檢索它不需要你來計算任何TF-IDF文檔。你需要tf-idf如果你正在做概率檢索並且你正在計算分數等等。