mirror of
https://github.com/KevinMidboe/termForecast.git
synced 2025-10-29 18:00:17 +00:00
Moved all script files to main term_forecast folder.
This commit is contained in:
0
term_forecast/__init__.py
Executable file
0
term_forecast/__init__.py
Executable file
BIN
term_forecast/conf/GeoLite2-City.mmdb
Normal file
BIN
term_forecast/conf/GeoLite2-City.mmdb
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 51 MiB |
154
term_forecast/emojiParser.py
Executable file
154
term_forecast/emojiParser.py
Executable file
@@ -0,0 +1,154 @@
|
||||
#!/usr/bin/env python3.6
|
||||
# -*- coding: utf-8 -*-
|
||||
# @Author: KevinMidboe
|
||||
# @Date: 2017-07-29 11:56:24
|
||||
# @Last Modified by: KevinMidboe
|
||||
# @Last Modified time: 2017-07-30 13:17:19
|
||||
|
||||
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
|
||||
|
||||
symbol_table = {
|
||||
'clear sky': '☀️',
|
||||
'fair': '🌤',
|
||||
'partly cloudy': '⛅️',
|
||||
'cloudy': ' ☁️ ',
|
||||
'thunder': '⚡️',
|
||||
|
||||
'rain showers': '🌦',
|
||||
'rain': '🌧',
|
||||
'sleet showers': '🌦 💦',
|
||||
'sleet': '🌨 💦',
|
||||
'snow showers': '⛅ ❄️',
|
||||
'snow': '🌨',
|
||||
|
||||
'rain': '🌧',
|
||||
'sleet': '🌧',
|
||||
'snow': '🌨',
|
||||
|
||||
'showers': '🌤'
|
||||
}
|
||||
|
||||
severity = {
|
||||
'rain': ['', ' ☂️', ' ☔️'],
|
||||
'sleet': [' 💦 ', ' 💧 ', ' 💧 💦 '],
|
||||
'snow': [' ❄️ ', ' ❄️ ❄️ ', ' ❄️ ❄️ ❄️ ']
|
||||
}
|
||||
|
||||
class EmojiParser(object):
|
||||
def __init__(self, condition_text):
|
||||
self.condition_expression = condition_text.lower()
|
||||
self.severity = None
|
||||
self.nouns = []
|
||||
|
||||
self.weather_nouns = ['cleary sky', 'fair', 'cloudy', 'rain', 'rain showers', 'sleet',
|
||||
'sleet showers', 'snow showers', 'thunder', 'snow']
|
||||
self.weather_adjectives = {'light': 0, 'normal': 1, 'heavy': 2}
|
||||
|
||||
def __str__(self):
|
||||
return str([self.condition_expression, self.severity, self.nouns])
|
||||
|
||||
# Splits and lowers the condition text for easier parsing
|
||||
def splitCondition(self, condition):
|
||||
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()
|
||||
|
||||
if adjective:
|
||||
self.severity = self.weather_adjectives[adjective]
|
||||
else:
|
||||
self.severity = self.weather_adjectives['normal']
|
||||
|
||||
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 forecast 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 findPrimaryForecast(self):
|
||||
# Copies the contents not the refrence to the list
|
||||
noun_list = list(self.nouns)
|
||||
forecast = noun_list.pop(0)
|
||||
|
||||
# Translates to emoji once here instead of twice below
|
||||
forecast_emoji = self.emojify(forecast)
|
||||
|
||||
if forecast in severity:
|
||||
return ('%s %s' % (forecast_emoji, severity[forecast]))
|
||||
else:
|
||||
return forecast_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()
|
||||
self.severityValue()
|
||||
|
||||
primary_forecast = self.findPrimaryForecast()
|
||||
secondary_forecast = self.emojifyList(self.nouns[1:])
|
||||
|
||||
return ('%s %s' % (primary_forecast, secondary_forecast))
|
||||
|
||||
|
||||
def convertSematicsToEmoji(self):
|
||||
return self.emojifyWeatherForecast()
|
||||
|
||||
|
||||
def main():
|
||||
emojiParser = EmojiParser('Cloudy')
|
||||
print(emojiParser.convertSematicsToEmoji())
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
40
term_forecast/loadingAnimation.py
Executable file
40
term_forecast/loadingAnimation.py
Executable file
@@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env python3.6
|
||||
# -*- coding: utf-8 -*-
|
||||
# @Author: KevinMidboe
|
||||
# @Date: 2017-07-30 13:53:38
|
||||
# @Last Modified by: KevinMidboe
|
||||
# @Last Modified time: 2017-07-30 13:53:46
|
||||
|
||||
import itertools
|
||||
from threading import Thread
|
||||
from time import sleep
|
||||
from sys import stdout
|
||||
|
||||
class LoadingAnimation(object):
|
||||
def __init__(self):
|
||||
self.done = False
|
||||
|
||||
def start(self):
|
||||
t = Thread(target=self.animate)
|
||||
t.start()
|
||||
|
||||
def animate(self):
|
||||
for c in itertools.cycle(['|', '/', '-', '\\']):
|
||||
if self.done:
|
||||
break
|
||||
stdout.write('\rFetching ' + c)
|
||||
stdout.flush()
|
||||
sleep(0.1)
|
||||
|
||||
def stop(self):
|
||||
self.done = True
|
||||
|
||||
def main():
|
||||
loadingAnimation = LoadingAnimation()
|
||||
loadingAnimation.start()
|
||||
sleep(2)
|
||||
loadingAnimation.stop()
|
||||
stdout.write('\rTemp \n')
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user