2016-04-30 9 views
0

文字列をテキストファイルから読み込んだときにハッシュマップに格納するコードを書きたいと思います。ネストされたハッシュマップに格納されるときの文字列の頻度の計算

私は以下のコードを書かれているし、それが動作

、エラーなし、文字列の組み合わせのすべての発生頻度が変化しない、それは私がそれを保証することができますどのように支援を求めています常に1

です文字列の組み合わせがテキストファイルに複数回表示される場合、その頻度も増加するはずです。

これは私のコードです:TEXTファイルに含ま

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.*; 



    public class NgramBetaC { 

    static String[] hashmapWord = null; 
    public static Map<String,Map<String, Integer>> bigrams = new HashMap<>(); 

    public static void main(String[] args) {  

    //prompt user input 
    Scanner input = new Scanner(System.in); 

    //read words from collected corpus; a number of .txt files 

    File directory = new File("Corpus4"); 
    File[] listOfFiles = directory.listFiles();//To read from all listed iles in the "directory" 

      //String bWord[] = null; 
      int lineNumber = 0; 
      String line; 
      String files; 
      String delimiters = "[\\s+,?!:;.]"; 
      int wordTracker = 0; 

      //reading from a list of text files 
      for (File file : listOfFiles) { 
       if (file.isFile()) { 
        files = file.getName(); 
        try { 
         if (files.endsWith(".txt") || files.endsWith(".TXT")) { //ensures a file being read is a text file 

         BufferedReader br = new BufferedReader(new FileReader(file)); 


         while ((line = br.readLine()) != null) { 
           line = line.toLowerCase(); 
           hashmapWord = line.split(delimiters); 

         for(int s = 0; s < hashmapWord.length - 2; s++){ 

            String read = hashmapWord[s]; 
            String read1 = hashmapWord[s + 1]; 
            final String read2 = hashmapWord[s + 2]; 

            String readBigrams = read + " " + read1; 

            final Integer count = null; 

            //bigrams.put(readBigrams, new HashMap() {{ put (read2, (count == null)? 1 : count + 1);}}); 
            bigrams.put(readBigrams, new HashMap<String, Integer>()); 
            bigrams.get(readBigrams).put(read2, (count == null) ? 1 : count+1); 


           } br.close(); 
         } 
         } 
        } catch (NullPointerException | IOException e) { 
         e.printStackTrace(); 
         System.out.println("Unable to read files: " + e); 
        } 

      }  
      } 
      } 

線である::

1.Iは、いくつかのアイスクリームをしたいと思います。2.iは今年12月にドバイにいたいと思っています。3.iはパスタを食べるのが大好きです。 4.iはパスタを自分で準備しています。 5.誰が今日私に会いに来るのですか?

ハッシュマップの内容を印刷する場合、私はGET出力され:

{= {} 1 =参照に来て、ドバイ= {に、= {} = 1たい、これは1}、パスタを準備します= 1 =パスタ= 1のように、= {パーマ= 1}、= {パーマ= 1}、= { } = {1 =}であるために、いくつかのice = {cream = 1}、in = {dubai = 1}、来る= {to = 1}、dubai this = {12月= 1} = {me = 1}、誰かが= {1 =}のように、私は= {like = 1}、私は= {today = 1} }

助けてください!一部の文字列の組み合わせは表示されません。

Iはファイルから読み取られたI期待出力は:

{= {= 1}、ドバイ= {に、= {} = 1たいこの= 1の参照に来パスタ= {パスタ= 1}を準備する=パスタ= {パスタ= 1}は、= {パスタ= 1}のように、= {パスタ= 1} =準備中= 1、ある程度の氷= {cream = 1}、= {dubai = 1}、来る= {to = 1}、dubai this = {12月= 1} = {私= 1}、誰かが= {氷= 1}のように、私は= {like = 2}、see me = {今日は= 1}、{食べる= 1}を愛し、{ある= 1}を好き、{愛= 1}を愛する、{〜へ}を愛するだろう

答えて

0

仮にthを更新する電子originlコンテンツ

を上書きせずに現在の構造は

HashMap<String, Integer> counter = bigrams.get(readBigrams); 
if (null == counter) { 
    counter = new HashMap<String, Integer>(); 
    bigrams.put(readBigrams, counter); 
} 
Integer count = counter.get(read2); 
counter.put(read2, count == null ? 1 : count + 1); 
+0

bigrams.put(readBigrams, new HashMap<String, Integer>()); bigrams.get(readBigrams).put(read2, (count == null) ? 1 : count+1); 

を交換してくださいありがとうございました。それはうまくいった。 –

+0

今、私は確率を計算するためにこれらの周波数にアクセスできるようにしたい。あなたがそのようなコードを書く方法について私を助けてくれますか?例えば;ハッシュマップのキーペアの1つは、「= {to = 1、some = 1}が好きです。これから私は、文字列 "to"または "some"がどれくらいの回数文字列が "好きだろう"か、そのような方法で確率を決定するかを伝えることができるようにしたい。 –

関連する問題