2014 dxdy logo

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

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




На страницу 1, 2  След.
 
 Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 16:44 
Здравствуйте!
Решила попробовать для создания загадок убыстрить процесс поиска слов. :-)
Это для меня первая программа на 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 
И не понимаю, почему если в этой строчке
Код:
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 
Аватара пользователя
Cantata в сообщении #1683976 писал(а):
Это для меня первая программа на python, и то дипсик многое помог написать. В целом я понимаю что эта программа делает
И зачем там две функции main тоже понимаете?
И как должно найтись разбиение "фа+соль" если слова короче 6 букв игнорируются?
Cantata в сообщении #1683976 писал(а):
Не знаю только как улучшить: нужно, чтобы программа находила только чтобы оба слова были существительными, а пока она в числе прочих выводит существительное + прилагательное
Взять словарь с существительными.
Cantata в сообщении #1683991 писал(а):
то программа не работает
Довольно универсальное правило: никогда не описывать ошибку просто как "не работает". Один из хороших шаблонов описания - три пункта: 1) что Вы делаете; 2) что, по Вашему мнению, должно произойти; 3) что происходит на самом деле (чем это отличается от ожиданий).

 
 
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 18:18 
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 
Аватара пользователя
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 
Cantata
Так вам надо выводить результат если и только если можно разбить входное слово ровно на два существующих в словаре, а иначе результат пустой, верно?

 
 
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 18:56 
Благодарю! Уже запустила Ваш вариант кода и получила новые результаты! :-)
Как правильно прописать условия, чтобы он сравнивал полученные части слова с полными словами в словаре?
эксцентрический = эксцентри + ческий - или можно ли просто убрать такие подборки из результатов?

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

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

-- 27.04.2025, 18:56 --

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

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

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

 
 
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 19:19 
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 
Аватара пользователя
Cantata в сообщении #1684028 писал(а):
Взяла те книги, которые думала, что меня заинтересуют настолько, чтобы начать программировать, но они пока лежат, ждут своего часа
Глянул. Первая из них точно не для начинающих. Вторая - по уровню подходит, по стилю - на любителя.
Cantata в сообщении #1684028 писал(а):
Не совсем поняла какой словарик нужно составить?
Вот у Вас есть какой-то (видимо довольно большой) файл russian_nouns.txt. Попробуйте вместо него написать руками список из пяти слов.
Cantata в сообщении #1684028 писал(а):
Наверное нужно прописать дополнительную проверку: чтобы полученные части сравнивались в словаре со словами такой же длины?
Я даже не понимаю, что это значит.
Вопрос очень простой: каким образом, по Вашему мнению, код проверяет, что является словом русского языка, а что нет?

 
 
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 19:43 
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 
Аватара пользователя
Cantata в сообщении #1684037 писал(а):
Предлагаете создать свой словарик, чтобы по нему понять как работает программа?
Именно. В словаре на полтора миллиона слов, взятом неизвестно откуда, может быть (и будет) много странного. Во время разработки лучше использовать маленький список, чтобы можно было полностью отслеживать всё происходящее.
Cantata в сообщении #1684037 писал(а):
Моя ошибка в том, что не учла, что нужно прописать, чтобы программа сравнивала получившиеся переменные с 4 и 6 буквами в словаре со словами, которые тоже только такой длины: 4 и 6 букв.
Слова разной длины автоматически отличаются.

 
 
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 19:48 
mihaild в сообщении #1684038 писал(а):
Слова разной длины автоматически отличаются.

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

 
 
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 19:52 
Аватара пользователя
Cantata в сообщении #1684039 писал(а):
Почему программа выводит такие результаты, ведь полученные две части не являются полноценными словами?
Есть два варианта. Либо в программе ошибка, либо на самом деле являются. Подумайте, как Вы могли бы отличить эти варианты?

 
 
 
 Re: Программа на Python - найти несколько слов в одном слове
Сообщение27.04.2025, 19:56 
Да, это я погорячилась, такие слова существуют!
Тогда их можно исключить, добавив в программу сверку с отдельным словариком, где будут слова исключения?

 
 
 [ Сообщений: 23 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group