группируем фразы текста по 3 и более

если вы не хотите написать такую сложную умную программу 
с которой можно будет общаться  персонализировано
и которая будет знать всё что ей доступно о человеке с которым она говорит
о-кей - я это сделаю сам - за вас ..  через некоторое время
когда у меня будут хотя бы гигабайты данных для этого ..


 Вот простой алгоритм, который можно использовать для группировки фраз из текстового файла по 3 фразы в группы на основе схожести контекста (слов). Идея в том, чтобы измерять схожесть между фразами с помощью простого подхода, например, пересечения слов.


# Алгоритм

1. Считать все фразы из файла
 (предполагается, что каждая фраза — отдельная строка).

2. Предобработать фразы:
   - Привести к нижнему регистру.
   - Удалить пунктуацию.
   - Разбить на слова.

3. Вычислить схожесть между каждой парой фраз:
   - Например, считать количество общих слов.
4. Группировать фразы по 3, стараясь брать фразы с максимальной схожестью.
   - Можно сделать жадный алгоритм:
     - Выбрать первую фразу.
     - Найти две наиболее похожие на неё фразы.
     - Сформировать группу.
     - Удалить эти 3 фразы из списка.
     - Повторять, пока не закончатся фразы.
5. Если в конце останется меньше 3 фраз — можно оставить их как отдельную группу.



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


import string

def preprocess(phrase):
    # Приводим к нижнему регистру и удаляем пунктуацию
    phrase = phrase.lower()
    phrase = phrase.translate(str.maketrans('', '', string.punctuation))
    words = phrase.split()
    return set(words)

def similarity(set1, set2):
    # Количество общих слов
    return len(set1.intersection(set2))

def group_phrases(phrases):
    phrases_processed = [(i, preprocess(p)) for i, p in enumerate(phrases)]
    used = set()
    groups = []

    while len(used) < len(phrases):
        # Берём первую неиспользованную фразу
        candidates = [p for p in phrases_processed if p[0] not in used]
        if not candidates:
            break
        base_idx, base_set = candidates[0]
        used.add(base_idx)

        # Находим две наиболее похожие фразы
        others = [(idx, s) for idx, s in candidates if idx != base_idx]
        others_sorted = sorted(others, key=lambda x: similarity(base_set, x[1]), reverse=True)

        group = [base_idx]
        for idx, s in others_sorted[:2]:
            group.append(idx)
            used.add(idx)

        groups.append([phrases[i] for i in group])

    return groups

# Пример использования
with open('phrases.txt', 'r', encoding='utf-8') as f:
    phrases = [line.strip() for line in f if line.strip()]

groups = group_phrases(phrases)

for i, g in enumerate(groups, 1):
    print(f"Группа {i}:")
    for phrase in g:
        print("  ", phrase)
    print()
```



 Объяснение

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

Если нужно более точное или сложное решение (например, с использованием векторных моделей или TF-IDF), могу помочь и с этим





Вот пример другой программы, которая:

загружает фразы из файла (или принимает список),
кодирует их в векторы с помощью Sentence-BERT,
группирует по смыслу с помощью KMeans,
дополнительно разбивает крупные кластеры на подгруппы по 10 фраз,
сохраняет все фразы с их группами в текстовый файл.



from sentence_transformers import SentenceTransformer
from sklearn.cluster import KMeans
import math

# Функция для чтения фраз из файла (каждая фраза — на отдельной строке)
def load_phrases(filename):
    with open(filename, 'r', encoding='utf-8') as f:
        phrases = [line.strip() for line in f if line.strip()]
    return phrases

# Функция сохранения фраз с группами в файл
def save_clusters_to_file(clusters, filename):
    with open(filename, 'w', encoding='utf-8') as f:
        for cluster_id, cluster_phrases in clusters.items():
            f.write(f"Группа {cluster_id}:\n")
            for phrase in cluster_phrases:
                f.write(f"{phrase}\n")
            f.write("\n")

# Основная функция сортировки и группировки
def cluster_phrases(phrases, max_group_size=10):
    model = SentenceTransformer('all-MiniLM-L6-v2')
    embeddings = model.encode(phrases)

    # Сначала выбираем количество кластеров, чтобы примерно получить группы по max_group_size
    num_clusters = max(1, math.ceil(len(phrases) / max_group_size))

    kmeans = KMeans(n_clusters=num_clusters, random_state=42)
    labels = kmeans.fit_predict(embeddings)

    # Группируем по кластерам
    clusters = {}
    for label, phrase in zip(labels, phrases):
        clusters.setdefault(label, []).append(phrase)

    # Разбиваем большие кластеры на подгруппы по max_group_size
    final_clusters = {}
    cluster_count = 1
    for cluster_phrases in clusters.values():
        for i in range(0, len(cluster_phrases), max_group_size):
            subgroup = cluster_phrases[i:i + max_group_size]
            final_clusters[cluster_count] = subgroup
            cluster_count += 1

    return final_clusters

if __name__ == "__main__":
    input_file = "phrases.txt"       # Файл с исходными фразами (по одной на строке)
    output_file = "grouped_phrases.txt"  # Файл для сохранения сгруппированных фраз

    phrases = load_phrases(input_file)
    clusters = cluster_phrases(phrases, max_group_size=10)
    save_clusters_to_file(clusters, output_file)

    print(f"Фразы успешно сгруппированы и сохранены в файл '{output_file}'.")
Как использовать:
Создайте файл phrases.txt с вашими фразами — по одной фразе на строку.
Запустите скрипт.
В результате в файле grouped_phrases.txt появятся группы с не более чем 10 фразами в каждой.
Если нужно, могу помочь с расширением функционала:

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





 ->  коррекция этого кода


from sentence_transformers import SentenceTransformer
from sklearn.cluster import KMeans
import math
import os

# Функция для чтения фраз из файла (каждая фраза — на отдельной строке)
def load_phrases(filename):
    with open(filename, 'r', encoding='utf-8') as f:
        phrases = [line.strip() for line in f if line.strip()]
    return phrases

# Функция сохранения фраз с группами в файл
def save_clusters_to_file(clusters, filename):
    with open(filename, 'w', encoding='utf-8') as f:
        for cluster_id, cluster_phrases in clusters.items():
            f.write(f" {cluster_id}:\n")
            for phrase in cluster_phrases:
                f.write(f"{phrase}\n")
            f.write("\n")

# Основная функция сортировки и группировки
def cluster_phrases(phrases, max_group_size=10):
    model = SentenceTransformer('all-MiniLM-L6-v2')
    embeddings = model.encode(phrases)

    # Сначала выбираем количество кластеров, чтобы примерно получить группы по max_group_size
    num_clusters = max(1, math.ceil(len(phrases) / max_group_size))

    # Установка n_init для подавления FutureWarning
    kmeans = KMeans(n_clusters=num_clusters, n_init=10, random_state=42)
    labels = kmeans.fit_predict(embeddings)

    # Группируем по кластерам
    clusters = {}
    for label, phrase in zip(labels, phrases):
        clusters.setdefault(label, []).append(phrase)

    # Разбиваем большие кластеры на подгруппы по max_group_size
    final_clusters = {}
    cluster_count = 1
    for cluster_phrases in clusters.values():
        for i in range(0, len(cluster_phrases), max_group_size):
            subgroup = cluster_phrases[i:i + max_group_size]
            final_clusters[cluster_count] = subgroup
            cluster_count += 1

    return final_clusters

if __name__ == "__main__":
    # переменная окружения  оптимизирует использование ядер
    os.environ["LOKY_MAX_CPU_COUNT"] = "4"  #  4 ядра

    input_file = "мод текст.txt"       # Файл с исходными фразами
    output_file = "группы фраз.txt"  # Файл сохранения сгруппированных фраз

    phrases = load_phrases(input_file)
    clusters = cluster_phrases(phrases, max_group_size=10)
    save_clusters_to_file(clusters, output_file)

    print(f"Фразы успешно сгруппированы и сохранены в файл '{output_file}'.")


Рецензии