Загрузка данных


import pandas as pd
import re
from collections import Counter
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB

def solve_workbook_6():
    # =================================================================
    # ЗАДАНИЕ 1.1.2: ВЕКТОРИЗАЦИЯ (Вариант 5)
    # =================================================================
    print("--- ЗАДАНИЕ 1.1.2: BoW и TF-IDF (Вариант 5) ---")
    corpus = [
        "Студенты учат лекции",
        "Ошибки учат нас быть лучше",
        "Лекции нужно посещать, чтобы учиться лучше"
    ]
    
    # Bag of Words
    vectorizer = CountVectorizer()
    bow_matrix = vectorizer.fit_transform(corpus)
    df_bow = pd.DataFrame(bow_matrix.toarray(), columns=vectorizer.get_feature_names_out(), index=['D1', 'D2', 'D3'])
    print("\nМатрица Bag of Words:")
    print(df_bow)
    
    # TF-IDF
    tfidf_vec = TfidfVectorizer()
    tfidf_matrix = tfidf_vec.fit_transform(corpus)
    df_tfidf = pd.DataFrame(tfidf_matrix.toarray().round(3), columns=tfidf_vec.get_feature_names_out(), index=['D1', 'D2', 'D3'])
    print("\nМатрица TF-IDF:")
    print(df_tfidf)

    # =================================================================
    # ЗАДАНИЕ 1.2.1: РУЧНЫЕ БИГРАММЫ (Вариант 5)
    # =================================================================
    print("\n\n--- ЗАДАНИЕ 1.2.1: БИГРАММЫ (Обучение на 'Правда да против') ---")
    train_phrase = "правдадапротив" # без пробелов по условию
    
    # Считаем переходы (биграммы)
    bigrams = [train_phrase[i:i+2] for i in range(len(train_phrase)-1)]
    bg_counts = Counter(bigrams)
    char_counts = Counter(train_phrase)
    
    def get_best_next(char):
        # Ищем все пары, начинающиеся на 'char'
        options = {bg[1]: count for bg, count in bg_counts.items() if bg[0] == char}
        return max(options, key=options.get) if options else "_"

    # Восстановление: Р_внение _а п_ а _ о
    r1 = get_best_next('р') # после 'р' идет 'а' (50%) или 'о' (50%)
    # Для "_а" ищем, что чаще всего стоит перед 'а' (это 'д', т.к. 'да' и 'да')
    r2 = 'д' 
    r3 = get_best_next('п') # после 'п' идет 'р' (100%)
    r4 = get_best_next('а') # после 'а' чаще всего 'в' или 'д' (выберем 'в')
    
    print(f"Обучающая фраза: {train_phrase}")
    print(f"Результат восстановления: Р{r1}внение {r2}а п{r3}а{r4}о")
    print("Примечание: 'да' вместо 'на' — это нормально, так как буквы 'н' нет в обучении.")

    # =================================================================
    # ЗАДАНИЕ 1.2.2: ЦЕПИ МАРКОВА (Текст Достоевского)
    # =================================================================
    print("\n\n--- ЗАДАНИЕ 1.2.2: МАРКОВСКИЕ ЦЕПИ ---")
    text_dost = "он зажег свечу и осмотрел нумер подробнее это была клетушка до того маленькая"
    clean_dost = "".join(re.findall(r'[а-яё]+', text_dost.lower()))
    
    dost_bigrams = Counter([clean_dost[i:i+2] for i in range(len(clean_dost)-1)])
    
    def predict_dost(char):
        opts = {bg[1]: count for bg, count in dost_bigrams.items() if bg[0] == char}
        return max(opts, key=opts.get) if opts else " "

    # Тест на фразе: н_ ст_ле догор_ла св_ча
    print(f"Восстановление фразы по Достоевскому: н{predict_dost('н')} ст{predict_dost('т')}ле догор{predict_dost('р')}ла св{predict_dost('в')}ча")

    # =================================================================
    # ЗАДАНИЕ 1.3.2: КЛАССИФИКАЦИЯ СПАМА (Байес)
    # =================================================================
    print("\n\n--- ЗАДАНИЕ 1.3.2: СПАМ-ФИЛЬТР (Наивный Байес) ---")
    # Мини-датасет на основе слов-маркеров Варианта 5
    train_data = [
        "купи сейчас акция скидка цена", 
        "последний шанс забрать выигрыш срочно",
        "привет как дела встретимся завтра",
        "лекция по математике начнется в десять",
        "фото с прогулки в архиве",
        "запрос на сохранение данных"
    ]
    train_labels = [1, 1, 0, 0, 0, 0] # 1 - спам, 0 - хам
    
    model = MultinomialNB()
    vec = CountVectorizer()
    
    X = vec.fit_transform(train_data)
    model.fit(X, train_labels)
    
    # Тест (Вариант 5: слова 'срочно', 'цена', 'последний')
    test_msg = ["срочно цена последний запрос"]
    X_test = vec.transform(test_msg)
    
    pred = model.predict(X_test)
    prob = model.predict_proba(X_test)
    
    print(f"Сообщение: {test_msg[0]}")
    print(f"Класс: {'СПАМ' if pred[0] == 1 else 'НЕ СПАМ'}")
    print(f"Вероятность спама: {prob[0][1]:.4f}")

if __name__ == "__main__":
    solve_workbook_6()