2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 16:44 


01/05/24
454
Здравствуйте!
Решила попробовать для создания загадок убыстрить процесс поиска слов. :-)
Это для меня первая программа на python, и то дипсик многое помог написать. В целом я понимаю что эта программа делает:
выбираются слова в словаре, в каждом слове берется как минимум 3 подряд идущих буквы и проверяются получившиеся два слова на их наличие в словаре.
Если таких слов нет, другой срез берётся, уже 4 буквы и т.д. Например, в слове фасоль определить, что есть два слова: фа и соль. ( ну да, в данном случае этот вариант не найдется, т.к. идет срез с 3 букв))
Если найдено слово, в котором при срезе находятся два слова, то они записываются в отдельный файлик - результаты.

Не знаю только как улучшить: нужно, чтобы программа находила только чтобы оба слова были существительными, а пока она в числе прочих выводит существительное + прилагательное.

Код:
import os

def load_dictionary(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        return [word.strip().lower() for word in f if len(word.strip()) >= 6]

def main():
    dict_path = 'russian_nouns.txt'  # Путь к файлу
    if not os.path.exists(dict_path):
        with open('results.txt', 'w', encoding='utf-8') as f:
            f.write(f"Ошибка: файл {dict_path} не найден!")
        return  # Завершаем программу

    dictionary = load_dictionary(dict_path)
def find_splits(words, dictionary):
    results = []
    for word in words:
        word = word.lower()
        for i in range(3, len(word)-2):
            part1, part2 = word[:i], word[i:]
            if part1 in dictionary and part2 in dictionary:
                results.append(f"{word} = {part1} + {part2}")
    return results

def main():
    dictionary = load_dictionary('russian_nouns.txt')
    words_to_check = load_dictionary('russian_nouns.txt')
   
    with open('results.txt', 'w', encoding='utf-8') as f:
        for line in find_splits(words_to_check, set(dictionary)):
            f.write(line + '\n')

if __name__ == "__main__":
    main()

 Профиль  
                  
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 17:45 


01/05/24
454
И не понимаю, почему если в этой строчке
Код:
return [word.strip().lower() for word in f if len(word.strip()) >= 6]

делаю ограничение длины изначального слова:
Код:
return [word.strip().lower() for word in f if len(word.strip()) >= 6 and len(word.strip()) <= 12]

то программа не работает. В чем ошибка?

 Профиль  
                  
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 18:12 
Заслуженный участник
Аватара пользователя


16/07/14
9664
Цюрих
Cantata в сообщении #1683976 писал(а):
Это для меня первая программа на python, и то дипсик многое помог написать. В целом я понимаю что эта программа делает
И зачем там две функции main тоже понимаете?
И как должно найтись разбиение "фа+соль" если слова короче 6 букв игнорируются?
Cantata в сообщении #1683976 писал(а):
Не знаю только как улучшить: нужно, чтобы программа находила только чтобы оба слова были существительными, а пока она в числе прочих выводит существительное + прилагательное
Взять словарь с существительными.
Cantata в сообщении #1683991 писал(а):
то программа не работает
Довольно универсальное правило: никогда не описывать ошибку просто как "не работает". Один из хороших шаблонов описания - три пункта: 1) что Вы делаете; 2) что, по Вашему мнению, должно произойти; 3) что происходит на самом деле (чем это отличается от ожиданий).

 Профиль  
                  
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 18:18 


01/05/24
454
mihaild в сообщении #1683999 писал(а):
И зачем там две функции main тоже понимаете?
Нет, пока не понимаю, я пока на начальном этапе учебы и каждую строчку в этом коде объяснить подробно не смогу, почему так дипсик написал мне не понятно.
Просто лимит сообщений закончился и он перестал отвечать. Вот потихоньку разбираюсь с программой.

mihaild в сообщении #1683999 писал(а):
И как должно найтись разбиение "фа+соль" если слова короче 6 букв игнорируются?

Это я объяснила в начальном сообщении, что идет ограничение и это как раз мне понятно.
Не понятно другое - почему в результатах программа выбрала только сложно составные слова.
mihaild в сообщении #1683999 писал(а):
Взять словарь с существительными.

Думала, что это и есть словарь с существительными) поищу другой вариант.
mihaild в сообщении #1683999 писал(а):
Довольно универсальное правило: никогда не описывать ошибку просто как "не работает". Один из хороших шаблонов описания - три пункта: 1) что Вы делаете; 2) что, по Вашему мнению, должно произойти; 3) что происходит на самом деле (чем это отличается от ожиданий).

Дописываю условие по ограничению длины слова в строке кода, сохраняю, перезапускаю программу, но в результатах ничего не выводится. А ожидаю, что будет происходить выборка среди слов с ограниченной длиной, например от 6 до 12 букв.

-- 27.04.2025, 18:21 --

Как правильно прописать проверку на существование слов в словаре?
Я уже начинаю думать, что программа видит, что запрашиваемая часть слова находится в словаре (хоть это и не отдельное слово), и добавляет его в результаты.
В итоге в результатах всякая всячина, а искомых вариантов мало.

 Профиль  
                  
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 18:40 
Заслуженный участник
Аватара пользователя


16/07/14
9664
Цюрих
Cantata в сообщении #1684004 писал(а):
Нет, пока не понимаю, я пока на начальном этапе учебы и каждую строчку в этом коде объяснить подробно не смогу, почему так дипсик написал мне не понятно.
Потому что он всё еще умеет писать полный бред. LLM - это хорошо, но при изучении языка, особенно при небольшом опыте программирования в целом, учебники важнее.
Первый вариант ничего не делает и никак не используется.
Cantata в сообщении #1684004 писал(а):
Не понятно другое - почему в результатах программа выбрала только сложно составные слова
Потому что при чтении словаря все слова короче 6 букв сразу выкидываются.
У Вас же, хотя словарь и читается два раза, множество слов, которые могут быть частями, то же самое, в котором эти части ищутся.
Cantata в сообщении #1684004 писал(а):
А ожидаю, что будет происходить выборка среди слов с ограниченной длиной, например от 6 до 12 букв.
А в Вашем словаре вообще есть хоть одно слово длины от 6 до 12 букв, которое является конкатенацией двух других слов тоже длиной от 6 до 12 букв (понятно, что это возможно только когда слово длиной 12 является конкатенацией двух слов длины 6).

На правах рекламы - версия этого скрипта от gemini, с комментариями и выкидыванием лишнего.
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
# --- Константы ---
# Путь к файлу словаря русских существительных
DICT_FILE_PATH = 'russian_nouns.txt'
# Путь к файлу для записи результатов
RESULTS_FILE_PATH = 'results.txt'
# Минимальная длина слова для загрузки из словаря
MIN_WORD_LENGTH = 6
# Минимальная длина каждой части слова при разделении
MIN_PART_LENGTH = 3

# --- Функции ---

def load_dictionary(file_path):
    """
    Загружает слова из файла, приводит их к нижнему регистру и фильтрует по минимальной длине.
    Предполагается, что файл существует и доступен для чтения.

    Args:
        file_path (str): Путь к файлу словаря.

    Returns:
        list: Список слов в нижнем регистре, удовлетворяющих критерию минимальной длины.
    """

    words = []
    # Открываем файл для чтения. Если возникнет ошибка (файл не найден, нет прав),
    # программа прервется с исключением FileNotFoundError или PermissionError.
    with open(file_path, 'r', encoding='utf-8') as f:
        # Читаем строки, удаляем пробелы по краям, приводим к нижнему регистру
        # и добавляем в список, если длина слова >= MIN_WORD_LENGTH
        for line in f:
            word = line.strip().lower()
            if len(word) >= MIN_WORD_LENGTH:
                words.append(word)
    return words

def find_splits(words_to_check, dictionary_set):
    """
    Находит слова из списка 'words_to_check', которые можно разделить на две части,
    причем обе части присутствуют в множестве 'dictionary_set'.

    Args:
        words_to_check (list): Список слов, которые нужно проверить на возможность разделения.
        dictionary_set (set): Множество допустимых слов (частей) для быстрой проверки.

    Returns:
        list: Список строк, описывающих успешные разделения
              (например, "слово = часть1 + часть2").
    """

    results = []
    # Перебираем каждое слово, которое потенциально можно разделить
    for word in words_to_check:
        # Длина слова должна быть достаточной для разделения на две части
        # минимальной длины MIN_PART_LENGTH
        if len(word) < MIN_PART_LENGTH * 2:
            continue # Пропускаем слишком короткие слова

        # Перебираем возможные точки разделения 'i'
        # 'i' - это индекс, где заканчивается первая часть (part1)
        # part1 = word[:i], part2 = word[i:]
        # Условия:
        # len(part1) >= MIN_PART_LENGTH  => i >= MIN_PART_LENGTH
        # len(part2) >= MIN_PART_LENGTH  => len(word) - i >= MIN_PART_LENGTH => i <= len(word) - MIN_PART_LENGTH
        for i in range(MIN_PART_LENGTH, len(word) - MIN_PART_LENGTH + 1):
            part1 = word[:i]
            part2 = word[i:]

            # Проверяем, есть ли обе части в множестве допустимых слов
            # Использование множества (dictionary_set) значительно ускоряет проверку 'in'
            if part1 in dictionary_set and part2 in dictionary_set:
                results.append(f"{word} = {part1} + {part2}")
    return results

def main():
    """
    Основная функция: загрузка словаря, поиск разделяемых слов и сохранение результатов.
    (Без явной обработки ошибок ввода-вывода)
    """

    # --- 1. Проверка существования файла словаря ---
    # Проверка убрана. Если файл не существует, open() в load_dictionary вызовет ошибку.

    # --- 2. Загрузка словаря ---
    print(f"Загрузка словаря из файла: {DICT_FILE_PATH}...")
    # Загружаем слова. Если файл не найден или ошибка чтения, программа прервется.
    all_words = load_dictionary(DICT_FILE_PATH)

    # Преобразуем список слов в множество для быстрой проверки наличия (`in`)
    dictionary_lookup_set = set(all_words)
    print(f"Словарь загружен. Всего слов (длиной >= {MIN_WORD_LENGTH}): {len(all_words)}")

    # --- 3. Поиск составных слов ---
    print("Поиск составных слов...")
    # Используем загруженные слова как список для проверки
    split_results = find_splits(all_words, dictionary_lookup_set)
    print(f"Найдено составных слов: {len(split_results)}")

    # --- 4. Запись результатов в файл ---
    print(f"Запись результатов в файл: {RESULTS_FILE_PATH}...")
    # Открываем файл для записи. Если возникнет ошибка (нет прав, нет места),
    # программа прервется с исключением.
    with open(RESULTS_FILE_PATH, 'w', encoding='utf-8') as f_out:
        if not split_results:
            f_out.write("Составные слова не найдены.\n")
            print("Составные слова не найдены.")
        else:
            for line in split_results:
                f_out.write(line + '\n')
            print(f"Результаты ({len(split_results)} строк) успешно записаны.")

# --- Точка входа в программу ---
if __name__ == "__main__":
    # Этот блок выполняется только если скрипт запущен напрямую
    main()

 Профиль  
                  
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 18:48 


05/09/16
12471
Cantata
Так вам надо выводить результат если и только если можно разбить входное слово ровно на два существующих в словаре, а иначе результат пустой, верно?

 Профиль  
                  
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 18:56 


01/05/24
454
Благодарю! Уже запустила Ваш вариант кода и получила новые результаты! :-)
Как правильно прописать условия, чтобы он сравнивал полученные части слова с полными словами в словаре?
эксцентрический = эксцентри + ческий - или можно ли просто убрать такие подборки из результатов?

mihaild в сообщении #1684008 писал(а):
учебники важнее

Купила два учебника по Pythony Э. Свейгарта, но до них руки пока не дошли, почему-то интереснее заниматься на курсах, выполняя небольшие задания,
да и пока общего понимания алгоритмов нет. Понимаю, что даже такие программы рановато делать, а с другой стороны так интереснее, мотивации больше,
особенно когда есть результат.

-- 27.04.2025, 18:56 --

wrest в сообщении #1684010 писал(а):
Cantata
Так вам надо выводить результат если и только если можно разбить входное слово ровно на два существующих в словаре, а иначе результат пустой, верно?

В целом да, это идеальный вариант.

 Профиль  
                  
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 19:06 
Заслуженный участник
Аватара пользователя


16/07/14
9664
Цюрих
Cantata в сообщении #1684014 писал(а):
Как правильно прописать условия, чтобы он сравнивал полученные части слова с полными словами в словаре?
Разобраться в том, что в точности делает код :) В частности - что под "словом" понимается в коде, и что под "словом" понимаете Вы?
Cantata в сообщении #1684014 писал(а):
Купила два учебника по Pythony Э. Свейгарта
Это какие? То, что я сходу нагуглил, не выглядит подходящим для начального уровня.
Я бы советовал Лутца, "Изучаем python". Если Вы уже умеете хоть как-то запускать код и получать результат, то первую часть смело пропускайте.
Cantata в сообщении #1684014 писал(а):
да и пока общего понимания алгоритмов нет
Тут пока нет никаких особых алгоритмов, базовый синтаксис.
Попробуйте для начала вместо какого-то большого словаря составить небольшой руками. Посмотрите, что получится. Правильно ли всё работает?

 Профиль  
                  
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 19:19 


01/05/24
454
mihaild в сообщении #1684020 писал(а):
Это какие? То, что я сходу нагуглил, не выглядит подходящим для начального уровня.

Взяла те книги, которые думала, что меня заинтересуют настолько, чтобы начать программировать, но они пока лежат, ждут своего часа.
Это: «Автоматизация рутинных задач с помощью Python: практическое руководство для начинающих» автора Эла Свейгарта и
"Учим Python, делая крутые игры", 4-е издание Свейгарт Эл (2018).

Немного Scratch изучала, три разных простых игрушки сделала года 4 назад, но забросила, было не очень интересно, наверное потому что тогда было просто.
Сейчас есть идея небольшой игры, хотелось бы реализовать, стала изучать godot, но пока совсем недалеко ушла.
Берусь за всё сразу, в итоге каша в голове :facepalm:

mihaild в сообщении #1684020 писал(а):
Я бы советовал Лутца, "Изучаем python". Если Вы уже умеете хоть как-то запускать код и получать результат, то первую часть смело пропускайте.

До сегодняшнего дня все свои учебные коды запускала в онлайн-среде, т.к. не было большой необходимости в установке на пк.
Сегодня с помощью дипсика смогла его программу запустить и получить первые результаты в файлик.

mihaild в сообщении #1684020 писал(а):
Попробуйте для начала вместо какого-то большого словаря составить небольшой руками. Посмотрите, что получится. Правильно ли всё работает?

Не совсем поняла какой словарик нужно составить?

-- 27.04.2025, 19:24 --

mihaild в сообщении #1684020 писал(а):
Разобраться в том, что в точности делает код :) В частности - что под "словом" понимается в коде, и что под "словом" понимаете Вы?

Наверное нужно прописать дополнительную проверку: чтобы полученные части сравнивались в словаре со словами такой же длины?
Тогда будет более правильный вывод в результатах! Точно! Спасибо, попробую реализовать)

 Профиль  
                  
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 19:31 
Заслуженный участник
Аватара пользователя


16/07/14
9664
Цюрих
Cantata в сообщении #1684028 писал(а):
Взяла те книги, которые думала, что меня заинтересуют настолько, чтобы начать программировать, но они пока лежат, ждут своего часа
Глянул. Первая из них точно не для начинающих. Вторая - по уровню подходит, по стилю - на любителя.
Cantata в сообщении #1684028 писал(а):
Не совсем поняла какой словарик нужно составить?
Вот у Вас есть какой-то (видимо довольно большой) файл russian_nouns.txt. Попробуйте вместо него написать руками список из пяти слов.
Cantata в сообщении #1684028 писал(а):
Наверное нужно прописать дополнительную проверку: чтобы полученные части сравнивались в словаре со словами такой же длины?
Я даже не понимаю, что это значит.
Вопрос очень простой: каким образом, по Вашему мнению, код проверяет, что является словом русского языка, а что нет?

 Профиль  
                  
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 19:43 


01/05/24
454
mihaild в сообщении #1684034 писал(а):
Вот у Вас есть какой-то (видимо довольно большой) файл russian_nouns.txt. Попробуйте вместо него написать руками список из пяти слов.

Взяла текстовый файл со списком русских слов во всех морфологических формах. Содержит 1 531 464 записи на github.
Предлагаете создать свой словарик, чтобы по нему понять как работает программа?

mihaild в сообщении #1684034 писал(а):
Вопрос очень простой: каким образом, по Вашему мнению, код проверяет, что является словом русского языка, а что нет?

Проверка идет по указанному в программе словарю, поэтому думаю, что там не должно быть слов другого языка.

Как мне видится - программа берёт слово(например из 10 букв) и
делает срез - первые 3 буквы присваивает новой переменной, оставшиеся 7 букв - другой переменной
и сверяет получившиеся данные со словарём, если она их там находит, то записывает слово и получившиеся результаты в файлик с результатами.
Если не находит, делает новый срез, теперь сравнивает 4 и 6 букв в словаре - есть ли в нем два таких слова.

Задача в том, чтобы найти слова, которые при делении на две части будут состоять из двух полноценных слов.

Моя ошибка в том, что не учла, что нужно прописать, чтобы программа сравнивала получившиеся переменные с 4 и 6 буквами в словаре со словами,
которые тоже только такой длины: 4 и 6 букв. Тогда будет ясно, есть ли такие отдельные слова в словаре или же нет.

 Профиль  
                  
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 19:45 
Заслуженный участник
Аватара пользователя


16/07/14
9664
Цюрих
Cantata в сообщении #1684037 писал(а):
Предлагаете создать свой словарик, чтобы по нему понять как работает программа?
Именно. В словаре на полтора миллиона слов, взятом неизвестно откуда, может быть (и будет) много странного. Во время разработки лучше использовать маленький список, чтобы можно было полностью отслеживать всё происходящее.
Cantata в сообщении #1684037 писал(а):
Моя ошибка в том, что не учла, что нужно прописать, чтобы программа сравнивала получившиеся переменные с 4 и 6 буквами в словаре со словами, которые тоже только такой длины: 4 и 6 букв.
Слова разной длины автоматически отличаются.

 Профиль  
                  
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 19:48 


01/05/24
454
mihaild в сообщении #1684038 писал(а):
Слова разной длины автоматически отличаются.

Почему программа выводит такие результаты, ведь полученные две части не являются полноценными словами? :
агробиологический = агробиологи + ческий
агробиологических = агробиологи + ческих
агробиологической = агробиологи + ческой
агробиологическою = агробиологи + ческою
агрометеорологический = агрометеорологи + ческий
агрометеорологических = агрометеорологи + ческих
агрометеорологической = агрометеорологи + ческой
агрометеорологическою = агрометеорологи + ческою

 Профиль  
                  
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 19:52 
Заслуженный участник
Аватара пользователя


16/07/14
9664
Цюрих
Cantata в сообщении #1684039 писал(а):
Почему программа выводит такие результаты, ведь полученные две части не являются полноценными словами?
Есть два варианта. Либо в программе ошибка, либо на самом деле являются. Подумайте, как Вы могли бы отличить эти варианты?

 Профиль  
                  
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 19:56 


01/05/24
454
Да, это я погорячилась, такие слова существуют!
Тогда их можно исключить, добавив в программу сверку с отдельным словариком, где будут слова исключения?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group