|
|
- 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<Sentence> readFile(String filename) {
- List<Sentence> sentences = new LinkedList<Sentence>();
- if( filename == null ){ return sentences; }
-
- List<String> 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<Word> allWords(List<Sentence> sentences) {
- Set<Word> words = new LinkedHashSet<Word>();
-
- 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<String, Double> calculateScores(Set<Word> words) {
-
- Map<String, Double> scores = new HashMap<String, Double>();
- 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<String, Double> 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<Sentence> sentences = Analyzer.readFile(filename);
- Set<Word> words = Analyzer.allWords(sentences);
- Map<String, Double> wordScores = Analyzer.calculateScores(words);
- double score = Analyzer.calculateSentenceScore(wordScores, sentence);
- System.out.println("The sentiment score is " + score);
- }
- }
|