сортировка фраз txt файлов

    input_folder = 'дата1'  # папка с исходными 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}'.")


Рецензии