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 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)!")