группируем фразы текста по 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}'.")
Свидетельство о публикации №125072906392