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