import os import json import re import datetime import time from util import split_sen, rot_ru CWD = os.path.dirname(os.path.realpath(__file__)) def _data_sort_len(i): return len(i['text']) def _data_sort_date(i): return int(time.mktime(datetime.datetime.strptime(i['date'], '%d/%m/%y').timetuple())) # sort: 'len', 'date' def load_data(sort='len', sort_reverse=False, date=None, type=None): with open(os.path.join(CWD, "data.json")) as f: data = json.loads(f.read()) # stringify all types for k, v in enumerate(data): if 'type' in data[k]: data[k]['type'] = str(data[k]['type']) else: data[k]['type'] = '1' # ignore placeholders data = list(filter(lambda i: i['text'] != '', data)) # sort if sort == 'len': sort_f = _data_sort_len elif sort == 'date': sort_f = _data_sort_date else: raise Error("Unknown sort type " + str(sort)) # filter by date data = sorted(data, key=sort_f, reverse=sort_reverse) if date: data = list(filter(lambda i: 'date' in i and i['date'] == date, data)) if type: data = list(filter(lambda i: 'type' in i and i['type'] == str(type), data)) return data def clean_string(s, remove_junk=False): s = s.replace(')', ') ') s = re.sub(r'(\!|\.|\]|\,)([^\)])', r'\1 \2', s) #s = s.replace('/', ' ') s = s.upper() s = s.replace('/', ' ') s = re.sub(r'\s+', ' ', s).strip() junks = [ 'ВОЕННОЕ', 'ВЫШЕСТОЯЩИХ', 'ПРАВО', 'ПРАВИЛАМ ВОЙНЫ', 'ВЫПИСКА', 'КОНТРОЛЬ', 'ИХ', 'ПО', 'НАВЫКИ', 'С ВЫШЕСТОЯЩИМИ', #'ПРИСУТСТВИЕ', #'ЛИНЕЙНО', 'ИНСТРУКЦИИ', 'ЗАКОННО', 'ПОХЛЕБКА', 'СВЯЗЕЙ', 'ЖУЮЩЕГО ХРЯЩИ', 'ИНДЕКСИРОВАН БЕЗУКОРИЗНЕНННО', 'ИНДЕКСИРОВАН БЕЗУКОРИЗНЕННО', 'ОТКЛАДЫВАЕТСЯ ЛИНЕЙНО', 'УСТАЛИ СМОТРЯЩИХ', '- ЕГО ВЕЛИЧЕСТВО', 'ГУБЕРНИЯ', 'С ВЫШЕСТОЯЩИМИ КОНТРОЛЬ', 'С ЛОКАЦИИ', 'КАЗНЬ ВЫШЕСТОЯЩ', #'КАЗНЬ', 'ГУБЕРНИЯ', 'ПРОВЕРКИ', 'УСТАНОВЛЕНО', 'ПОБЕДИТЕЛЕМ', #'СТАЛЬНЫЕ', 'НЕРВЫ', 'ДАРОВАНО', #'ТРАНСПОРТИРОВКА', 'ОДОБРЕНО', 'ПРОЯВЛЕНИЯ', 'УЗАКОНЕНО', 'ИМЕЕТСЯ', 'ЗНАЛ', 'НЕ ПРИМЕЧЕНО', 'НА СЕВЕР', 'ПРИГОВОРИТЬ', 'ШЕСТВУЕМ', 'ДАГОН', 'ДА МЕРЗНУЩИЙ', 'КОФЕ', #'РЕАГИРОВАНИЕ', 'УКАЗАНО', '- ВЫСОКИЙ ТИТУЛ', 'ЗАКАЗ', 'ЧЕРТЫ ЛИЦА', # english 'SCHOOL ON THE RIGHT', 'WILL NOT ALLOW', 'FLYWHEEL', 'TRIUMPHANTLY', 'BEING USED', 'NICE', 'UMBRELLA', #'BIOROBOT', 'CONSERVATISM', 'WAS ESTABLISHED', 'WITH A PASSWORD', 'ANT', 'YEAR', 'RECOGNIZED', 'SEARCHED' #'LEGAL', #'FIGHTING' ] # только без пробелов junks_words = list(filter(lambda w: ' ' not in w, junks)) # только с пробелами junks_nwords = list(filter(lambda w: w not in junks_words, junks)) #print(junks_nwords) if remove_junk: s = s.split(' ') s = list(filter(lambda l: re.sub(r'\.|\!|,$', '', l) not in junks_words, s)) s = ' '.join(s) for j in junks_nwords: s = s.replace(j, '') s = s.replace('Х О Р Т И Ц А', 'Х_О_Р_Т_И_Ц_А') s = s.replace('ЯРОСЛАВСКАЯ ГУБЕРНИЯ', 'ЯРОСЛАВСКАЯ_ГУБЕРНИЯ') s = s.replace('ЩУКА В МЕШКЕ', 'ЩУКА_В_МЕШКЕ') s = s.replace('Ъ - ВЕЛИЧЕСТВЕННО', 'Ъ_-_ВЕЛИЧЕСТВЕННО') s = re.sub(r'\s+', ' ', s).strip() return s def decode(s, is_url=False): buf = '' for word in s.split(' '): word = word.strip() if word == '' or word == '!': continue if re.match(r'^\d+', word): buf += word elif is_url and word.endswith('://'): buf += word[0] buf += '://' else: letter = word[0] buf += letter return buf def decode2(s): buf = '' for s in re.split(r'[\?\.\!]+', s): s = s.strip() if s == '': continue words = s.split(' ') letter = words[1][0] buf += letter return buf def decode3(s): buf = '' for s in re.split(r'[\?\.\!]+', s): s = s.strip() s = s.replace(' ', '') s = s.replace('-', '') if not s: continue print(s) continue s = s.upper() if s[0] in ('Ш', 'Щ', 'И'): buf += s[0] elif s[4] == 'Й': buf += s[4] elif s[0] == 'И': buf += 'И' elif s[7] == 'М': buf += 'М' elif s[4] == 'А': buf += 'А' elif s[2] == 'Р': buf += 'Р' elif s[1] == 'У': buf += 'У' elif s[9] == 'Ю': buf += 'Ю' else: buf += '?' return buf def decode_2char_rot_minus3(s): lines = split_sen(s) buf = '' for line in lines: line = line.replace(' ', '').replace("'", '') if re.sub(r'[\.\!\?\\/]', '', line).isdigit(): buf += line continue buf += line[1] rots = rot_ru(buf, return_list=True) return rots[len(rots)-2] # s: source # t: type def decode_auto(s, t, reverse_decoded=False, remove_junk=True): if t == '1': s = clean_string(s, remove_junk=remove_junk) result = decode(s) elif t == '2': result = decode2(s) elif t == '3': result = decode3(s) elif t == '2char_rot-3': result = decode_2char_rot_minus3(s) if reverse_decoded: # reverse string result = result[::-1] return result