diff --git a/emojiParser.py b/emojiParser.py index 83a2b5d..efe783b 100755 --- a/emojiParser.py +++ b/emojiParser.py @@ -3,21 +3,21 @@ # @Author: KevinMidboe # @Date: 2017-07-29 11:56:24 # @Last Modified by: KevinMidboe -# @Last Modified time: 2017-07-29 18:36:55 +# @Last Modified time: 2017-07-30 10:31:52 from fuzzywuzzy import process -# Find the first word, if it is a noun or a adjective. -# Remove the adjective and split if there is a AND -# Then match the first noun to list and add that emoji -# and then match the second to list and add that emoji -# REGEX this bitch up +# Find the first word, if it is a noun or a adjective. ✔️ +# Remove the adjective and split if there is a AND ✔️ +# Then match the first noun to list and add that emoji ✔️ +# and then match the second to list and add that emoji ✔️ +# REGEX this bitch up symbol_table = { 'clear sky': '☀️', 'fair': '🌤', 'partly cloudy': '⛅️', - 'cloudy': '☁️', + 'cloudy': ' ☁️ ', 'thunder': '⚡️', 'rain showers': '🌦', @@ -35,14 +35,14 @@ symbol_table = { } severity = { - 'rain': ['💧', ' ☂️', ' ☔️'], + 'rain': ['', ' ☂️', ' ☔️'], 'sleet': [' 💦 ', ' 💧 ', ' 💧 💦 '], 'snow': [' ❄️ ', ' ❄️ ❄️ ', ' ❄️ ❄️ ❄️ '] } class EmojiParser(object): def __init__(self, condition_text): - self.condition_expression = condition_text + self.condition_expression = condition_text.lower() self.severity = None self.nouns = [] @@ -55,20 +55,33 @@ class EmojiParser(object): # Splits and lowers the condition text for easier parsing def splitCondition(self, condition): - condition = condition.lower() return condition.split() + # Takes a input or uses condition_expression to find adjective in sentence def findAdjective(self, sentence=None): if sentence is None: sentence = self.condition_expression + # Splits and iterates over each word in sentence expression = self.splitCondition(sentence) for word in expression: if word in self.weather_adjectives: + # Return the word if matched with weather_adjectives return word return None + # Removes the first adjective in the a given sentence + def removeAdjective(self): + adjective = self.findAdjective() + if adjective: # Adjective is not None + expression = self.splitCondition(self.condition_expression) + expression.remove(adjective) + return ' '.join(expression) + else: + return self.condition_expression + + def severityValue(self): adjective = self.findAdjective() @@ -77,61 +90,64 @@ class EmojiParser(object): else: self.severity = self.weather_adjectives['normal'] - - def removeAdjective(self): - adjective = self.findAdjective() - if adjective: - expression = self.splitCondition(self.condition_expression) - expression.remove(adjective) - return ' '.join(expression) - else: - return self.condition_expression - def findWeatherTokens(self): + # If present removes the leading adjective sentence = self.removeAdjective() + # If multiple tokens/weather_nouns split all between the 'and' if 'and' in sentence: self.nouns = sentence.split(' and ') else: self.nouns = [sentence] + # Use the symbol_table to convert the forcast name to emoji def emojify(self, noun): return symbol_table[noun] + # Does as emojify above, but iterates over a list if multiple elements def emojifyList(self, noun_list): returnList = [] + # TODO use more like a map function? for noun in noun_list: returnList.append(self.emojify(noun)) return ' '.join(returnList) + def findPrimaryForcast(self): + # Copies the contents not the refrence to the list + noun_list = list(self.nouns) + forcast = noun_list.pop(0) + + # Translates to emoji once here instead of twice below + forcast_emoji = self.emojify(forcast) + + if forcast in severity: + return ('%s %s' % (forcast_emoji, severity[forcast])) + else: + return forcast_emoji # Trying to analyze the semantics of the condition text def emojifyWeatherForecast(self): + # Finds the tokens/nouns of weather for the given input text and severity value self.findWeatherTokens() - - noun_list = self.nouns + self.severityValue() - primary_forcast = noun_list.pop(0) - primary_severity = severity[primary_forcast][self.severity] - secondary_forcast = self.emojifyList(noun_list) + primary_forcast = self.findPrimaryForcast() + secondary_forcast = self.emojifyList(self.nouns[1:]) - return ('%s %s %s' % (self.emojify(primary_forcast), primary_severity, secondary_forcast)) + return ('%s %s' % (primary_forcast, secondary_forcast)) def convertSematicsToEmoji(self): - self.severityValue() - emojiForcast = self.emojifyWeatherForecast() - return emojiForcast + return self.emojifyWeatherForecast() def main(): - emojiParser = EmojiParser('Light rain') - emojiParser.convertSematicsToEmoji() - print(emojiParser) + emojiParser = EmojiParser('Cloudy') + print(emojiParser.convertSematicsToEmoji()) if __name__ == '__main__':