сортировка групп слов по окончаниям 3 букв

 открываем файлы  txt  в папке с программой 
 и разбиваем тексты на группы по три соседних слова
 повторы групп слов отбрасываем
 потом объединяем группы слов  по 10  строк -
 так чтобы  из последних трёх букв строки совпало любые две из трёх букв 
 результат сохраняем в новый файл txt


1. Открыть все текстовые файлы (`*.txt`) в папке с программой.
2. Из каждого файла взять текст и разбить его на группы по 3 соседних слова (триграммы).
3. Убрать повторяющиеся группы.
4. Затем объединять эти группы по 10 строк, но так, чтобы последние 3 буквы строки i совпадали по 2 из 3 букв с первыми 3 буквами строки i+1.
5. Результат сохранить в новый файл.



Ниже пример кода на Python,
он реализует описанную логику


```python

import os
import glob
import re

def get_trigrams(text):
    # Разбиваем текст на слова, учитывая только буквы и цифры
    words = re.findall(r'\b\w+\b', text.lower())
    trigrams = []
    for i in range(len(words) - 2):
        trigram = ' '.join(words[i:i+3])
        trigrams.append(trigram)
    return trigrams

def letters_similarity(a, b):
    # Сравниваем две строки длиной 3, считаем сколько позиций совпадает
    # Возвращаем True, если совпадает >= 2 позиций
    matches = sum(1 for x, y in zip(a, b) if x == y)
    return matches >= 2

def merge_lines(lines):
    # Объединяем строки по 10, с условием, что последние 3 буквы строки i
    # совпадают по 2 из 3 букв с первыми 3 буквами строки i+1
    merged = []
    i = 0
    n = len(lines)
    while i < n:
        group = [lines[i]]
        i += 1
        while len(group) < 10 and i < n:
            last_three = group[-1][-3:]
            first_three = lines[i][:3]
            if letters_similarity(last_three, first_three):
                group.append(lines[i])
                i += 1
            else:
                break
        merged.append(' '.join(group))
    return merged

def main():
    folder = os.path.dirname(os.path.abspath(__file__))
    txt_files = glob.glob(os.path.join(folder, '*.txt'))

    all_trigrams = set()

    for file in txt_files:
        with open(file, 'r', encoding='utf-8') as f:
            text = f.read()
            trigrams = get_trigrams(text)
            all_trigrams.update(trigrams)

    all_trigrams = list(all_trigrams)
    all_trigrams.sort()

    merged = merge_lines(all_trigrams)

    output_path = os.path.join(folder, 'result.txt')
    with open(output_path, 'w', encoding='utf-8') as f:
        for line in merged:
            f.write(line + '\n')

    print(f"Результат сохранён в {output_path}")

if __name__ == '__main__':
    main()





 *





нужно изменить условие совпадения так, чтобы считались совпадения только если совпадают либо первые две буквы из трёх последних строки с первыми двумя буквами следующей строки (позиции 1 и 2), либо последние две буквы из трёх последних строки совпадают с первыми двумя буквами следующей строки (позиции 2 и 3).





 Пояснения:
- `get_trigrams` — разбивает текст на слова, затем формирует триграммы.
- `letters_similarity` — проверяет, совпадает ли минимум 2 из 3 букв между концом строки и началом следующей.
- `merge_lines` — группирует строки по 10, соединяя только те, у которых условие совпадения соблюдается.
- В конце результат сохраняется в файл `result.txt` в той же папке.

Если нужно, могу помочь адаптировать код под ваши требования.

def letters_similarity(a, b):
    """
    a и b — строки длиной 3.
    Возвращает True, если совпадает либо первые 2 буквы a с первыми 2 буквами b (позиции 0 и 1),
    либо последние 2 буквы a с первыми 2 буквами b (позиции 1 и 2)
    """
    if len(a) < 3 or len(b) < 3:
        return False
    # Проверяем позиции 0 и 1
    if a[0] == b[0] and a[1] == b[1]:
        return True
    # Проверяем позиции 1 и 2
    if a[1] == b[0] and a[2] == b[1]:
        return True
    return False



  **



import os
import glob
import re

def get_trigrams(text):
    words = re.findall(r'\b\w+\b', text.lower())
    trigrams = []
    for i in range(len(words) - 2):
        trigram = ' '.join(words[i:i+3])
        trigrams.append(trigram)
    return trigrams

def letters_similarity(a, b):
    if len(a) < 3 or len(b) < 3:
        return False
    if a[0] == b[0] and a[1] == b[1]:
        return True
    if a[1] == b[0] and a[2] == b[1]:
        return True
    return False

def merge_lines(lines):
    merged = []
    i = 0
    n = len(lines)
    while i < n:
        group = [lines[i]]
        i += 1
        while len(group) < 10 and i < n:
            last_three = group[-1][-3:]
            first_three = lines[i][:3]
            if letters_similarity(last_three, first_three):
                group.append(lines[i])
                i += 1
            else:
                break
        merged.append(' '.join(group))
    return merged

def main():
    folder = os.path.dirname(os.path.abspath(__file__))
    txt_files = glob.glob(os.path.join(folder, '*.txt'))

    all_trigrams = set()

    for file in txt_files:
        with open(file, 'r', encoding='utf-8') as f:
            text = f.read()
            trigrams = get_trigrams(text)
            all_trigrams.update(trigrams)

    all_trigrams = list(all_trigrams)
    all_trigrams.sort()

    merged = merge_lines(all_trigrams)

    output_path = os.path.join(folder, 'result.txt')
    with open(output_path, 'w', encoding='utf-8') as f:
        for line in merged:
            f.write(line + '\n')

    print(f"Результат сохранён в {output_path}")

if __name__ == '__main__':
    main()


Рецензии