2009-12-31 67 views
4

我正在尋找一種算法,提示或任何可以解決我以下問題的源代碼。如何計算java中的單詞

我有一個文件夾,它包含許多文本文件。我閱讀並將所有文本存儲在STRING中。現在我想計算一下,如果有任何單詞出現在其他文件中或者沒有。 (我知道它的不明確讓我舉一個例子)

,比如我有兩個文件: 文件A =>「棕色狐狸跳」 督B =>「狗不跳」 文件C =>「狐狸跳狗「

假設我的程序讀取了第一個文檔,現在第一個單詞是」棕色「,現在我的程序會檢查這個單詞是否也出現在任何其他文檔中?所以答案是0.現在它將再次檢查第二個單詞「狐狸」,它會給出輸出,是的,它出現在(文件C)等...... 現在它會讀取文件B,它會檢查狗是否出現在其他文件?答案是(Doc C)等......

任何建議或僞代碼?提示:它也被稱爲逆文檔頻率(Idf)。我知道什麼是idf。

+6

這是一個功課問題嗎?如果是這樣,通過使用「家庭作業」標籤並且允許讀者相應地調整他們的答案,對其透明是一個好主意。 – 2009-12-31 01:59:39

+0

使用位集合。每次工作。 – 2009-12-31 02:20:49

回答

6

像GregS說的那樣,使用HashMap。我不發表任何代碼,因爲我覺得這是一門功課,我想給你的機會,你自己創建它,但輪廓:

  1. 打開新文檔
  2. 每單詞,看看你的hashmap是否已經存在。如果不是,用這個單詞在HashMap中創建一個新的密鑰,並在該位置添加新的文檔(文件名)。如果是,只需添加文檔的文件名。

例如,如果您有: DOCA:棕色狐狸跳過 DocB:跳狐犬

你會打開DOCA並遍歷其內容。 'brown'不在你的散列表中,所以你需要添加一個新的元素,其中鍵爲'brown'並且值'DocA'。與「狐狸」和「跳躍」一樣。 然後你會打開DocB。 'fox'已經在你的hashmap中,所以你可以添加它的DocB值(值爲'DocA DocB')。也許使用ArrayList(使用Java)會有所幫助。

+0

謝謝alex。這是一個很好的提示。我會盡力去做到的。我在大笑,讀到你們所有偉大的人都認爲它的任務。這讓我想起了我的上學日子。我是專業程序員。我剛剛從php轉移到Java。所以你可以說這是我目前的項目的一小部分。主要項目是一些新的想法在線書店。 – user238384 2009-12-31 03:46:42

5

提示:HashMap將字符串映射到文件列表。

2

這可能是考慮這個問題在術語「我有這組詞的所有文件一起」「我可以存儲莫名其妙的文件中,這些詞出現」有幫助。考慮到你的數據的這種表示,可以很容易地確定給定單詞是否出現在多個文檔中。關於如何做到這一點,其他人在這裏提供了一些提示。

1

HashMap將字符串映射到整數。整數是不可改變的,所以有一點點「增量」但不是太多。你可以重寫put()方法。

+0

我假設你是指將字符串映射到整數的*列表?這與GregS和Alex的解決方案的用途相同,但不太清楚。 Java中的文檔列表實際上只是一個指針列表,所以文檔列表的確更具可讀性,並且更易於使用。 – MatrixFrog 2009-12-31 07:21:50

2

只是另一個想法不同,然後所有有價值的答案,我承認哈希看起來更好,我只是想看另一個角度。

我會對每個文檔中的所有單詞進行排序,並將每個文檔相互比較。

例如docA> brown,fox,jump; docB-> DOC,跳,不docC->狗,狐狸,跳

比較它們就這樣產生了

 
until there is a single document with words 
    get first element of documents 
    compare the most descending first element if that element exists more than once reserve it 
    throw the one that is the most descending (in my case) 

所以在第一次比較

DOCA - >狐狸,跳 docB - > DOC,跳,不 DOCC - >狗,狐狸,跳

在第二次比較

DOCA - >狐狸,跳 docB - >跳轉,而不是 DOCC - >狗,狐狸

在第三比較

DOCA - >狐狸,跳 docB - >跳轉,而不是 DOCC - >狐狸,跳

準備金狐狸在第四次比較中,第五次比較中保留跳躍。

1

此代碼將返回所有不同的單詞作爲關鍵字,並將其作爲每個單詞在句子中找到的值計算。只需創建一個String對象作爲來自文件或命令提示符的輸入,並在下面的方法中傳遞它。

public Map<String,Integer> getWordsWithCount(String sentances) 
{ 
    Map<String,Integer> wordsWithCount = new HashMap<String, Integer>(); 

    String[] words = sentances.split(" "); 
    for (String word : words) 
    { 
     if(wordsWithCount.containsKey(word)) 
     { 
      wordsWithCount.put(word, wordsWithCount.get(word)+1); 
     } 
     else 
     { 
      wordsWithCount.put(word, 1); 
     } 

    } 

    return wordsWithCount; 

} 
相關問題