import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;

import edu.stanford.nlp.ling.CoreLabel;
import edu.stanford.nlp.ling.TaggedWord;
import edu.stanford.nlp.parser.lexparser.LexicalizedParser;
import edu.stanford.nlp.process.CoreLabelTokenFactory;
import edu.stanford.nlp.process.PTBTokenizer;
import edu.stanford.nlp.process.TokenizerFactory;
import edu.stanford.nlp.trees.GrammaticalStructure;
import edu.stanford.nlp.trees.GrammaticalStructureFactory;
import edu.stanford.nlp.trees.PennTreebankLanguagePack;
import edu.stanford.nlp.trees.Tree;
import edu.stanford.nlp.trees.TreebankLanguagePack;
import edu.stanford.nlp.trees.TypedDependency;

class KeywordCounter {
	public static void main(String[] args) throws Exception {
		
		HashMap<String, Integer> map = new HashMap<>();

		File file = new File(System.getProperty("user.dir") + "/Processed/ProcessedF.txt");
		FileReader fr = new FileReader(file);
		BufferedReader br = new BufferedReader(fr);
		FileWriter wr = new FileWriter("NNS_kw_in_F_Reqs.txt");

		String text = "";
		int i = 0;
		while ((text = br.readLine()) != null) {
			i++;
			System.out.println(i);

			TreebankLanguagePack tlp = new PennTreebankLanguagePack();
			GrammaticalStructureFactory gsf = tlp.grammaticalStructureFactory();
			LexicalizedParser lp = LexicalizedParser.loadModel("edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz");
			lp.setOptionFlags(new String[] { "-maxLength", "500", "-retainTmpSubcategories" });
			TokenizerFactory<CoreLabel> tokenizerFactory = PTBTokenizer.factory(new CoreLabelTokenFactory(), "");
			List<CoreLabel> wordList = tokenizerFactory.getTokenizer(new StringReader(text)).tokenize();
			Tree tree = lp.apply(wordList);
			GrammaticalStructure gs = gsf.newGrammaticalStructure(tree);
			Collection<TypedDependency> tdl = gs.typedDependenciesCCprocessed(true);

			ArrayList<TaggedWord> words = tree.taggedYield();

			for (TaggedWord taggedWord : words) {
				String tag = taggedWord.tag();
				String word = taggedWord.word().toLowerCase();
				if (tag.equalsIgnoreCase("NNS")) {
					if (map.containsKey(word) == false) {
						map.put(word, 1);
					} else {
						int counter = map.get(word);
						map.replace(word, counter + 1);
					}
				}
			}
		}

		int sum = 0;
		Set<Entry<String, Integer>> set = map.entrySet();
		for (Entry<String, Integer> entry : set) {
			sum = sum + entry.getValue();
			wr.write(entry.getKey() + "," + entry.getValue() + "\n");
			wr.flush();
		}
		System.out.println(sum);
		br.close();
		wr.close();
		// Main.writeImage(tree,tdl, "image.png",3);
	}
}