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

 промт для кода ->

 нужно найти в тексте файла .txt все группы соседних трёх слов
 (то есть  последовательности из трех подряд идущих слов),
  собрать их в список и отсортировать по алфавиту.

 Вот как можно реализовать это на Python. Если хотите, могу адаптировать
 под другой язык - language 
 или дать готовый скрипт под вашу среду.


    всего  6 175 532   строк  групп слов
    размер файла данных =  223 Мб




Пример код на  Python


import re

def three_word_groups(text):
    # Разделяем текст на слова. Учтём буквы и цифры, игнорируем знаки.
    # \w+ считает слова (буквы, цифры и знак подчеркивания).
    words = re.findall(r'\b\w+\b', text, flags=re.UNICODE)
    groups = []
    for i in range(len(words) - 2):
        group = (words[i], words[i+1], words[i+2])
        groups.append(' '.join(group))
    return groups

def process_file(filepath):
    with open(filepath, 'r', encoding='utf-8') as f:
        content = f.read()
    groups = three_word_groups(content)
    # Удалим дубликаты, если нужно: groups = sorted(set(groups))
    groups_sorted = sorted(groups, key=lambda s: s.lower())
    return groups_sorted

# Пример использования
# result = process_file('path/to/your/file.txt')
# for g in result:
#     print(g)


Пояснения к этому коду сортировки групп слов в тексте txt

Сначала разбиваем текст на слова, игнорируя знаки препинания.
Формируем все подряд идущие тройки слов: слова[0:3], words[1:4], и т.д.

Собираем их в список строк вида "слово1 слово2 слово3".
Сортируем список по алфавиту в ч/болшем регистре (чтобы порядок был по игнорированию регистра).

Опции:
Уточните- нужно ли удалять дубликаты трёхсловных групп
( например, если одна и та же тройка встречается несколько раз).
Нужно ли учитывать чувствительность к регистру в сортировке
( в примере — регистр не учитывается

Где хранить результат: вывести на экран, записать в файл, вернуть как список.
Если у вас другой язык или вы хотите встроить это в блоки (Blocks) вашего интерфейса, скажите — адаптирую под формат. Также могу сгенерировать готовый документ в блоках и подскажу, как запустить.




import re

def three_word_groups(text):
    # Разделяем текст на слова. Учтём буквы и цифры, игнорируем знаки.
    # \w+ считает слова (буквы, цифры и знак подчеркивания).
    words = re.findall(r'\b\w+\b', text, flags=re.UNICODE)
    groups = []
    for i in range(len(words) - 2):
        group = (words[i], words[i+1], words[i+2])
        groups.append(' '.join(group))
    return groups

def process_file(filepath):
    with open(filepath, 'r', encoding='utf-8') as f:
        content = f.read()
    groups = three_word_groups(content)
    # Удалим дубликаты, если нужно: groups = sorted(set(groups))
    groups_sorted = sorted(groups, key=lambda s: s.lower())
    return groups_sorted

# Пример использования
result = process_file('мой текст.txt')
for g in result:
    print(g)





Вот новое  решение на Python  е


import re

def find_word_triplets(input_file, output_file):
    # Читаем содержимое файла
    with open(input_file, 'r', encoding='utf-8') as file:
        text = file.read()
   
    # Используем регулярное выражение для извлечения слов
    # Слово - последовательность букв (включая апострофы и дефисы)
    words = re.findall(r'\b[\w\'-]+\b', text.lower())
   
    # Создаем список троек соседних слов
    triplets = []
    for i in range(len(words) - 2):
        triplet = ' '.join(words[i:i+3])
        triplets.append(triplet)
   
    # Сортируем тройки по алфавиту
    triplets.sort()
   
    # Записываем результат в файл
    with open(output_file, 'w', encoding='utf-8') as file:
        for triplet in triplets:
            file.write(triplet + '\n')
   
    return triplets

# Использование функции
input_filename = 'мой текст.txt'
output_filename = 'слова.txt'

try:
    result = find_word_triplets(input_filename, output_filename)
    print(f"Найдено {len(result)} троек слов")
    print(f"Результат сохранен в файл '{output_filename}'")
except FileNotFoundError:
    print(f"Ошибка: Файл '{input_filename}' не найден")
except Exception as e:
    print(f"Произошла ошибка: {e}")


Показать
Также вот альтернативная версия без использования регулярных выражений:


def find_word_triplets_simple(input_file, output_file):
    with open(input_file, 'r', encoding='utf-8') as file:
        text = file.read()
   
    # Разбиваем текст на слова, игнорируя пунктуацию
    words = []
    current_word = ''
   
    for char in text.lower():
        if char.isalpha() or char in ["'", "-"]:
            current_word += char
        else:
            if current_word:
                words.append(current_word)
                current_word = ''
   
    if current_word:
        words.append(current_word)
   
    # Создаем и сортируем тройки
    triplets = []
    for i in range(len(words) - 2):
        triplet = f"{words[i]} {words[i+1]} {words[i+2]}"
        triplets.append(triplet)
   
    triplets.sort()
   
    # Сохраняем результат
    with open(output_file, 'w', encoding='utf-8') as file:
        for triplet in triplets:
            file.write(triplet + '\n')
   
    return triplets

# Использование
input_filename = 'мой текст.txt'
output_filename = 'слова.txt'

try:
    result = find_word_triplets_simple(input_filename, output_filename)
    print(f"Обработка завершена. Сохранено {len(result)} троек слов")
except FileNotFoundError:
    print("Файл не найден. Проверьте правильность имени файла.")




Как использовать этот код

Сохраните любой из кодов в файл с расширением .py (например, text_processor.py)
Убедитесь, что файл мой текст.txt находится в той же папке

Запустите скрипт
Результат будет сохранен в файл слова.txt
Особенности работы программы:

Приводит все слова к нижнему регистру для корректной сортировки
Игнорирует пунктуацию и числа
Сохраняет апострофы и дефисы в словах
Обрабатывает файлы в кодировке UTF-8

Включает обработку ошибок для случаев, когда файл не найден
Программа создаст файл слова.txt,
где каждая строка будет представлять собой отсортированную
по алфавиту тройку соседних слов из исходного текста.




Чтобы убрать повторы в итоговом списке троек, можно использовать множество (set) для уникальности, а затем отсортировать. Ниже исправленный вариант с учетом удаления повторов:


def find_word_triplets_simple(input_file, output_file):
    with open(input_file, 'r', encoding='utf-8') as file:
        text = file.read()
   
    # Разбиваем текст на слова, игнорируя пунктуацию
    words = []
    current_word = ''
   
    for char in text.lower():
        if char.isalpha() or char in ["'", "-"]:
            current_word += char
        else:
            if current_word:
                words.append(current_word)
                current_word = ''
   
    if current_word:
        words.append(current_word)
   
    # Создаем тройки
    triplets = []
    for i in range(len(words) - 2):
        triplet = f"{words[i]} {words[i+1]} {words[i+2]}"
        triplets.append(triplet)
   
    # Удаляем повторы и сортируем
    unique_triplets = sorted(set(triplets))
   
    # Сохраняем результат
    with open(output_file, 'w', encoding='utf-8') as file:
        for triplet in unique_triplets:
            file.write(triplet + '\n')
   
    return unique_triplets

# Использование
input_filename = 'мой текст.txt'
output_filename = 'слова.txt'

try:
    result = find_word_triplets_simple(input_filename, output_filename)
    print(f"Обработка завершена. Сохранено {len(result)} уникальных троек слов")
except FileNotFoundError:
    print("Файл не найден. Проверьте правильность имени файла.")
Пояснения:



После формирования списков слов создаются троики.
Затем применяем set для удаления дубликатов и сортируем итоговые троики лексикографически.
Результат сохраняется в файл и возвращается как список уникальных троек. Если нужен деакцент на регистре, можно убрать lower() в обработке текста.


   ооооооооооооооооооооооооооооооо


def find_word_triplets_simple(input_file, output_file):
    with open(input_file, 'r', encoding='utf-8') as file:
        text = file.read()
   
    # Разбиваем текст на слова, игнорируя пунктуацию
    words = []
    current_word = ''
   
    for char in text.lower():
        if char.isalpha() or char in ["'", "-"]:
            current_word += char
        else:
            if current_word:
                words.append(current_word)
                current_word = ''
   
    if current_word:
        words.append(current_word)
   
    # Создаем тройки
    triplets = []
    for i in range(len(words) - 2):
        triplet = f"{words[i]} {words[i+1]} {words[i+2]}"
        triplets.append(triplet)
   
    # Удаляем повторы и сортируем
    unique_triplets = sorted(set(triplets))
   
    # Сохраняем результат
    with open(output_file, 'w', encoding='utf-8') as file:
        for triplet in unique_triplets:
            file.write(triplet + '\n')
   
    return unique_triplets

# Использование
input_filename = 'мой текст.txt'
output_filename = 'слова.txt'

try:
    result = find_word_triplets_simple(input_filename, output_filename)
    print(f"Обработка завершена. Сохранено {len(result)} уникальных троек слов")
except FileNotFoundError:
    print("Файл не найден. Проверьте правильность имени файла.")


Рецензии