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


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 main():
    # =================================================================
    # ЗАДАНИЕ 1.1.1 - 1.1.2: ВЕКТОРИЗАЦИЯ И КЛЮЧЕВЫЕ СЛОВА (Вариант 5)
    # =================================================================
    print("--- ЗАДАНИЕ 1.1.1 - 1.1.2: Ключевые слова и Векторизация ---")
    
    data = [
        "Студенты учат лекции",
        "Ошибки учат нас быть лучше",
        "Лекции нужно посещать, чтобы учиться лучше"
    ]
    
    # 1.1.1 Выделение ключевых и контекстных слов (логика на основе частоты/смысла)
    # Контекстное слово — то, которое объединяет предложения (учат/учиться)
    print("\n[1.1.1] Ключевые слова:")
    keywords = [
        {"Предложение": data[0], "Ключевые слова": "студенты, лекции", "Контекстное": "учат"},
        {"Предложение": data[1], "Ключевые слова": "ошибки, лучше", "Контекстное": "учат"},
        {"Предложение": data[2], "Ключевые слова": "лекции, посещать", "Контекстное": "учиться"}
    ]
    for item in keywords:
        print(f"- {item['Предложение']} | Ключи: {item['Ключевые слова']} | Контекст: {item['Контекстное']}")

    # 1.1.2 Матрицы BoW и TF-IDF
    vectorizer = CountVectorizer()
    tfidf_vec = TfidfVectorizer()
    
    bow = pd.DataFrame(vectorizer.fit_transform(data).toarray(), columns=vectorizer.get_feature_names_out(), index=['D1', 'D2', 'D3'])
    tfidf = pd.DataFrame(tfidf_vec.fit_transform(data).toarray().round(3), columns=tfidf_vec.get_feature_names_out(), index=['D1', 'D2', 'D3'])
    
    print("\nМатрица Bag of Words:")
    print(bow)
    print("\nМатрица TF-IDF:")
    print(tfidf)

    # =================================================================
    # ЗАДАНИЕ 1.2.1: БИГРАММЫ (Вариант 5 - "Правда да против")
    # =================================================================
    print("\n\n--- ЗАДАНИЕ 1.2.1: БИГРАММЫ (Ручной расчет) ---")
    train_121 = "правдадапротив"
    bg_121 = [train_121[i:i+2] for i in range(len(train_121)-1)]
    counts_121 = Counter(bg_121)
    
    def predict_121(char):
        opts = {bg[1]: c for bg, c in counts_121.items() if bg[0] == char}
        return max(opts, key=opts.get) if opts else "_"

    # Восстановление: Р_внение _а п_ а _ о
    # Буквы 'н' нет, поэтому 'д' (из 'да') — самый вероятный кандидат перед 'а'
    res_121 = f"Р{predict_121('р')}внение {'д'}а п{predict_121('п')}а{predict_121('а')}о"
    print(f"Результат (Вариант 5): {res_121}")

    # =================================================================
    # ЗАДАНИЕ 1.2.2: МАРКОВСКИЕ ЦЕПИ (Достоевский)
    # =================================================================
    print("\n\n--- ЗАДАНИЕ 1.2.2: СТАТИСТИКА БИГРАММ ---")
    text = "он зажег свечу и осмотрел нумер подробнее это была клетушка до того маленькая что даже почти не под рост свидригайлову"
    clean_text = "".join(re.findall(r'[а-яё]+', text.lower()))
    
    unigrams = Counter(clean_text)
    bigram_list = [clean_text[i:i+2] for i in range(len(clean_text)-1)]
    bigram_counts = Counter(bigram_list)
    
    # Расчет вероятностей P(B|A)
    probs = {}
    for bg, count in bigram_counts.items():
        probs[bg] = count / unigrams[bg[0]]
        
    # Вывод Топ-5 по количеству
    print("\nТоп-5 биграмм по количеству появления:")
    for bg, count in bigram_counts.most_common(5):
        print(f"'{bg}': {count} раз(а)")
        
    # Вывод Топ-5 по вероятности
    print("\nТоп-5 биграмм по вероятности P(B|A):")
    sorted_probs = sorted(probs.items(), key=lambda x: x[1], reverse=True)
    for bg, p in sorted_probs[:5]:
        print(f"P('{bg[1]}' | '{bg[0]}') = {p:.2f}")

    # Восстановление фразы: н_ ст_ле догор_ла св_ча
    def predict_dost(char):
        opts = {bg[1]: c for bg, c in bigram_counts.items() if bg[0] == char}
        return max(opts, key=opts.get) if opts else "_"
    
    res_dost = f"н{predict_dost('н')} ст{predict_dost('т')}ле догор{predict_dost('р')}ла св{predict_dost('в')}ча"
    print(f"\nВосстановленная фраза: {res_dost}")

    # =================================================================
    # ЗАДАНИЕ 1.3.2: НАИВНЫЙ БАЙЕС (Вариант 5)
    # =================================================================
    print("\n\n--- ЗАДАНИЕ 1.3.2: КЛАССИФИКАЦИЯ (Наивный Байес) ---")
    # Обучаем на примерах, содержащих слова из твоего варианта
    X_train_raw = [
        "акция купить цена скидка", "срочный запрос пароль", 
        "привет завтра лекция", "фото с моря", "сохранить документ"
    ]
    y_train = [1, 1, 0, 0, 0] # 1 - спам
    
    model = MultinomialNB()
    cv = CountVectorizer()
    
    X_train = cv.fit_transform(X_train_raw)
    model.fit(X_train, y_train)
    
    test_msg = ["срочно цена последний запрос"]
    prediction = model.predict(cv.transform(test_msg))
    
    print(f"Письмо: {test_msg[0]}")
    print(f"Вердикт: {'СПАМ' if prediction[0] == 1 else 'НЕ СПАМ'}")

if __name__ == "__main__":
    main()