feat: initial release of Oracle 999 divination app

This commit is contained in:
Alma Alexyz
2026-08-31 12:35:13 +05:00
commit 28b85061b9
143 changed files with 16073 additions and 0 deletions
+208
View File
@@ -0,0 +1,208 @@
import urllib.request
import zipfile
import io
import json
print("Fetching RNC frequency dictionary...")
url = 'http://dict.ruslang.ru/Freq2011.zip'
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
content = urllib.request.urlopen(req).read()
z = zipfile.ZipFile(io.BytesIO(content))
text = z.read('freqrnc2011.csv').decode('utf-8')
lines = text.strip().split('\n')[1:]
entries = []
for line in lines:
parts = line.strip().split('\t')
if len(parts) >= 3:
lemma, pos, freq = parts[0], parts[1], float(parts[2])
entries.append((lemma, pos, freq))
entries.sort(key=lambda x: x[2], reverse=True)
pos_map = {
's': 'существительное',
'v': 'глагол',
'a': 'прилагательное',
'adv': 'наречие',
'spro': 'местоимение',
'apro': 'местоименное прил.',
'pr': 'предлог',
'conj': 'союз',
'part': 'частица',
'num': 'числительное',
'intj': 'междометие',
'parenth': 'вводное слово',
'advpro': 'наречие-местоимение',
'praed': 'предикатив',
}
category_map = {
's': 'Предмет / Понятие',
'v': 'Действие / Состояние',
'a': 'Признак / Свойство',
'adv': 'Обстоятельство',
'spro': 'Местоимение',
'apro': 'Определение',
'pr': 'Предлог',
'conj': 'Союз',
'part': 'Частица',
'num': 'Число / Количество',
'intj': 'Эмоция / Восклицание',
'parenth': 'Вводная конструкция',
'advpro': 'Обстоятельство',
'praed': 'Состояние',
}
seen = {}
top_1000 = []
# First entry #000: 'ноль' or 'начало' or top seed
# Let's include 1000 words with IDs 0 to 999 (where 000 can be 'ноль' or top 1000 lemmas starting with 0..999)
# If 0..999, let's map top 1000 frequency words so index 0 is #000, 1 is #001 ... 999 is #999!
for lemma, raw_pos, freq in entries:
if lemma not in seen and len(lemma) > 0:
seen[lemma] = True
pos = pos_map.get(raw_pos, raw_pos)
cat = category_map.get(raw_pos, 'Общее')
top_1000.append({
'id': len(top_1000), # 0 .. 999
'word': lemma,
'pos': pos,
'raw_pos': raw_pos,
'category': cat,
'freq': round(freq, 1),
})
if len(top_1000) == 1000:
break
print(f"Generated {len(top_1000)} words (IDs {top_1000[0]['id']} to {top_1000[-1]['id']}).")
custom_examples = {
'и': ('Мы читали книги и слушали музыку.', 'Соединительный союз, связывает однородные члены или предложения.'),
'в': ('Мы вошли в просторную комнату.', 'Предлог, указывает на нахождение внутри или направление движения.'),
'не': ('Он не ожидал такого быстрого ответа.', 'Отрицательная частица, служит для отрицания действия или признака.'),
'на': ('Книга лежит на рабочем столе.', 'Предлог, указывает на поверхность или направление.'),
'я': ('Я с радостью помогу тебе с этим проектом.', 'Личное местоимение 1-го лица единственного числа.'),
'быть': ('Быть или не быть — вот в чём вопрос.', 'Глагол существования, бытия или связка в предложении.'),
'он': ('Он всегда держит своё слово.', 'Личное местоимение 3-го лица мужского рода.'),
'с': ('Мы пошли на прогулку с друзьями.', 'Предлог совместности, орудия действия или образа.'),
'что': ('Я знаю, что ты справишься отлично.', 'Относительное местоимение или подчинительный союз.'),
'а': ('Один читал, а другой слушал.', 'Противительный союз, выражающий сопоставление.'),
'по': ('Мы не спеша гуляли по вечернему парку.', 'Предлог, указывает на поверхность перемещения или соответствие.'),
'это': ('Это самый важный момент нашего путешествия.', 'Указательное местоимение, обозначает предмет или ситуацию.'),
'она': ('Она великолепно играет на фортепиано.', 'Личное местоимение 3-го лица женского рода.'),
'этот': ('Этот день запомнится надолго.', 'Указательное местоимение-прилагательное.'),
'к': ('Поезд плавно приближался к перрону.', 'Предлог направления, обращенности к кому-то или чему-то.'),
'но': ('Было трудно, но мы достигли цели.', 'Противительный союз, выражающий ограничение или противопоставление.'),
'они': ('Они вместе разработали новый алгоритм.', 'Личное местоимение 3-го лица множественного числа.'),
'мы': ('Мы уверены в успехе нашего дела.', 'Личное местоимение 1-го лица множественного числа.'),
'как': ('Он работал быстро, как настоящий мастер.', 'Сравнительный союз, наречие или союзное слово.'),
'из': ('Он достал старую книгу из шкафа.', 'Предлог, указывает на источник, происхождение или исходное место.'),
'у': ('У нас есть всё необходимое для старта.', 'Предлог принадлежности или нахождения рядом.'),
'который': ('Человек, который ищет, всегда найдёт.', 'Определительное местоимение, связывает части сложного предложения.'),
'то': ('Если погода будет хорошей, то мы поедем за город.', 'Указательное местоимение или союзная частица.'),
'за': ('Спасибо за твою поддержку и добрые слова.', 'Предлог причины, цели, следования или расположения позади.'),
'свой': ('Каждый мастер любит своё ремесло.', 'Притяжательное местоимение, указывает на принадлежность субъекту.'),
'весь': ('Весь день светило яркое солнце.', 'Определительное местоимение, означает полный охват или совокупность.'),
'год': ('Этот год принёс много полезных открытий.', 'Промежуток времени, равный 12 месяцам.'),
'от': ('Письмо пришло от старого друга.', 'Предлог удаления, источника, причины или авторства.'),
'так': ('Он сделал всё так, как договаривались.', 'Указательное наречие образа действия.'),
'о': ('Мы говорили о планах на будущее.', 'Предлог, указывает на предмет мысли или речи.'),
'один': ('Один в поле не воин, но вместе мы сила.', 'Числительное или местоимение со значением единичности.'),
'сказать': ('Он хотел сказать нечто очень важное.', 'Выразить мысль словами вслух.'),
'мочь': ('Каждый может научиться новому навыку.', 'Иметь физическую или практическую возможность сделать что-либо.'),
'человек': ('Человек познаёт мир через опыт и знания.', 'Живое разумное существо, индивид.'),
'такой': ('Такой результат превзошёл все ожидания.', 'Указательное местоимение со значением качества или подобия.'),
'только': ('Осталось решить только одну задачу.', 'Ограничительная частица со значением исключительности.'),
'себя': ('Нужно верить в себя и свои силы.', 'Возвратное местоимение, указывает на лицо субъекта.'),
'время': ('Время летит незаметно, когда занят любимым делом.', 'Форма протекания процессов и длительности событий.'),
'дело': ('Каждое доброе дело имеет значение.', 'Занятие, деятельность, работа или конкретный вопрос.'),
'жизнь': ('Жизнь полна удивительных возможностей.', 'Форма существования материи, бытие человека.'),
'день': ('Сегодня прекрасный солнечный день.', 'Сутки или светлое время суток.'),
'рука': ('Он протянул руку помощи товарищу.', 'Верхняя конечность человека или символ поддержки.'),
'работа': ('Качественная работа всегда ценится высоко.', 'Трудовая деятельность, процесс создания чего-либо.'),
'слово': ('Доброе слово и кошке приятно.', 'Единица языка, служащая для наименования понятий.'),
'место': ('Это место идеально подходит для отдыха.', 'Пространство или пункт нахождения.'),
'глаз': ('Его глаза светились искренней радостью.', 'Орган зрения человека или животного.'),
'лицо': ('На его лице появилась тёплая улыбка.', 'Передняя часть головы или облик человека.'),
'друг': ('Верный друг познаётся в беде и радости.', 'Близкий человек, связанный взаимным доверием.'),
'дом': ('Дом — это место, где тебя всегда ждут.', 'Жилое здание или уютное семейное пространство.'),
'знать': ('Важно знать свои сильные стороны.', 'Обладать информацией, опытом или пониманием.'),
'думать': ('Полезно глубоко думать над сложными задачами.', 'Мыслить, размышлять, иметь мнение.'),
'хороший': ('Хороший совет помогает принять верное решение.', 'Обладающий положительными качествами.'),
'новый': ('Новый проект открывает большие горизонты.', 'Впервые созданный, современный, недавно появившийся.'),
'большой': ('Большой успех складывается из малых шагов.', 'Значительный по размеру, объёму или влиянию.'),
}
def get_example_and_desc(item):
w = item['word']
p = item['raw_pos']
pos_ru = item['pos']
if w in custom_examples:
return custom_examples[w]
if p == 'v':
desc = f'Глагол, выражает действие или состояние ({w}).'
ex = f'Нужно вовремя {w}, чтобы достичь желаемого результата.'
elif p == 's':
desc = f'Существительное ({pos_ru}), обозначает предмет, лицо или абстрактное понятие.'
ex = f'Внимание к такому понятию, как «{w}», имеет ключевое значение.'
elif p == 'a':
desc = f'Прилагательное ({pos_ru}), описывает признак, свойство или качество.'
ex = f'Это был действительно {w} выбор для всей команды.'
elif p == 'adv' or p == 'advpro':
desc = f'Наречие ({pos_ru}), характеризует обстоятельство, степень или образ действия.'
ex = f'Они действовали {w}, добиваясь максимальной точности.'
elif p == 'num':
desc = f'Числительное ({pos_ru}), обозначает количество или порядок при счёте.'
ex = f'В списке значится {w} важных пунктов.'
elif p == 'spro' or p == 'apro':
desc = f'Местоимение ({pos_ru}), указывает на предмет, признак или лицо без называния.'
ex = f'Именно {w} играет решающую роль в этой ситуации.'
elif p == 'pr':
desc = f'Предлог ({pos_ru}), выражает синтаксические отношения между словами.'
ex = f'События развивались {w} заранее намеченному плану.'
elif p == 'conj':
desc = f'Союз ({pos_ru}), связывает слова или части сложного предложения.'
ex = f'Мы продолжили путь, {w} погода способствовала движению.'
elif p == 'part':
desc = f'Частица ({pos_ru}), придает оттенок смысла или модальности.'
ex = f'Это {w} то, о чём мы так долго говорили.'
else:
desc = f'Слово русского языка ({pos_ru}) с высокой частотой употребления.'
ex = f'Слово «{w}» входит в золотой фонд русской лексики.'
return ex, desc
dart_code = []
dart_code.append("// AUTO-GENERATED: 1000 Essential Russian Words Dataset (000 to 999)")
dart_code.append("// Source: Russian National Corpus Frequency Dictionary (Lyashevskaya & Sharoff)")
dart_code.append("import '../models/word_model.dart';\n")
dart_code.append("const List<WordItem> kRussianTop1000Words = [")
for item in top_1000:
ex, desc = get_example_and_desc(item)
w_clean = item['word'].replace('"', '\\"')
ex_clean = ex.replace('"', '\\"')
desc_clean = desc.replace('"', '\\"')
pos_clean = item['pos'].replace('"', '\\"')
cat_clean = item['category'].replace('"', '\\"')
dart_code.append(f" WordItem(")
dart_code.append(f" id: {item['id']},")
dart_code.append(f" word: \"{w_clean}\",")
dart_code.append(f" partOfSpeech: \"{pos_clean}\",")
dart_code.append(f" frequency: {item['freq']},")
dart_code.append(f" example: \"{ex_clean}\",")
dart_code.append(f" category: \"{cat_clean}\",")
dart_code.append(f" description: \"{desc_clean}\",")
dart_code.append(f" ),")
dart_code.append("];\n")
with open('lib/data/words_data.dart', 'w', encoding='utf-8') as f:
f.write('\n'.join(dart_code))
print("Successfully created lib/data/words_data.dart with exactly 1000 words (000..999)!")