Суть задачи такова, мне нужно любыми средствами получить все русские слова длиной 1-4 буквы(некоторые буквы считаются тоже словами).
Что я сделал для этого.
Сначала мне пришла "гениальная" идея получить все слова которые подходят мне с помощью API Яндекс. Словаря.
для этого я написал вот такой код на питоне
spoilerimport os
import requests
import string
import itertools
from time import sleep
API_KEY = 'dict.1.1.20240515T180717Z.760d3993f5a6870f.77dd35e714f6ecd87cebe87a85ece37c94933acc'
API_URL = 'https://dictionary.yandex.net/api/v1/dicservice.json/lookup'
LANG = 'ru-ru'
PROGRESS_FILE = 'progress.txt'
VALID_WORDS_FILE = 'valid_words.txt'
def is_valid_word(word):
params = {
'key': API_KEY,
'lang': LANG,
'text': word
}
# Повторять три раза в случае неудачи связи
for _ in range(3):
try:
response = requests.get(API_URL, params=params)
if response.status_code == 200:
result = response.json()
return len(result.get('def', [])) > 0
else:
continue
except requests.RequestException:
sleep(1)
return False
def generate_russian_words():
alphabet = list('абвгдеёжзийклмнопрстуфхцчшщъыьэюя')
words = []
# Создание комбинаций для каждого количества символов от 1 до 4
for length in range(1, 5):
words.extend([''.join(candidate) for candidate in itertools.product(alphabet, repeat=length)])
return words
def load_progress():
if os.path.exists(PROGRESS_FILE):
with open(PROGRESS_FILE, 'r', encoding='utf-8') as f:
content = f.read().strip()
if content:
return int(content)
return 0
def save_progress(processed_words):
with open(PROGRESS_FILE, 'w', encoding='utf-8') as f:
f.write(str(processed_words))
def append_to_file(file_path, words):
with open(file_path, 'a', encoding='utf-8') as f:
for word in words:
f.write(f"{word}\n")
if __name__ == "__main__":
words = generate_russian_words()
valid_words = []
total_words = len(words)
processed_words = load_progress()
print(f"Возобновляем с {processed_words} из {total_words} комбинаций.")
for i, word in enumerate(words[processed_words:], start=processed_words):
if is_valid_word(word):
valid_words.append(word)
if (i + 1) % 1000 == 0:
print(f"Обработано {i + 1} из {total_words} комбинаций.")
save_progress(i + 1)
append_to_file(VALID_WORDS_FILE, valid_words)
valid_words = []
# Запись всех найденных слов при завершении
if valid_words:
append_to_file(VALID_WORDS_FILE, valid_words)
print("Запись завершена. Найденные слова сохранены в файл 'valid_words.txt'.")
И вроде да он хорош, правда я не учёл одного момента количество обращений к серверу 10000 в сутки, мне же моим кодом нужно сделать 1222980 обращений к серверу это по самым скромным и примерным расчётам, что займёт 123-125 дней. Это как бы вариант, но скажем так медленный не много )
После чего я решил ну ладно возьму просто словарь Ожегова, напишу скрипт и получу таким образом все русские слова из этого словаря(что мне подходит в принципе), и я написал вот такой скрипт.
spoilerimport re
def extract_words(input_file, output_file):
# Чтение входного файла с кодировкой ANSI (cp1251)
with open(input_file, 'r', encoding="cp1251") as file:
content = file.read()
# Регулярное выражение для нахождения слов в тексте
words = re.findall(r'^[А-ЯЁ]+', content, re.MULTILINE)
# Запись найденных слов в выходной файл с кодировкой UTF-8
with open(output_file, 'w', encoding="utf-8") as file:
for word in words:
file.write(word + '\n')
# Указание путей к файлам
input_file = 'slovar.txt'
output_file = 'words.txt'
# Вызов функции извлечения слов
extract_words(input_file, output_file)
И да я получил слова и их получилось около 40 тыс из словаря Ожегова не важно какой они длины, что меня насторожило, подумав аж ещё 15 минут я понял, что да скрипт выберет все слова, но в словаре указано слово, и все его возможные окончания, а вот окончания скрипт не учитывает, да и врядли можно придумать скрипт который бы их учитывал.
И вот теперь решил узнать может, есть какие-то другие варианты, или я где-то что-то не знаю или не могу найти для решения своей задачи.