package udacity.storm;
import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.StormSubmitter;
import backtype.storm.task.ShellBolt;
import backtype.storm.topology.IRichBolt;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.topology.base.BaseRichBolt;
import backtype.storm.topology.base.BaseRichSpout;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
import udacity.storm.spout.RandomSentenceSpout;
import backtype.storm.utils.Utils;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.task.OutputCollector;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import com.lambdaworks.redis.RedisClient;
import com.lambdaworks.redis.RedisConnection;
import udacity.storm.spout.RandomSentenceSpout;
import udacity.storm.tools.SentimentAnalyzer;
public class TopWords extends BaseRichBolt
{
private OutputCollector collector;
private Map<String, Integer> countNouns;
private Map<String, Integer> countVerbs;
private Map<String, Integer> countDO;
private Map<String, Integer> SentimentDistribution;
Integer val;
Integer maxNoun = 0;
Integer maxVerb = 0;
Integer maxDO = 0;
String mNoun = "";
String mVerb = "";
String mDO = "";
double alpha;
@Override
public void prepare(
Map map,
TopologyContext topologyContext,
OutputCollector outputCollector
)
{
collector = outputCollector;
countNouns = new HashMap<String, Integer>();
countVerbs = new HashMap<String, Integer>();
countDO = new HashMap<String, Integer>();
SentimentDistribution = new HashMap<String, Integer>();
alpha = 0.2;
}
public double getAvg(String county)
{
double sum = 0;
double total_count = 0.001;
for(int i = -1; i< 2; i++)
{
if(SentimentDistribution.containsKey(county+" "+String.valueOf(i)))
{
sum = sum + (SentimentDistribution.get(county+" "+String.valueOf(i))*(i+1.0)/3.0);
total_count = total_count + SentimentDistribution.get(county+" "+String.valueOf(i));
}
}
return sum/total_count;
}
public void execute(Tuple tuple)
{
String tweet = tuple.getStringByField("original-tweet");
String tweetWord = tuple.getStringByField("original-tweet");
String noun = tuple.getStringByField("noun");
String verb = tuple.getStringByField("verb");
String dO = tuple.getStringByField("object");
String county = (String) tuple.getStringByField("county_id");
String url = tuple.getStringByField("url");
String matchedEmoticon = tuple.getStringByField("matchedEmoticon");
int matchedEmoticonScore = tuple.getIntegerByField("matchedEmoticonScore");
int sentiment = tuple.getIntegerByField("sentiment");
String sentimentKey = county + " " + String.valueOf(sentiment);
double reportSentiment = 0.5;
//SentimentAnalyzer.findSentiment(tweet);
System.out.println("\t\tTopWords\tDEBUG Read Values: " + noun + ", " + verb + ", " + dO);
if (SentimentDistribution.get(sentimentKey) == null){
SentimentDistribution.put(sentimentKey,0);
}
SentimentDistribution.put(sentimentKey, SentimentDistribution.get(sentimentKey) + 1);
if(matchedEmoticonScore == 0){
reportSentiment = Math.max(Math.min(1.0, getAvg(county)*3), 0.0);
}
else
{
reportSentiment = (matchedEmoticonScore-1)/4.0;
}
System.out.println("\t\tTopWords\tDEBUG Read Values: " + noun + ", " + verb + ", " + dO + ", reportSentiment: " + String.valueOf(reportSentiment) + ", URL : " + url);
/*
if (countNouns.get(noun) == null){
countNouns.put(noun,1);
mNoun = noun;
}else{
val = countNouns.get(noun) + 1;
if (val > maxNoun && noun.length() > 0) {
maxNoun = val;
mNoun = noun;
}
countNouns.put(noun,val);
}
if (countVerbs.get(verb) == null){
countVerbs.put(verb,1);
mVerb = verb;
}else{
val = countVerbs.get(verb)+1;
if (val > maxVerb && verb.length() > 0){
maxVerb = val;
mVerb = verb;
}
countVerbs.put(verb,val);
}
if (countDO.get(dO) == null){
countDO.put(dO, 1);
mDO = dO;
}else{
val = countDO.get(dO)+1;
if (val > maxDO && dO.length() > 0){
maxDO = val;
mDO = dO;
}
countDO.put(dO,val);
}
*/
System.out.println("\t\tTopWords\tDEBUG EMIT Tweet " + tweetWord + ", matcedEmoticon: " + matchedEmoticon + ", sentimentKey: " + sentimentKey + ", reportSentiment: " + reportSentiment);
collector.emit(new Values(tweet, tweetWord, mNoun, mVerb, mDO, county, url, matchedEmoticonScore, matchedEmoticon, reportSentiment));
}
@Override
public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer)
{
outputFieldsDeclarer.declare(
new Fields("tweet", "tweetWord", "noun", "verb" , "do", "county_id", "url", "matchedEmoticonScore", "matchedEmoticon", "sentiment"));
}
}