答案頁 · 12 道題

Python 樸素貝葉斯文字分類練習答案

本頁彙整 Python 樸素貝葉斯文字分類 的 12 道練習。先做練習頁,再回到這裡核對準確答案和原因。

快速答案

本答案頁包含 Python 樸素貝葉斯文字分類 的 4 道選擇題、4 道填空題和 4 道輸出預測題,每題都給出準確答案和簡短解釋。

答案已完整展示,建議先嘗試作答,再用本頁核對。第一次練習最好從互動練習頁開始。

01 · 選擇題

樸素貝葉斯的「樸素」來自哪個獨立假設?

  1. 給定類別後,各特徵被假設為獨立正確答案
  2. 每個類別先驗相同
  3. 所有詞長度相同
  4. 標籤總是平衡的

答案: 給定類別後,各特徵被假設為獨立

為什麼: 模型把每個詞的條件似然相乘,就像已知類別後各詞互相獨立。

02 · 選擇題

為什麼要給詞頻加入拉普拉斯平滑?

  1. 給詞表排序
  2. 讓訓練文件變長
  3. 刪除先驗
  4. 避免沒見過的詞把機率變成零正確答案

答案: 避免沒見過的詞把機率變成零

為什麼: 給每個計數加一,讓沒見過的詞也有很小的非零似然。

03 · 選擇題

為什麼要在對數空間給樸素貝葉斯計分?

  1. 這樣就不需要平滑
  2. 它把計數變成整數
  3. 很多小機率連乘可能下溢正確答案
  4. 對數會讓類別自動平衡

答案: 很多小機率連乘可能下溢

為什麼: 對數相加數值穩定,同時保留類別排序。

04 · 選擇題

執行結果是什麼?

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. 2
  2. 0
  3. 1正確答案
  4. 4

答案: 1

為什麼: movie 這個詞在正類中出現了一次。

05 · 填空題

補全計數遞增。

counts = {}
word = "movie"
counts[word] = counts.get(word, 0) + ____
print(counts[word])

答案: 1

為什麼: 每出現一次,就在原有計數上加一。

06 · 填空題

補全拉普拉斯平滑的分子。

counts = {"movie": 1}
total = 2
vocab_size = 3
probability = (counts.get("film", 0) + ____) / (total + vocab_size)
print(round(probability, 2))

答案: 1

為什麼: 平滑會給詞表中每個詞的觀察計數加一。

07 · 填空題

補全對數空間的分數計算。

import math
probability = 0.2
print(round(math.____(probability), 3))

答案: log

為什麼: log 函式把機率乘積變成加法。

08 · 填空題

補全先驗的分母。

import math
class_docs = {"pos": 2, "neg": 2}
docs = ["a", "b", "c", "d"]
print(math.log(class_docs["pos"] / ____(docs)))

答案: len

為什麼: 先驗用某類文件數除以文件總數。

09 · 輸出預測

這段程式列印出什麼?

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

為什麼: 這兩個詞在訓練資料中都偏正類,正類最終得到更高的對數分數。

10 · 輸出預測

程式碼的輸出結果是什麼?

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。

11 · 輸出預測

螢幕上會顯示什麼?

docs = ["good movie", "great film", "bad movie", "boring film"]
labels = ["pos", "pos", "neg", "neg"]
print(labels.count("pos") / len(docs))

答案: 0.5

為什麼: 四篇訓練文件中有兩篇是正類,所以先驗是 0.5。

12 · 輸出預測

這段程式碼會輸出什麼?

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 道題。

練習本課