快速答案
本答案頁包含 Python 樸素貝葉斯文字分類 的 4 道選擇題、4 道填空題和 4 道輸出預測題,每題都給出準確答案和簡短解釋。
答案已完整展示,建議先嘗試作答,再用本頁核對。第一次練習最好從互動練習頁開始。
樸素貝葉斯的「樸素」來自哪個獨立假設?
答案: 給定類別後,各特徵被假設為獨立
為什麼: 模型把每個詞的條件似然相乘,就像已知類別後各詞互相獨立。
為什麼要給詞頻加入拉普拉斯平滑?
答案: 避免沒見過的詞把機率變成零
為什麼: 給每個計數加一,讓沒見過的詞也有很小的非零似然。
為什麼要在對數空間給樸素貝葉斯計分?
答案: 很多小機率連乘可能下溢
為什麼: 對數相加數值穩定,同時保留類別排序。
執行結果是什麼?
docs = [("good movie", "pos"), ("great film", "pos"), ("bad movie", "neg"), ("boring film", "neg")]
counts = {}
for text, label in docs:
counts.setdefault(label, {})
for word in text.split():
counts[label][word] = counts[label].get(word, 0) + 1
print(counts["pos"].get("movie", 0))答案: 1
為什麼: movie 這個詞在正類中出現了一次。
補全計數遞增。
counts = {}
word = "movie"
counts[word] = counts.get(word, 0) + ____
print(counts[word])答案: 1
為什麼: 每出現一次,就在原有計數上加一。
補全拉普拉斯平滑的分子。
counts = {"movie": 1}
total = 2
vocab_size = 3
probability = (counts.get("film", 0) + ____) / (total + vocab_size)
print(round(probability, 2))答案: 1
為什麼: 平滑會給詞表中每個詞的觀察計數加一。
補全對數空間的分數計算。
import math
probability = 0.2
print(round(math.____(probability), 3))答案: log
為什麼: log 函式把機率乘積變成加法。
補全先驗的分母。
import math
class_docs = {"pos": 2, "neg": 2}
docs = ["a", "b", "c", "d"]
print(math.log(class_docs["pos"] / ____(docs)))答案: len
為什麼: 先驗用某類文件數除以文件總數。
這段程式列印出什麼?
import math
docs = [("good movie", "pos"), ("great film", "pos"), ("bad movie", "neg"), ("boring film", "neg")]
vocab = sorted({word for text, _ in docs for word in text.split()})
counts = {}
priors = {}
for text, label in docs:
priors[label] = priors.get(label, 0) + 1
counts.setdefault(label, {})
for word in text.split():
counts[label][word] = counts[label].get(word, 0) + 1
def predict(text):
scores = {}
for label in counts:
total = sum(counts[label].values())
score = math.log(priors[label] / len(docs))
for word in text.split():
score += math.log((counts[label].get(word, 0) + 1) / (total + len(vocab)))
scores[label] = score
return max(scores, key=scores.get)
print(predict("great film"))答案: pos
為什麼: 這兩個詞在訓練資料中都偏正類,正類最終得到更高的對數分數。
程式碼的輸出結果是什麼?
docs = [("good movie", "pos"), ("great film", "pos"), ("bad movie", "neg"), ("boring film", "neg")]
counts = {}
for text, label in docs:
counts.setdefault(label, {})
for word in text.split():
counts[label][word] = counts[label].get(word, 0) + 1
print(counts["neg"]["bad"])答案: 1
為什麼: bad 在負類中出現一次,所以計數是 1。
螢幕上會顯示什麼?
docs = ["good movie", "great film", "bad movie", "boring film"]
labels = ["pos", "pos", "neg", "neg"]
print(labels.count("pos") / len(docs))答案: 0.5
為什麼: 四篇訓練文件中有兩篇是正類,所以先驗是 0.5。
這段程式碼會輸出什麼?
counts = {"great": 0}
total = 4
vocab_size = 6
probability = (counts.get("great", 0) + 1) / (total + vocab_size)
print(round(probability, 1))答案: 0.1
為什麼: 平滑後的分子是 1,分母是 10,所以機率是 0.1。
先試一遍題目
打開 Python 樸素貝葉斯文字分類 練習頁,用即時回饋回答同樣的 12 道題。