跳到主要內容

NLP Day 7 中文任務的特殊處理:斷詞、繁簡與 zhBERT 家族

NLP Day 7 中文任務的特殊處理:斷詞、繁簡與 zhBERT 家族

執行需求:CPU 可跑。今天專門處理中文 NLP 的特殊議題:斷詞、繁簡轉換、半形全形混用,並且用 zhBERT 家族做中文分類與 NER 微調。會比較 bert-base-chinese、hfl/chinese-roberta-wwm-ext、hfl/chinese-macbert-base 等模型在中文任務上的差異,並示範用一個乾淨的中文客服訊息資料集做情緒分類。讀完之後你會知道中文 NLP 的細節,以及怎麼選對中文模型。

引言

為什麼中文需要專門一篇?因為中文 NLP 跟英文有四個根本差異:第一,沒有空格當詞界,斷詞品質直接影響下游表現;第二,繁體、簡體、半形、全形混用,需要標準化;第三,新詞(網路流行語、新興品牌)會持續出現,預訓練模型需要定期更新;第四,標點、量詞、語氣詞對語意影響很大,傳統詞袋模型會忽略這些。BERT 出現後,這些問題大幅緩解(因為 BERT 用 character-level 的 WordPiece),但仍有不少細節需要處理。

今天的重點是「中文 NLP 的 zhBERT 家族」。會介紹四個主流模型:bert-base-chinese(Google 原版,簡體)、hfl/chinese-roberta-wwm-ext(哈工大,簡體、全詞遮罩)、hfl/chinese-macbert-base(哈工大,糾正型遮罩)、bert-base-chinese-traditional(部分社群微調的繁體版)。每個模型都有不同特性,選對模型對中文任務的品質影響巨大。

今天的範例包括:用 bert-base-chinese 做情緒分類、用 chinese-roberta-wwm-ext 做中文 NER、用 OpenCC 做繁簡轉換、jieba + 自訂詞典做領域斷詞。所有範例都設計成 Colab CPU 可跑(中文模型推論在 CPU 上每秒數十句到數百句,訓練可用 T4)。

中文 NLP 的四大難題

在進入 zhBERT 之前,先把中文 NLP 的四個難題講清楚:

  1. 斷詞歧義:「下雨天留客天」可以切成「下雨天 / 留客 / 天」(主人說要留客人吃飯)或「下雨 / 天留 / 客天」(純描述天氣)。沒有語境就無法定論。
  2. 新詞偵測:「躺平」、「內捲」、「ChatGPT」這些 2020 年後才出現的詞,jieba 預設詞典沒有。
  3. 繁簡混用:「台灣」vs「臺灣」、「資訊」vs「資訊」在不同資料集可能同時出現。
  4. 多語混合:中文文本常夾雜英文、數字、表情符號(例如「這次 IPO 募資很成功」加上一些符號)。

Day 3 用 jieba 處理了前三個的基礎,今天會用 BERT 的方式重新看這些問題:BERT 用 character-level WordPiece 訓練,能緩解斷詞歧義;繁簡透過 OpenCC 標準化;多語混合則直接交給 tokenizer 處理。

繁簡轉換:OpenCC 標準化

繁簡轉換看似簡單,其實有 4 種對應規則:

  • 簡體轉繁體(s2t):「台灣」→「臺灣」、「資訊」→「資訊」。
  • 繁體轉簡體(t2s):反向。
  • 簡體轉台灣繁體(s2tw):除了字型轉換還會呼叫詞(台灣 vs 臺灣)。
  • 繁體轉台灣繁體(t2tw):只調整用詞不動字型。

用 OpenCC 實作:

try:
    import opencc
except ImportError:
    print("請先 pip install opencc-python-reimplemented")

# 簡體轉繁體
s2t = opencc.OpenCC("s2t")
texts_simp = ["台灣是個美麗的地方,資訊科技发达。", "清华大学位于北京。"]
texts_trad = [s2t.convert(t) for t in texts_simp]
for s, t in zip(texts_simp, texts_trad):
    print(f"簡:{s}")
    print(f"繁:{t}")
# 輸出範例:
# 簡:台灣是個美麗的地方,資訊科技发达。
# 繁:臺灣是個美麗的地方,資訊科技發達。
#
# 簡:清华大学位于北京。
# 繁:清華大學位於北京。

# 簡體轉台灣用詞
s2tw = opencc.OpenCC("s2tw")
texts_tw = [s2tw.convert(t) for t in texts_simp]
for s, t in zip(texts_simp, texts_tw):
    print(f"簡:{s}")
    print(f"繁(台灣用詞):{t}")
# 輸出範例:
# 簡:台灣是個美麗的地方,資訊科技发达。
# 繁(台灣用詞):臺灣是個美麗的地方,資訊科技發達。
#
# 簡:清华大学位于北京。
# 繁(台灣用詞):清華大學位於北京。

OpenCC 的差異在於「字型」與「用詞」:簡轉繁只動字型,簡轉台灣繁體還會把「資訊」改成「資訊」、「軟體」改成「軟體」。實務上做中文 NLP 建議統一轉成同一種字型(通常用繁體台灣用詞,因為台灣語料較多),避免下游模型學到不一致的詞彙。

zhBERT 家族:四個主流模型

中文 BERT 模型經過多年演進,主流選項有四個。它們的差異主要在訓練語料、預訓練任務、詞表(vocabulary):

  • bert-base-chinese:Google 2018 釋出,訓練語料為簡體中文維基百科,約 13 億字。詞表 21,128 字。是最廣為人知的中文 BERT。
  • hfl/chinese-roberta-wwm-ext:哈工大 2019 釋出,訓練語料擴展為維基百科 + 擴充資料,約 54 億字。使用 Whole Word Masking(WWM)預訓練任務,對中文更友善。詞表相同。
  • hfl/chinese-macbert-base:哈工大 2020 釋出,把 WWM 改成 MLM-as-correction(MAC)。在多項中文任務上表現最好。詞表相同。
  • bert-base-multilingual-cased:Google 釋出的多語言版本,支援 104 種語言。中文表現略差於專門的中文模型,但跨語言任務(如中英翻譯)很有用。

用一段 Python 把這四個模型都載入一次,比較它們的詞表與輸出維度:

from transformers import AutoTokenizer

models = {
    "bert-base-chinese": "bert-base-chinese",
    "chinese-roberta-wwm-ext": "hfl/chinese-roberta-wwm-ext",
    "chinese-macbert-base": "hfl/chinese-macbert-base",
    "multilingual-bert": "bert-base-multilingual-cased",
}

for name, model_id in models.items():
    tok = AutoTokenizer.from_pretrained(model_id)
    vocab_size = tok.vocab_size
    test = tok("台灣是一個美麗的島嶼。")
    print(f"{name}:")
    print(f"  詞表大小:{vocab_size}")
    print(f"  tokens:{test['input_ids']}")
    print(f"  decode:{tok.decode(test['input_ids'])}")
    print()
# 輸出範例(會依下載順序略有差異):
# bert-base-chinese:
#   詞表大小:21128
#   tokens:[101, 1378, 7305, 3221, 671, 7028, 4638, 7428, 704, 102]
#   decode:[CLS] 台 灣 是 一 個 美 麗 的 島 嶼 。 [SEP]
#
# chinese-roberta-wwm-ext:
#   詞表大小:21128
#   tokens:[101, 1378, 7305, 3221, 671, 7028, 4638, 7428, 704, 102]
#   decode:[CLS] 台 灣 是 一 個 美 麗 的 島 嶼 。 [SEP]
# 實際數字會依模型略有不同

可以看到這幾個模型的中文 token 化是「字元級」:每個漢字都被切成單一 token。這與英文不同(英文會切成 subword)。好處是 OOV(未登入詞)問題大幅緩解;壞處是長度較長(一句話常常 20–30 個 token),BERT 的 512 token 上限可能會比較快耗盡。對應處理:截斷長文本或用 Longformer 等長序列模型。

中文情緒分類:ChnSentiCorp 資料集

用 Hugging Face 上的 ChnSentiCorp 資料集做中文情緒分類。這個資料集是 2008 年由中科院計算所釋出,約 7,000 則飯店與電商評論,正負標籤各半:

from datasets import load_dataset

# 載入 ChnSentiCorp
dataset = load_dataset("lansinuote/ChnSentiCorp", trust_remote_code=True)
print(f"資料集結構:{dataset}")
# 輸出範例:
# 資料集結構:DatasetDict({
#   train: Dataset({features: ['text', 'label'], num_rows: 6000})
#   validation: Dataset({...}),
#   test: Dataset({...}),
# })

# 看樣本
samples = dataset["train"].shuffle(seed=42).select(range(3))
for s in samples:
    print(f"標籤:{s['label']}(0 = 負、1 = 正)")
    print(f"文字:{s['text'][:80]}")
    print()
# 輸出範例:
# 標籤:1(0 = 負、1 = 正)
# 文字:這次入住的飯店房間很大,服務態度也很好,下次還會再來。
#
# 標籤:0(0 = 負、1 = 正)
# 文字:飯店位置很偏,找了半天才找到,前台態度還很差。
#
# 標籤:1(0 = 負、1 = 正)
# 文字:地理位置優越,鄰近地鐵站和商圈,交通便利。

ChnSentiCorp 是繁體中文情緒分析的經典資料集,比 Day 5 用的 IMDB 規模小,但對繁體中文特別有用。實務上要部署到台灣市場(飯店、電商、論壇)的情緒分析,ChnSentiCorp 是很好的起點。

用 chinese-roberta-wwm-ext 微調中文情緒分類

用哈工大的 chinese-roberta-wwm-ext 做微調,預期能達到 90% 以上正確率:

from transformers import (
    AutoTokenizer,
    AutoModelForSequenceClassification,
    TrainingArguments,
    Trainer,
)

model_name = "hfl/chinese-roberta-wwm-ext"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=2)

def tokenize(batch):
    return tokenizer(
        batch["text"],
        padding="max_length",
        truncation=True,
        max_length=128,
    )

tokenized = dataset.map(tokenize, batched=True)
tokenized.set_format("torch", columns=["input_ids", "attention_mask", "label"])

train_ds = tokenized["train"].shuffle(seed=42).select(range(2000))
eval_ds = tokenized["validation"].shuffle(seed=42).select(range(500))

args = TrainingArguments(
    output_dir="./chn_roberta",
    num_train_epochs=3,
    per_device_train_batch_size=16,
    per_device_eval_batch_size=32,
    eval_strategy="epoch",
    save_strategy="no",
    learning_rate=2e-5,
    report_to="none",
)

trainer = Trainer(model=model, args=args, train_dataset=train_ds, eval_dataset=eval_ds)
print("開始微調中文情緒分類...")
trainer.train()

# 評估
metrics = trainer.evaluate()
print(f"\n評估:{metrics}")
# 輸出範例:
# 開始微調中文情緒分類...
# {'eval_loss': 0.2341, 'eval_runtime': 4.8, ...}

chinese-roberta-wwm-ext 在中文任務上比 bert-base-chinese 略好,原因有兩個:第一,訓練資料更多(54 億字 vs 13 億字);第二,WWM(Whole Word Masking)預訓練任務對中文更友善,因為中文的「詞」比「字」更接近語意單位。微調 3 個 epoch 在 Colab T4 上約 5 分鐘,跑完正確率約 91%。

中文 NER:用 bert-base-chinese 微調

Day 6 用 CoNLL-2003 做了英文 NER,今天用中文 NER 資料集(MSRA 或 OntoNotes 中文版)做微調。中文 NER 比英文簡單,因為 BERT 把每個漢字當 token,不需要 subword 對齊:

from datasets import load_dataset

# 用 MSRA 中文 NER 資料集
dataset = load_dataset("msra", trust_remote_code=True)

# 中文 NER 的標籤定義:包含 O, B-PER, I-PER, B-ORG, I-ORG, B-LOC, I-LOC
label_list = ['O', 'B-PER', 'I-PER', 'B-ORG', 'I-ORG', 'B-LOC', 'I-LOC']

# 看一筆樣本
sample = dataset["train"][0]
print(f"句子:{sample['tokens'][:20]}")
print(f"標籤:{sample['ner_tags'][:20]}")
# 輸出範例:
# 句子:['華', '盛', '頓', '的', '領', '袖', '會', '晤', '了', '紐', '約', '的', '總', '統']
# 標籤:[1, 2, 2, 0, 0, 0, 0, 0, 0, 3, 4, 4, 0, 0]
# 解讀:B-LOC(B-华盛顿)、I-LOC、O、O、O、O、O、O、O、B-LOC(B-纽约)、I-LOC、I-LOC、O、O

# 用 bert-base-chinese 做微調(與英文 NER 流程類似)
model_name = "bert-base-chinese"
from transformers import AutoModelForTokenClassification
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForTokenClassification.from_pretrained(
    model_name,
    num_labels=len(label_list),
)

def tokenize_and_align_labels(examples):
    tokenized = tokenizer(
        examples["tokens"],
        truncation=True,
        is_split_into_words=True,
        max_length=128,
    )
    labels = []
    for i, label in enumerate(examples["ner_tags"]):
        word_ids = tokenized.word_ids(batch_index=i)
        previous_word_idx = None
        label_ids = []
        for word_idx in word_ids:
            if word_idx is None:
                label_ids.append(-100)
            elif word_idx != previous_word_idx:
                label_ids.append(label[word_idx])
            else:
                label_ids.append(-100)
            previous_word_idx = word_idx
        labels.append(label_ids)
    tokenized["labels"] = labels
    return tokenized

tokenized = dataset.map(tokenize_and_align_labels, batched=True)
tokenized.set_format("torch", columns=["input_ids", "attention_mask", "labels"])

# 取子集示範
train_ds = tokenized["train"].shuffle(seed=42).select(range(2000))
eval_ds = tokenized["validation"].shuffle(seed=42).select(range(500))

args = TrainingArguments(
    output_dir="./zh_ner",
    num_train_epochs=2,
    per_device_train_batch_size=16,
    eval_strategy="epoch",
    save_strategy="no",
    learning_rate=3e-5,
    report_to="none",
)
trainer = Trainer(model=model, args=args, train_dataset=train_ds, eval_dataset=eval_ds)
print("開始微調中文 NER...")
trainer.train()
# 輸出範例:
# 開始微調中文 NER...

中文 NER 比英文 NER 簡單:因為 BERT 用 character-level tokenization,每個 token 就是一個漢字,不需要 subword 對齊的複雜處理。微調 2,000 筆在 T4 上約 5 分鐘,正確率(F1)通常能到 90% 以上,比英文 NER 的 92% 略低,主要原因是中文實體邊界更模糊。

完整實作:中文客服訊息標準化管線

把今天的工具整合成一個處理繁簡混雜、斷詞、自訂詞典的實戰管線:

import jieba
import opencc
import re

# 1. 載入自訂詞典
custom_words = ["台積電", "張忠謀", "鴻海", "郭台銘", "聯發科", "蔡明介"]
for word in custom_words:
    jieba.add_word(word)

# 2. 設定 OpenCC
cc = opencc.OpenCC("s2tw")  # 簡體轉台灣繁體

# 3. 完整的前處理管線
def preprocess_zh(text):
    # 全形轉半形
    result = []
    for ch in text:
        code = ord(ch)
        high_byte = code // 256
        low_byte = code - high_byte * 256
        lo = low_byte
        if high_byte == 0xFF and (lo - 0x01) >= 0 and (0x5E - lo) >= 0:
            result.append(chr(code - 0xFEE0))
        else:
            result.append(ch)
    text = "".join(result)
    # 簡體轉繁體
    text = cc.convert(text)
    # 統一標點
    punct_map = {",": ",", ".": "。", "!": "!", "?": "?"}
    for src, dst in punct_map.items():
        text = text.replace(src, dst)
    return text

# 4. 測試
test_messages = [
    "台积电的张忠谋在台北发表演讲,讨论半导体未来。",
    "鸿海的郭台铭与联发科的蔡明介见面,讨论合作。",
    "请问ChatGPT可以用在客服吗?",
]

for msg in test_messages:
    normalized = preprocess_zh(msg)
    tokens = list(jieba.cut(normalized, cut_all=False))
    print(f"原始:{msg}")
    print(f"標準化後:{normalized}")
    print(f"斷詞:{' / '.join(tokens)}")
    print()
# 輸出範例:
# 原始:台积电的张忠谋在台北发表演讲,讨论半导体未来。
# 標準化後:臺積電的張忠謀在臺北發表演講,討論半導體未來。
# 斷詞:臺積電 / 的 / 張忠謀 / 在 / 臺北 / 發表 / 演講 / , / 討論 / 半導體 / 未來 / 。
#
# 原始:鸿海的郭台铭与联发科的蔡明介见面,讨论合作。
# 標準化後:鴻海的郭台銘與聯發科的蔡明介見面,討論合作。
# 斷詞:鴻海 / 的 / 郭台銘 / 與 / 聯發科 / 的 / 蔡明介 / 見面 / , / 討論 / 合作 / 。
#
# 原始:请问ChatGPT可以用在客服吗?
# 標準化後:請問ChatGPT可以用在客服嗎?
# 斷詞:請問 / ChatGPT / 可以 / 用在 / 客服 / 嗎 / ?
# 實際斷詞會依 jieba 詞典略有不同

這段完整管線做了四件事:全形轉半形、簡體轉繁體台灣用詞、統一標點、jieba 斷詞(含自訂詞典)。可以看到「台积电」→「臺積電」、「张忠谋」→「張忠謀」正確轉換,自訂詞典讓「鴻海」、「聯發科」正確被視為單一詞。實務上這個管線是中文 NLP 專案的標準入口。

常見錯誤與踩雷

第一個雷是「繁簡混用沒統一」。訓練資料用簡體,部署資料用繁體;或同一份文件混用兩種字。對應排查:在資料載入時統一做 OpenCC 轉換,並把轉換規則寫到 inference_spec.md。

第二個雷是「自訂詞典沒更新」。jieba 預設詞典停留在 2014,新詞不會被切出。對應排查:定期從業務資料抽取新詞、加入詞典。常見來源:客服工單、社群貼文、新聞標題。

第三個雷是「用 bert-base-chinese 跑繁體」。bert-base-chinese 訓練時只用簡體字,繁體字會被切成「未登入」token,效果大幅下降。對應排查:把繁體統一轉成簡體再丟進模型;或改用 chinese-roberta-wwm-ext 等對繁簡相容較好的模型。

第四個雷是「中文長文本超過 512 token」。BERT 上限是 512 token,但中文 tokenization 每字一個 token,512 個漢字等於 2,000 字左右。長合約、長論文常常超過。對應處理:滑動視窗(切多個 chunk)、摘要(先抽重點)、Longformer 等長序列模型。

效能與實務提醒

chinese-roberta-wwm-ext 在 Colab CPU 上每秒可編碼約 50 句、在 T4 上約 200 句。bert-base-chinese 速度相近,但參數量略小。微調 2,000 筆中文資料在 T4 上 3 epoch 約 10 分鐘。

zhBERT 模型的選型建議:通用中文任務用 chinese-roberta-wwm-ext;需要更高品質且可接受慢一點用 chinese-macbert-base;多語言任務用 bert-base-multilingual-cased;領域專用語料(例如財經、醫療)建議從 chinese-macbert-base 開始,再用領域資料微調。

最後提醒:中文 NLP 的標註資源比英文少很多。ChnSentiCorp、MSRA NER 都是只有幾千到幾萬筆的小資料集。要做大模型訓練,建議先用通用資料預訓練、再用任務資料微調(Day 18 會展開)。

中文的預訓練資料選擇

zhBERT 家族的預訓練資料來源決定了它們的能力:

  • bert-base-chinese:使用簡體中文維基百科約 13 億字。涵蓋新聞、政治、文化、科學等主題,但對台灣用詞、生活化用語較弱。
  • chinese-roberta-wwm-ext:除維基百科外加入擴充語料(百度百科、知乎、微博等),共約 54 億字。涵蓋網路用語、生活對話,但仍以簡體為主。
  • chinese-macbert-base:與 wwm-ext 相同語料,但訓練任務改為 MLM-as-correction。在多項中文基準(CLUE、FewCLUE)上表現領先。

如果你的任務是繁體中文(台灣、香港),有兩個策略:第一,把繁體轉成簡體再丟給 zhBERT 預訓練模型,缺點是損失部分用詞差異;第二,用台灣繁體語料(UDN、新聞媒體)繼續預訓練(continue pretraining),再微調。實務上兩種都能用,第一種比較省事。

中文的 token 級與 character 級

值得提醒的是,中文 BERT 的 tokenization 是「character 級」,每個漢字都是一個 token。這跟英文 BERT 的 subword 級不同。優點是 OOV 問題大幅緩解(每個漢字都在詞表內),缺點是長度計算方式不同。對應處理:把 token 數量除以漢字數量,得到的是「平均每字 token 數」,中文 BERT 這個值是 1.0(含標點稍多)。

實務上的影響:同樣 512 token 上限,英文可以容納約 400 個單字,中文只能容納約 500 個漢字。中文長文本處理常常會更早觸發截斷,需要提早規劃。Day 30 的 GraphRAG 篇章會示範如何用 chunking 策略處理長文本。

與英文 BERT 的差異總結

把今天學到的中文 NLP 知識總結成五個關鍵差異:

  1. tokenization:英文是 subword、中文是 character。
  2. 斷詞:英文有空格、中文需要 jieba 等工具。
  3. 繁簡:英文無此問題,中文需要 OpenCC 標準化。
  4. 訓練資料:英文有大量預訓練資料,中文需要選對 zhBERT 模型。
  5. 標註資源:英文有 NLU benchmark,中文主要靠 CLUE、FewCLUE 等。

理解這些差異後,做中文 NLP 專案時就能避開最常見的陷阱,也能針對中文的特性選擇最適合的工具。

小結

今天把中文 NLP 的特殊處理完整走過:繁簡轉換(OpenCC)、中文斷詞(jieba + 自訂詞典)、zhBERT 家族(bert-base-chinese、chinese-roberta-wwm-ext、chinese-macbert-base、bert-base-multilingual-cased)、中文情緒分類微調、中文 NER 微調。我們用 ChnSentiCorp 與 MSRA NER 兩個真實的中文資料集做了完整實驗。明天 Day 8 會進入情緒分析的深度篇:用詞典法、混合方法、Transformer 多模型比較,並示範一個客服訊息情緒分析的完整系統。

結語

中文 NLP 不是「英文 NLP 加上斷詞」這麼簡單。zhBERT 家族的出現讓中文 NLP 大幅簡化,但繁簡轉換、自訂詞典、領域微調仍是中文任務的標準工序。今天學到的「OpenCC + jieba + chinese-roberta-wwm-ext」三件套,能應付 80% 的中文 NLP 場景。剩下的 20% 困難任務(醫療、法律、財經),需要客製化詞典與領域微調,這會在 Day 11、Day 18 的標註與資料準備篇章深入討論。明天,我們會把情緒分析這個任務做深:除了微調 BERT,也會介紹詞典法(NTUSD、MOAW)、混合方法(詞典 + Transformer),以及怎麼用 LLM 做 zero-shot 情緒分析。

延伸資源

  • OpenCC 簡繁轉換文件(2025):https://github.com/BYVoid/OpenCC
  • 哈工大 chinese-bert 系列(2019–2020):https://github.com/ymcui/Chinese-BERT-wwm
  • ChnSentiCorp 資料集(2008):https://huggingface.co/datasets/lansinuote/ChnSentiCorp
  • MSRA 中文 NER 資料集(2006):https://huggingface.co/datasets/msra
  • jieba 0.42 繁體中文斷詞範例(2025):https://github.com/fxsjy/jieba/blob/master/test/parallel/cut_for_test.py

留言

這個網誌中的熱門文章

Day 2 變數與資料型別

Day 2 變數與資料型別 引言 寫程式的過程中,變數與資料型別是處理資料的基礎。變數是存放資料的容器,資料型別則決定這筆資料有哪些特性、可以進行哪些操作。學會定義變數、認識各種資料型別,是學好 Python 的關鍵一步。 這篇文章會帶你了解 Python 中變數的觀念、如何定義變數,以及常見的資料型別,包括整數、浮點數、字串、布林值,還有串列、元組、字典與集合等容器型別。我們也會介紹變數的命名規則與撰寫風格建議,以及如何用 type() 檢查資料型別。 什麼是變數?如何在 Python 中定義變數 變數是在程式執行時用來存放資料的名稱。透過定義變數,我們可以給一筆資料一個名字,並在程式的其他地方用這個名字取用該筆資料。在 Python 中,變數不需要事先宣告型別,因為 Python 是動態型別語言,變數的型別由指定給它的值決定。 定義變數的基本語法 在 Python 中定義變數非常簡單,只要用賦值符號 = 把值指定給變數即可。例如: x = 5 # 定義變數 x,並把整數 5 賦值給它 name = "Alice" # 定義變數 name,並把字串 "Alice" 賦值給它 在這裡,x 是一個變數,被賦予整數 5;name 是另一個變數,被賦予字串 "Alice"。 變數的更新與覆寫 變數的值可以修改,也就是說,我們可以在程式的不同地方給同一個變數新的值。例如: x = 10 # x 最初被賦予 10 x = 15 # x 的值現在被更新為 15 這樣就能依照需求,在程式執行過程中靈活調整變數的值。 Python 的動態型別系統 Python 和某些靜態型別語言不同,定義變數時不需要宣告型別。賦值時,Python 會根據值自動判斷變數的型別。例如: x = 5 # x 是整數 x = 3.14 # x 變成浮點數 x = "Hi" # x 變成字串 同一個變數在程式執行過程中可以存放不同型別的值,這是 Python 的彈性之一。 常見資料型別 在 Python 中,資料型別決定我們可以對變數進行哪些操作...

Python 從入門到 PyTorch 深度學習:開啟 AI 世界的大門

Python 從入門到 PyTorch 深度學習:開啟 AI 世界的大門 隨著人工智慧(AI)與深度學習(Deep Learning)快速發展,越來越多人對這些技術產生興趣。不論你是想踏入 AI 領域的初學者,還是已經有程式基礎的開發者,學好 Python 與深度學習框架(例如 PyTorch),都能為你打開更多可能。 為什麼選擇 Python? Python 已經是資料科學與人工智慧領域的首選語言。它的語法簡潔、容易上手,而且擁有龐大的生態系與大量開源函式庫。無論是資料處理、資料視覺化,還是建立機器學習與深度學習模型,Python 都能勝任。對想進入 AI 或資料科學領域的人來說,它幾乎是必備工具。 PyTorch 是什麼? PyTorch 是由 Meta(原 Facebook)AI 研究團隊開發的開源深度學習框架,以易用、靈活和動態計算圖著稱,是許多 AI 研究人員與開發者的首選。相較於其他框架,PyTorch 的寫法更貼近原生 Python,對初學者相對友善。無論是簡單的實驗,還是複雜的深度學習模型,PyTorch 都能提供強大的支援。 這個系列能帶給你什麼? 這個系列會從 Python 的基礎開始,帶你一步一步學習,最後能自己用 PyTorch 建立深度學習模型。即使你完全沒有寫過程式,也能跟著文章的節奏累積技能,理解 AI 與深度學習的核心觀念。 本系列涵蓋的主題 Python 基礎:從變數、條件判斷到函式與模組。 資料處理工具:用 NumPy 與 Pandas 有效率地操作資料。 資料視覺化:用 Matplotlib 與 Seaborn 把資料畫成圖表。 深度學習的數學基礎:線性代數、微積分與機率。 PyTorch 入門:理解張量、模型建構與 GPU 加速。 基礎深度學習模型:CNN 與 RNN 的實作應用。 深度學習專案實戰:從資料前處理到模型部署的端到端流程。 誰適合這個系列? 程式初學者 :如果你對 AI 充滿好奇,卻還沒寫過程式,系列的第一部分會帶你快速上手 Python,並幫助你理解深度學習的基本觀念。 資料科學愛好者 :如果你已經熟悉一些資料處理方法,進階部分會教你如何用 PyTorch 建構深度學習模型。 開發者與研究人員 :想更深入了...

Day 1 Python 簡介與環境設定

Day 1 Python 簡介與環境設定 引言 在現在的科技環境裡,程式設計已經是一項重要技能。無論你是對資料科學有興趣、想成為開發者,或是想踏入人工智慧(AI)領域,學會寫程式都能明顯提升你的競爭力。在眾多程式語言中,Python 因為語法簡單、功能強大、應用範圍廣泛,成為許多人進入程式世界的第一選擇。這篇文章會帶你認識 Python 的背景與優勢,並一步步教你在不同系統上安裝與設定 Python 開發環境,最後寫出第一支 Python 程式。 為什麼選擇 Python? Python 是一種高階程式語言,由 Guido van Rossum 在 1991 年發布。Python 的設計哲學強調程式碼的可讀性,並用縮排來定義程式區塊,這點和許多使用大括號的語言不同。簡潔的語法讓它成為初學者的理想選擇;就算是經驗豐富的開發者,也能用它完成複雜的專案。 Python 的優勢如下: 簡單易學 :Python 的語法清楚、結構簡潔,初學者很快就能上手。和其他語言相比,學習曲線相對平緩,不需要先弄懂一堆複雜觀念,就能開始寫程式。 應用範圍廣泛 :從資料科學、網頁開發、人工智慧、機器學習、自動化測試到網路爬蟲,Python 都有大量開源函式庫與工具支援,而且在這些領域都扮演關鍵角色。 豐富的函式庫與框架 :Python 的函式庫生態系非常龐大。做資料分析有 NumPy、Pandas;開發網站有 Django、Flask;做深度學習有 TensorFlow、PyTorch。各種需求幾乎都能找到對應的套件,讓開發更有效率。 跨平台支援 :Python 支援 Windows、macOS、Linux 等作業系統,程式通常不需要太多修改就能跨平台執行,讓開發與部署更有彈性。 活躍的社群 :Python 擁有龐大的開發者社群。學習或開發上遇到問題,幾乎都能在社群與論壇(例如 Stack Overflow)找到答案,對初學者來說是很強的後盾,也能減少卡關時的挫折感。 Python 的應用領域 Python 的流行與強大功能,讓許多領域都開始大量使用它。以下是幾個常見的應用方向: 資料科學 :隨著大數據與人工智慧興起,資料科學大量使用 Python。NumPy、Pandas 與 Matplotlib 等工具能處理和分析龐...