Files
999/scripts/generate_words.py
T
2026-08-31 12:35:13 +05:00

209 lines
16 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)!")