Advertisement
Guest User

Untitled

a guest
Sep 19th, 2011
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.66 KB | None | 0 0
  1.         public static void main(String[] args) throws Exception {
  2.            
  3.            
  4.             CommandLine cmdLine;
  5.             try {
  6.                 cmdLine = processArgs(args);
  7.             }
  8.             catch (Exception e) {
  9.                 return;
  10.             }
  11.            
  12.             int n = Integer.parseInt(cmdLine.getOptionValue("n"));
  13.             String fName = cmdLine.getOptionValue("f");
  14.             String outFileName = cmdLine.getOptionValue("o");
  15.             boolean allNGrams = false;
  16.            
  17.             long keepMax = 0;
  18.             if(cmdLine.hasOption("max")) {
  19.                 keepMax =  Long.parseLong(cmdLine.getOptionValue("m"));
  20.             }
  21.            
  22.            
  23.             System.out.println("Counting items...");
  24.             BufferedReader inputStream = new BufferedReader(new InputStreamReader(new FileInputStream(fName),"UTF8"));
  25.             long numItems = 0;
  26.             while(true) {
  27.                 String line1 = inputStream.readLine();
  28.                 if(line1==null) {break;}
  29.                 String line2 = inputStream.readLine();
  30.                 if(line2==null) {break;}
  31.                 numItems++;
  32.             }
  33.             System.out.println(numItems + " items counted");
  34.             inputStream.close();
  35.            
  36.             long totalNum = 0;
  37.             long numSentences = 0;
  38.            
  39.             Map<String, Long> ngramHash = new HashMap();
  40.            
  41.             inputStream = new BufferedReader(new InputStreamReader(new FileInputStream(fName),"UTF8"));
  42.            
  43.             ProgressTimer myTimer = new ProgressTimer(numItems);
  44.             double numSentenceTokens = 0;
  45.            
  46.            
  47.             Map<Long, Set<String>> freqMap = new TreeMap();
  48.            
  49.             while (true) {
  50.                 // The file consists of line-couples:
  51.                 // First line contains a frequency number
  52.                 String freqString = inputStream.readLine();
  53.                 if(freqString==null) {break;}
  54.                 long sentenceFreq=0;
  55.                 try { sentenceFreq = Long.parseLong(freqString); }
  56.                 catch (Exception exp) { break; }
  57.                 // And second line contains a sentence
  58.                 String sentenceString = inputStream.readLine();
  59.                 if(sentenceString==null) {break;}
  60.                 // This means that the sentence just read occurs sentenceFreq times
  61.  
  62.                 StringTokenizer tokenizer = new StringTokenizer(sentenceString);
  63.                 // q is used for storing the n-gram
  64.                 Queue<String> q = new LinkedList<String>();
  65.                 while (tokenizer.hasMoreTokens()) {
  66.                     String token = tokenizer.nextToken();
  67.                     numSentenceTokens++;
  68.                     q.add(token);
  69.                     if (q.size() >= n) {
  70.                         String nGram = q.poll();
  71.                         for (int i=0; i<n-1; i++) {
  72.                             String gram = q.poll();
  73.                             nGram = nGram + " " + gram;
  74.                             q.add(gram);
  75.                         }
  76.                         Long prevVal = ngramHash.get(nGram);
  77.                         if (prevVal==null) { prevVal = new Long(0); }
  78.                         Long newVal = prevVal + sentenceFreq;
  79.                         ngramHash.put(nGram, newVal);
  80.  
  81.                         // If we want to keep only the keepMax most frequent entries:
  82.                         if (keepMax > 0) {
  83.                             // here we maintain a frequency map which maps frequencies
  84.                             // to sets of strings. Whenever the main ngramHash map is updated
  85.                             // the freqMap is also updated.
  86.                             if (prevVal != 0L) {
  87.                                 Set prevSet = freqMap.get(prevVal);
  88.                                 prevSet.remove(nGram);
  89.                                 if (prevSet.isEmpty()) {freqMap.remove(prevVal); prevSet = null;}
  90.                             }
  91.                             Set newSet = freqMap.get(newVal);
  92.                             if (newSet == null) {
  93.                                 newSet = new LinkedHashSet();
  94.                                 freqMap.put(newVal, newSet);
  95.                             }
  96.                             newSet.add(nGram);
  97.  
  98.                             // If our main hashmap exceeds the keepMax size, we remove one of its lowest-
  99.                             // frequent entries - of course, we also update freqMap
  100.                             if (ngramHash.size() > keepMax) {
  101.                                 Iterator <Set <String>> it = freqMap.values().iterator();
  102.                                 if (it.hasNext()) {
  103.                                     Set <String>lowestFreqStrings = it.next();
  104.                                     Iterator <String> it2 = lowestFreqStrings.iterator();
  105.                                     String strToRemove = it2.next();
  106.                                     it2.remove();
  107.                                     ngramHash.remove(strToRemove);
  108.                                     if (lowestFreqStrings.isEmpty()) {
  109.                                         it2 = null;
  110.                                         it.remove();
  111.                                     }
  112.                                 }
  113.                             }
  114.                         }
  115.                     }
  116.                     token = null;
  117.  
  118.                 }
  119.                 q = null;
  120.                 tokenizer = null;
  121.                 sentenceString = null;
  122.                 freqString = null;
  123.                
  124.                 totalNum += sentenceFreq;
  125.                 numSentences++;
  126.                 if (myTimer.printProgress(numSentences, "MapSize: " + ngramHash.size() + " FreqMapSize:" + freqMap.size())) {
  127.                     Iterator <Set <String>>it3 = freqMap.values().iterator();
  128.                     int sumItems = 0;
  129.                     while(it3.hasNext()) {
  130.                         Set <String> currSet = it3.next();
  131.                         sumItems += currSet.size();
  132.                     }
  133.                     float avg = new Float(sumItems) / new Float (freqMap.size());
  134.                     System.out.println("Avg freqmap size:"+avg + " Total strings in freqmap:" + sumItems);
  135.                 }
  136.                
  137.             }
  138.             inputStream.close();
  139.             System.out.println(numSentences + " unique sentences counted");
  140.             System.out.println(totalNum + " sentence instances counted");
  141.             System.out.println((numSentenceTokens / (new Double(numSentences))) + " tokens / sentence on average");
  142.            
  143.             Iterator it = ngramHash.entrySet().iterator();
  144.             List<Tuple> ngramList = new ArrayList();
  145.            
  146.             System.out.println("Converting hashMap to ArrayList for sorting...");
  147.             while (it.hasNext()) {
  148.                 Map.Entry pairs = (Map.Entry)it.next();
  149.                 ngramList.add(new NGramCounter.Tuple(pairs.getKey(), (Long)pairs.getValue()));
  150.                 it.remove();
  151.             }
  152.             System.out.println("Sorting...");
  153.             Collections.sort(ngramList, Collections.reverseOrder());
  154.            
  155.             System.out.println("Saving to " + outFileName );
  156.             Writer out =    new BufferedWriter(new OutputStreamWriter(
  157.                     new FileOutputStream(outFileName), "UTF-8"));
  158.            
  159.             for (Tuple<String> t: ngramList) {
  160.                 out.write(String.valueOf(t.second) + "\n");
  161.                 out.write(t.first + "\n");
  162.             }
  163.            
  164.             out.close();
  165.             System.out.println("Done");
  166.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement