сортировка фраз txt файлов
output_folder = 'фраз' # папка для сохранения результатов
= >>
import os
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
def read_phrases_from_folder(folder_path):
"""Читает все фразы из txt-файлов в папке."""
phrases = []
for filename in os.listdir(folder_path):
if filename.endswith('.txt'):
file_path = os.path.join(folder_path, filename)
try:
with open(file_path, 'r', encoding='utf-8') as file:
for line in file:
phrase = line.strip()
if phrase: # пропускаем пустые строки
phrases.append(phrase)
except Exception as e:
print(f"Ошибка при чтении файла {filename}: {e}")
return phrases
def sort_phrases_by_context(phrases, target_min=10, target_max=20, initial_threshold=0.4):
"""
Сортирует фразы по контексту, формируя группы по 10–20 фраз
Args:
phrases: список фраз.
target_min: минимальное количество фраз в группе
target_max: максимальное количество фраз в группе
initial_threshold: начальный порог сходства
Returns:
Список групп фраз (каждая группа — список строк)
"""
vectorizer = TfidfVectorizer(lowercase=True, max_features=500)
tfidf_matrix = vectorizer.fit_transform(phrases)
similarity_matrix = cosine_similarity(tfidf_matrix)
groups = []
visited = set()
n = len(phrases)
for i in range(n):
if i in visited:
continue
# Начинаем с начального порога, но корректируем его, если нужно
threshold = initial_threshold
best_group = None
best_size = 0
# Пробуем разные пороги, чтобы попасть в диапазон 10–20
for attempt_threshold in [initial_threshold, 0.35, 0.3, 0.25, 0.2, 0.15]:
similar_indices = np.where(similarity_matrix[i] >= attempt_threshold)[0]
group_size = len(similar_indices)
# Если размер группы в целевом диапазоне — берём её
if target_min <= group_size <= target_max:
best_group = [phrases[j] for j in similar_indices]
best_size = group_size
threshold = attempt_threshold
break
# Иначе запоминаем ближайшую к целевому диапазону
elif group_size > target_min and (best_size == 0 or abs(group_size - target_max) < abs(best_size - target_max)):
best_group = [phrases[j] for j in similar_indices]
best_size = group_size
threshold = attempt_threshold
if best_group:
groups.append(best_group)
visited.update(np.where(similarity_matrix[i] >= threshold)[0])
else:
# Если не удалось сформировать группу нужного размера, берём хотя бы 5–30 фраз
similar_indices = np.where(similarity_matrix[i] >= 0.1)[0]
if len(similar_indices) >= 5:
group = [phrases[j] for j in similar_indices[:30]] # ограничиваем сверху
groups.append(group)
visited.update(similar_indices[:30])
return groups
def save_sorted_phrases(groups, output_folder, min_phrases=5):
"""Сохраняет группы фраз в отдельные файлы, пропуская слишком маленькие."""
os.makedirs(output_folder, exist_ok=True)
file_count = 0
for i, group in enumerate(groups):
if len(group) >= min_phrases: # фильтруем слишком маленькие группы
filename = os.path.join(output_folder, f'group_{i+1}.txt')
with open(filename, 'w', encoding='utf-8') as file:
for phrase in group:
file.write(phrase + '\n')
file_count += 1
print(f"Сохранено {file_count} файлов с группами фраз (минимум {min_phrases} фраз в файле).")
# Основной код
if __name__ == '__main__':
input_folder = 'дата1' # папка с исходными txt-файлами
output_folder = 'фраз' # папка для результатов
print("Чтение фраз из файлов...")
phrases = read_phrases_from_folder(input_folder)
print(f"Найдено {len(phrases)} фраз.")
if not phrases:
print("Не найдено ни одной фразы для обработки.")
else:
print("Сортировка фраз по контексту...")
sorted_groups = sort_phrases_by_context(
phrases,
target_min=10,
target_max=20,
initial_threshold=0.4
)
print("Сохранение результатов...")
save_sorted_phrases(sorted_groups, output_folder, min_phrases=5)
print(f"Готово! Сформировано {len(sorted_groups)} групп. Результаты сохранены в папке '{output_folder}'.")
Свидетельство о публикации №126031607452