Загрузка данных
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()