public FeatureOpinion parseReview(Review reviewObj, FeatureOpinion fe)
            throws IOException {
        String sentence = null;
        SentimentWords s = new SentimentWords();
        BreakIterator iterator = BreakIterator.getSentenceInstance(Locale.US);
        String reviewText = reviewObj.reviewText;
        iterator.setText(reviewText);
        int start = iterator.first();
        for (int end = iterator.next(); end != BreakIterator.DONE; start = end, end = iterator
                .next()) {
            sentence = reviewText.substring(start, end);
            sentence = sentence.replaceAll("[^a-zA-Z]+$", "");
            System.out.println(sentence);

            this.posByIndex = new HashMap<Integer, String>();
            this.opinionIndeces = new HashMap<Integer, Boolean>();
            int indexCount = 1;
            Tree tree = parser.parse(sentence.toLowerCase(Locale.US));
            List<Tree> leaves = tree.getLeaves();
            // Print words and Pos Tags
            for (Tree leaf : leaves) {
                Tree parent = leaf.parent(tree);
                System.out.print(leaf.label().value() + "-"
                        + parent.label().value() + " ");
                if (parent.label().value().startsWith("JJ")
                        || parent.label().value().startsWith("RB")) {
                    if (s.isPositive(leaf.label().value())) {
                        this.opinionIndeces.put(indexCount, true);
                    } else if (s.isNegative(leaf.label().value())) {
                        this.opinionIndeces.put(indexCount, false);
                    }
                }
                this.posByIndex.put(indexCount, parent.label().value());
                indexCount++;
            }
            System.out.println();
            System.out.println("Opinion Indeces " + this.opinionIndeces);
            TreebankLanguagePack tlp = new PennTreebankLanguagePack();
            GrammaticalStructureFactory gsf = tlp.grammaticalStructureFactory();
            GrammaticalStructure gs = gsf.newGrammaticalStructure(tree);
            List<TypedDependency> tdl = gs.typedDependenciesCCprocessed();
            // Handling negation - 2 words before and after
            Set<Integer> negatedIndeces = new HashSet<Integer>();
            for (TypedDependency t : tdl) {
                if (t.reln().toString().trim() == "neg") {
                    int notIndex = t.dep().index();
                    for (int i = notIndex - 2; i < notIndex + 3; i++) {
                        if (this.opinionIndeces.containsKey(i)) {
                            boolean val = this.opinionIndeces.get(i);
                            this.opinionIndeces.put(i, !val);
                            negatedIndeces.add(i);
                        }
                    }
                }
            }
            if (fe == null)
                fe = new FeatureOpinion(this.posByIndex, tdl,
                        this.opinionIndeces, reviewObj, negatedIndeces);
            else
                fe.updateForNewSentence(this.posByIndex, tdl,
                        this.opinionIndeces, reviewObj, negatedIndeces);
            System.out.println("TDL : " + tdl);
            if (this.opinionIndeces.size() > 0) {
                fe.extractFeaturesFromOpinions();
            }
        }
        return fe;
    }