@holllop

Какой лучший вариант решения такой задачи?

Суть задачи такова, мне нужно любыми средствами получить все русские слова длиной 1-4 буквы(некоторые буквы считаются тоже словами).
Что я сделал для этого.
Сначала мне пришла "гениальная" идея получить все слова которые подходят мне с помощью API Яндекс. Словаря.
для этого я написал вот такой код на питоне
spoiler
import 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 дней. Это как бы вариант, но скажем так медленный не много )
После чего я решил ну ладно возьму просто словарь Ожегова, напишу скрипт и получу таким образом все русские слова из этого словаря(что мне подходит в принципе), и я написал вот такой скрипт.
spoiler
import 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 минут я понял, что да скрипт выберет все слова, но в словаре указано слово, и все его возможные окончания, а вот окончания скрипт не учитывает, да и врядли можно придумать скрипт который бы их учитывал.
И вот теперь решил узнать может, есть какие-то другие варианты, или я где-то что-то не знаю или не могу найти для решения своей задачи.
  • Вопрос задан
  • 226 просмотров
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
Вздор это - насчет буквосочетаний. Слово ЖДЬЯ, например, вам вряд ли пригодится.
Для русских слов с формами на хрен не нужны никакие API, нужен словарь Зализняка, и только.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы