фразы из слов большого текста

 Ниже представлен пример программы на Python, которая обрабатывает большие тексты и создаёт новые фразы из слов исходного текста.
Программа использует модель на основе цепей Маркова, что позволяет генерировать осмысленные последовательности слов, похожие на исходный текст.

Описание кода:
Загружает и обрабатывает большой текст (например, из файла).
Создаёт цепь Маркова на уровне слов.
Генерирует новые фразы заданной длины на основе цепи Маркова.
Позволяет генерировать несколько фраз.


 **


import random
import re

class MarkovChainTextGenerator:
    def __init__(self, n=2):
        """
        Инициализация генератора цепи Маркова.
        n - порядок цепи (количество слов в состоянии)
        """
        self.n = n
        self.model = {}

    def preprocess_text(self, text):
        """
        Преобразование текста: удаление лишних символов, приведение к нижнему регистру.
        """
        text = text.lower()
        # Заменяем переносы строк и табы на пробелы
        text = re.sub(r'\s+', ' ', text)
        # Удаляем все символы кроме букв, цифр и знаков препинания
        text = re.sub(r'[^a-zа-яё0-9,.!? ]', '', text)
        return text

    def build_model(self, text):
        """
        Построение модели цепи Маркова из текста.
        """
        text = self.preprocess_text(text)
        words = text.split()
        if len(words) < self.n:
            raise ValueError("Текст слишком короткий для выбранного порядка цепи.")

        for i in range(len(words) - self.n):
            key = tuple(words[i:i+self.n])
            next_word = words[i+self.n]
            if key not in self.model:
                self.model[key] = []
            self.model[key].append(next_word)

    def generate_phrase(self, length=15):
        """
        Генерация новой фразы длиной length слов.
        """
        if not self.model:
            raise ValueError("Модель цепи Маркова не построена.")

        # Случайным образом выбираем начальное состояние
        start = random.choice(list(self.model.keys()))
        phrase = list(start)

        for _ in range(length - self.n):
            key = tuple(phrase[-self.n:])
            next_words = self.model.get(key)
            if not next_words:
                # Если для текущего состояния нет продолжения, выбираем новое случайное состояние
                key = random.choice(list(self.model.keys()))
                next_words = self.model[key]
            next_word = random.choice(next_words)
            phrase.append(next_word)

        # Собираем фразу в строку с правильной пунктуацией
        return self.postprocess_phrase(phrase)

    def postprocess_phrase(self, words):
        """
        Обработка сгенерированной фразы для корректного отображения.
        """
        phrase = ' '.join(words)
        # Заглавная буква в начале
        phrase = phrase.capitalize()
        # Исправление пробелов перед знаками препинания
        phrase = re.sub(r'\s+([,.!?])', r'\1', phrase)
        return phrase

def main():
    # Пример: загрузка большого текста из файла
    filename = 'мой текст.txt'  # путь к вашему файлу с большим текстом

    try:
        with open(filename, 'r', encoding='utf-8') as f:
            text = f.read()
    except FileNotFoundError:
        print(f"Файл {filename} не найден - создайте файл с большим текстом.")
        return

    generator = MarkovChainTextGenerator(n=2)
    generator.build_model(text)

    print("Сгенерированные фразы:")
    for i in range(10):
        phrase = generator.generate_phrase(length=20)
        print(f"{i+1}: {phrase}")

if __name__ == "__main__":
    main()


Рецензии