209 lines
16 KiB
Python
209 lines
16 KiB
Python
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)!")
|