import java.util.List; import java.util.LinkedList; import java.util.Map; import java.util.HashMap; import java.util.Scanner; import java.util.Set; import java.util.LinkedHashSet; import java.nio.file.Paths; import java.nio.file.Files; import java.io.IOException; import java.lang.NumberFormatException; /* * SD2x Homework #3 * Implement the methods below according to the specification in the assignment description. * Please be sure not to change the method signatures! */ public class Analyzer { /* * Implement this method in Part 1 */ public static Sentence parseLine(String line){ int negative = 1; if(line.length() > 0){ if(line.charAt(0) == '-'){ negative = -1; line = line.substring(1); } } if(line.length() < 3){ return null; } int rating; try{ rating = Integer.parseInt(line.substring(0,1)); }catch(NumberFormatException e){ return null; } if(-2 > rating || 2 < rating || line.charAt(1) != ' '){ return null; } return new Sentence(rating * negative, line.substring(2)); } public static List readFile(String filename) { List sentences = new LinkedList(); if( filename == null ){ return sentences; } List lines; try{ lines = Files.readAllLines(Paths.get(filename)); }catch(IOException e){ return sentences; } for(String line : lines){ Sentence sentence = parseLine(line); if(sentence == null){ continue; } sentences.add(sentence); } return sentences; } public static Set allWords(List sentences) { Set words = new LinkedHashSet(); if(sentences == null){ return words; } if(sentences.size() == 0){ return words; } for(Sentence s : sentences){ if(s == null){ continue; } String[] elements = s.getText().toLowerCase().split(" "); for(int i = 0; i < elements.length; i++){ if(elements[i] == null){ continue; } if(!Character.isLetter(elements[i].charAt(0))){ continue; } Word word = new Word(elements[i]); for(int j = i + 1; j < elements.length; j++){ if(elements[j] == null){ continue; } if(elements[i].equals(elements[j])){ word.count++; elements[j] = null; // Set matching elements to null, should increase performance slightly } } words.add(word); } } return words; } /* * Implement this method in Part 3 */ public static Map calculateScores(Set words) { Map scores = new HashMap(); if(words == null){ return scores; } if(words.isEmpty()){ return scores; } for(Word w : words){ if( w == null ){ continue; } scores.put(w.getText(),w.calculateScore()); } return scores; } /* * Implement this method in Part 4 */ public static double calculateSentenceScore(Map wordScores, String sentence) { double total = 0; int invalidWords = 0; if(wordScores == null || sentence == null){ return total; } if(wordScores.isEmpty() || sentence.isEmpty()){ return total; } String[] elements = sentence.toLowerCase().split(" "); for(int i = 0; i < elements.length; i++){ if(!Character.isLetter(elements[i].charAt(0))){ invalidWords++; continue; } if(wordScores.containsKey(elements[i])){ total += wordScores.get(elements[i]); } } if(elements.length - invalidWords == 0){ // In case the whole sentence is invalid return 0; } return total / (elements.length - invalidWords); // this line is here only so this code will compile if you don't modify it } /* * This method is here to help you run your program. Y * You may modify it as needed. */ public static void main(String[] args) { if (args.length == 0) { System.out.println("Please specify the name of the input file"); System.exit(0); } String filename = args[0]; System.out.print("Please enter a sentence: "); Scanner in = new Scanner(System.in); String sentence = in.nextLine(); in.close(); List sentences = Analyzer.readFile(filename); Set words = Analyzer.allWords(sentences); Map wordScores = Analyzer.calculateScores(words); double score = Analyzer.calculateSentenceScore(wordScores, sentence); System.out.println("The sentiment score is " + score); } }