поиск повторов групп слов в текстах txt

  в папке с программой есть набор текстов txt
нам нужно найти все повторы групп слов в фразах
вводим число слов в группе повтора
например 3-7
отбрасываем все повторы кроме одного
и то что получилось записываем в новый файл txt

Отличная задача! Это классическая задача поиска и удаления повторяющихся n-грамм (последовательностей слов) из текста. Вот пошаговый алгоритм для её решения на Python.

 План решения:
Считать все текстовые файлы из папки программы.
Объединить их содержимое в одну строку (или обрабатывать по отдельности, в зависимости от задачи).
Токенизировать текст: разбить строку на отдельные слова.
Сгенерировать n-граммы для заданного диапазона (например, от 3 до 7 слов).
Найти уникальные n-граммы, автоматически отбрасывая дубликаты (используя структуру данных set).
Записать результат в новый файл.

 Код программы:

import os
from collections import defaultdict

def find_and_remove_duplicate_ngrams(folder_path, output_file, min_n, max_n):
    """
    Находит все повторяющиеся n-граммы (группы слов) в текстовых файлах папки
    и записывает уникальный набор в новый файл.

    Args:
        folder_path (str): Путь к папке с файлами .txt
        output_file (str): Имя выходного файла
        min_n (int): Минимальная длина n-граммы (например, 3)
        max_n (int): Максимальная длина n-граммы (например, 7)
    """

    #  Прочитать все текстовые файлы в указанной папке
    all_text = ""
    for filename in os.listdir(folder_path):
        if filename.endswith(".txt"):
            with open(os.path.join(folder_path, filename), 'r', encoding='utf-8') as file:
                all_text += file.read() + " "  # Добавляем пробел между файлами

    #  Преобразовать текст в список слов (токенизация)
    words = all_text.split()

    #  Создать множество для хранения УНИКАЛЬНЫХ n-грамм
    # Множество (set) автоматически игнорирует дубликаты
    unique_ngrams = set()

    #  Пройти по всем словам и сгенерировать n-граммы для длин от min_n до max_n
    for n in range(min_n, max_n + 1):
        for i in range(len(words) - n + 1):
            # Извлечь последовательность из n слов
            ngram = ' '.join(words[i:i+n])
            # Добавить её в множество (дубликаты проигнорируются)
            unique_ngrams.add(ngram)

    #  Записать все уникальные n-граммы в выходной файл
    with open(output_file, 'w', encoding='utf-8') as out_file:
        for ngram in sorted(unique_ngrams):  # sorted() для удобства чтения
            out_file.write(ngram + '\n')

    print(f"; Готово! Найдено и сохранено {len(unique_ngrams)} уникальных n-грамм.")
    print(f"; Результат записан в файл: {output_file}")

# = ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ =
#  Положите этот скрипт в папку с вашими .txt файлами
#  Замените 'my_folder' на путь к вашей папке (или оставьте '.', если скрипт уже в ней)
#  Замените 'result.txt' на желаемое имя выходного файла
#  Укажите нужный диапазон n-грамм в вызове функции (например, 3 и 7)

if __name__ == "__main__":

    # ЗДЕСЬ ЗАДАЙТЕ ПАРАМЕТРЫ
    find_and_remove_duplicate_ngrams(
        folder_path='.',      # Папка с файлами ('.' - текущая папка)
        output_file='unique_phrases.txt',  # Имя выходного файла
        min_n=3,              # Минимальная длина фразы
        max_n=7               # Максимальная длина фразы
    )


 Как это использовать:
Сохраните код в файл с расширением .py (например, find_ngrams.py) и поместите его в папку с вашими текстовыми файлами.
Запустите скрипт из командной строки или просто запустите его в вашей IDE.
Результат будет сохранен в файл unique_phrases.txt (или с другим указанным вами именем) в той же папке.
 также Важно
Программа учитывает точные совпадения (с учётом регистра и знаков препинания). Фраза "Привет, мир" и "привет мир" будут считаться разными.
Если нужна более продвинутая обработка (приведение к нижнему регистру, удаление знаков препинания), код можно легко доработать.


-> повторы групп слов которые мы отбросили
для статистики сохранить в новом файле повторы.txt

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

Вот обновлённый код:

import os
from collections import defaultdict

def find_and_remove_duplicate_ngrams(folder_path, output_file, duplicates_file, min_n, max_n):
    """
    Находит все повторяющиеся n-граммы (группы слов) в текстовых файлах папки
    и записывает уникальный набор в новый файл, а также повторяющиеся n-граммы в отдельный файл.

    Args:
        folder_path (str): Путь к папке с файлами .txt
        output_file (str): Имя выходного файла для уникальных n-грамм
        duplicates_file (str): Имя выходного файла для повторяющихся n-грамм
        min_n (int): Минимальная длина n-граммы (например, 3)
        max_n (int): Максимальная длина n-граммы (например, 7)
    """

    #  Прочитать все текстовые файлы в указанной папке
    all_text = ""
    for filename in os.listdir(folder_path):
        if filename.endswith(".txt"):
            with open(os.path.join(folder_path, filename), 'r', encoding='utf-8') as file:
                all_text += file.read() + " "  # Добавляем пробел между файлами

    #  Преобразовать текст в список слов (токенизация)
    words = all_text.split()

    #  Создать словарь для подсчета n-грамм
    ngram_count = defaultdict(int)

    #  Пройти по всем словам и сгенерировать n-граммы для длин от min_n до max_n
    for n in range(min_n, max_n + 1):
        for i in range(len(words) - n + 1):
            # Извлечь последовательность из n слов
            ngram = ' '.join(words[i:i+n])
            # Увеличить счётчик для этой n-граммы
            ngram_count[ngram] += 1

    #  Разделить уникальные и повторяющиеся n-граммы
    unique_ngrams = set()
    duplicate_ngrams = set()

    for ngram, count in ngram_count.items():
        if count == 1:
            unique_ngrams.add(ngram)
        else:
            duplicate_ngrams.add(ngram)

    #  Записать все уникальные n-граммы в выходной файл
    with open(output_file, 'w', encoding='utf-8') as out_file:
        for ngram in sorted(unique_ngrams):  # sorted() для удобства чтения
            out_file.write(ngram + '\n')

    #  Записать повторяющиеся n-граммы в файл для дубликатов
    with open(duplicates_file, 'w', encoding='utf-8') as dup_file:
        for ngram in sorted(duplicate_ngrams):
            dup_file.write(ngram + '\n')

    print(f"; Готово! Найдено и сохранено {len(unique_ngrams)} уникальных n-грамм.")
    print(f"; Результат записан в файл: {output_file}")
    print(f"; Повторы записаны в файл: {duplicates_file}")

# === ИНСТРУКЦИЯ ПО ИСПОЛЬЗОВАНИЮ ===
#  Положите этот скрипт в папку с вашими .txt файлами
#  Замените 'my_folder' на путь к вашей папке (или оставьте '.', если скрипт уже в ней)
#  Замените 'result.txt' на желаемое имя выходного файла для уникальных n-грамм
#  Замените 'duplicates.txt' на желаемое имя выходного файла для дубликатов
#  Укажите нужный диапазон n-грамм в вызове функции (например, 3 и 7)

if __name__ == "__main__":

    # ЗДЕСЬ ЗАДАЙТЕ ПАРАМЕТРЫ
    find_and_remove_duplicate_ngrams(
        folder_path='.',                # Папка с файлами ('.' - текущая папка)
        output_file='unique_phrases.txt',      # Имя выходного файла для уникальных n-грамм
        duplicates_file='повторы.txt',         # Имя выходного файла для повторяющихся n-грамм
        min_n=3,                # Минимальная длина фразы
        max_n=7                # Максимальная длина фразы
    )


  Как использовать эту программу :
Сохраните код в файл с расширением .py (например, find_ngrams.py)
и поместите его в папку с вашими текстовыми файлами.

Запустите скрипт из командной строки или просто запустите его в вашей IDE.
Результаты будут сохранены в файлы unique_phrases.txt (уникальные n-граммы)
и повторы.txt (повторяющиеся n-граммы) в той же папке.




*


Рецензии