使用 Python 處理日語的完整指南|從文字編碼到形態素解析的詳細解說

目次

1. 前言

Python 是眾多程式語言中最受歡迎的一種,以語法簡潔且易於學習而聞名。無論是在資料分析、人工智慧還是網頁開發等各種領域中,Python 都被廣泛運用;在處理日文文本方面,也是一個非常強大的工具。然而,由於日文特有的問題(例如:字元編碼的差異、漢字的複雜性),如果沒有正確的知識,往往會遇到難以解決的困難。

本文將以淺顯易懂的方式,說明如何使用 Python 有效地處理日文,即使是初學者也能輕鬆掌握。閱讀完本文後,您將能解答以下常見疑問:

本文將帶您了解

  • 使用 Python 處理日文時的基本設定方式
  • 常見的日文文本處理問題與對應解法
  • 有助於日文處理的 Python 函式庫使用方式
  • 在實際應用中如何操作與運用日文資料

掌握 Python 的話,即可輕鬆處理包含日文的資料,進一步擴展資料分析與應用程式開發的可能性。

為什麼要用 Python 處理日文?

Python 是一種非常擅長多語言處理的程式語言,特別是內建支援 UTF-8 編碼,讓處理如日文這類多位元字元變得更加容易。此外,還有許多專為日文設計的函式庫與框架可供使用,因此從初學者到進階使用者都廣受歡迎。

舉例來說,Python 在日文自然語言處理(NLP)、形態素分析、資料庫管理,以及支援日文的網頁應用程式開發等場景中,都是不可或缺的工具。

本文的目的

本篇文章的目的是提供使用 Python 處理日文所需的基本知識與實用技巧。具備這些知識,將有助於提升程式效率,並在實務工作中發揮價值。

接下來的章節,將深入說明處理日文時不可忽視的「字元編碼」基礎知識。

2. Python 中的日文字元編碼基礎

當您想用 Python 處理日文資料時,首先必須理解「字元編碼」這個概念。字元編碼是用來讓電腦辨識文字的一種規範,如果不了解正確的編碼方式,就很可能在處理日文資料時遇到問題。本節將說明字元編碼的基本概念,以及如何在 Python 中正確處理。

什麼是字元編碼?

字元編碼是一種將文字轉換為位元(也就是數位資料)的標準格式。常見的字元編碼包括以下幾種:

  • UTF-8:國際標準,廣泛應用於各種系統中,也是 Python 推薦的預設字元編碼。
  • Shift_JIS:日本國內常見的編碼格式,常見於舊系統或特定資料中。
  • EUC-JP:過去在日文環境中使用過的編碼。
  • ISO-2022-JP:主要用於電子郵件的編碼格式。

由於不同編碼會以不同方式轉換字元,因此若資料在不同編碼間轉換不當,就可能出現亂碼(文字無法正常顯示)的情況。

在 Python 中如何處理字元編碼

在 Python 中,字串(string)內部是以「Unicode」格式處理。Unicode 是一種可以統一處理世界各國文字的標準,讓 Python 具有良好的多語言處理能力。但在讀寫檔案或與外部系統互動時,仍需明確指定使用的編碼。

Python 中的編碼設定範例

1. 在原始碼中指定編碼

如果在 Python 原始碼中使用日文,您可以在檔案開頭明確指定編碼方式,例如如下所示:

## -*- coding: utf-8 -*-  
print("こんにちは、Python!")

這行程式碼會告訴 Python,這份原始碼是以 UTF-8 編碼撰寫的。

2. 讀寫檔案時指定編碼

當讀取或寫入包含日文的文字檔案時,指定正確的編碼可以避免文字亂碼。

讀取檔案的範例:

with open("example.txt", "r", encoding="utf-8") as file:  
    content = file.read()  
    print(content)

寫入檔案的範例:

with open("example.txt", "w", encoding="utf-8") as file:  
    file.write("こんにちは、Python!")
3. 編碼與解碼的操作

Python 可在字串(str)與位元組(bytes)之間進行編碼(encode)與解碼(decode)操作。

編碼(字串 → 位元組):

text = "こんにちは"  
encoded_text = text.encode("utf-8")  
print(encoded_text)  ## b'\xe3\x81\x93\xe3\x82\x93\xe3\x81\xab\xe3\x81\xa1\xe3\x81\xaf'

解碼(位元組 → 字串):

decoded_text = encoded_text.decode("utf-8")  
print(decoded_text)  ## こんにちは

Python 中的亂碼對策

當以錯誤的方式解碼資料時,可能會出現亂碼。以下是防止亂碼的最佳實踐建議:

  1. 盡量使用 UTF-8
    Python 預設支援 UTF-8,因此建議始終使用 UTF-8 來處理日文資料。
  2. 明確指定編碼方式
    無論是處理檔案還是與外部系統溝通,都應清楚指定使用的編碼。
  3. 加入錯誤處理機制
    當發生編碼或解碼錯誤時,可以透過例外處理來避免程式中斷。
try:  
    with open("example.txt", "r", encoding="utf-8") as file:  
        content = file.read()  
except UnicodeDecodeError as e:  
    print(f"發生亂碼錯誤: {e}")

小結

只要正確掌握字元編碼的知識,就可以在 Python 中輕鬆處理包含日文的文字資料。特別是選用 UTF-8 作為預設編碼,可以有效避免多數的文字亂碼問題。下一節將進一步說明如何實際處理日文文本。


侍エンジニア塾

3. 使用 Python 處理日文的方法

在使用 Python 處理日文時,除了操作字串與讀寫檔案之外,也需要理解日文特有的問題點。本章節將透過具體範例,說明如何在 Python 中處理日文字串。

日文字串的操作方法

日文字串的基本操作

在 Python 中,字串是 str 型別,並以 Unicode 管理,因此可以輕鬆進行基本的日文字串操作。

範例:日文字串的串接

greeting = "こんにちは"  
name = "佐藤さん"  
message = greeting + "、" + name  
print(message)  ## こんにちは、佐藤さん

範例:重複字串

word = "Python"  
repeated = word * 3  
print(repeated)  ## PythonPythonPython

取得日文字串的長度

使用 len() 函數可以取得字串的字數。

text = "こんにちは"  
print(len(text))  ## 5

不過需要注意,字元數與位元組數不同。若要取得位元組長度,可透過編碼方式處理:

範例:取得位元組數

text = "こんにちは"  
byte_length = len(text.encode("utf-8"))  
print(byte_length)  ## 15

日文字串的切片操作

Python 的字串支援使用切片(slice)取得部分字串。

範例:取得子字串

text = "こんにちは、Python"  
substring = text[0:5]  ## 取得前五個字  
print(substring)  ## こんにちは

使用正規表達式搜尋與取代日文

搜尋日文字串

可透過正規表達式來搜尋特定模式的字串。

範例:搜尋日文字串

import re  
  
text = "今日は天気がいいですね。"  
pattern = "天気"  
match = re.search(pattern, text)  
if match:  
    print(f"找到文字:{match.group()}")  ## 找到文字:天気

取代日文字串

使用正規表達式也可以將指定字串替換為其他文字。

範例:取代日文文字

import re  
  
text = "今日は天気がいいですね。"  
new_text = re.sub("天気", "気候", text)  
print(new_text)  ## 今日は気候がいいですね。

日文特有問題與對應方法

半形與全形文字的處理

日文常出現半形與全形字混用的情況,在處理資料時可能造成困擾。可使用 unicodedata 模組統一格式。

範例:統一半形與全形文字

import unicodedata  
  
text = "ABC123"  
normalized = unicodedata.normalize("NFKC", text)  
print(normalized)  ## ABC123

刪除空白與換行

日文字串中可能包含空白或換行,可使用 strip() 方法去除。

範例:移除字串中的空白與換行

text = "  こんにちは  \n"  
cleaned_text = text.strip()  
print(cleaned_text)  ## こんにちは

日文文字分類

日文中混合了平假名、片假名與漢字,可透過正規表達式來篩選特定類型的文字。

範例:只提取漢字

import re  
  
text = "今日は2024年12月15日です。"  
kanji = re.findall(r"[一-龥]", text)  
print(kanji)  ## ['今', '日', '年', '月', '日']

小結

本章介紹了使用 Python 操作日文字串的基本方法、正規表達式的應用,並探討了日文特有的處理問題。掌握這些技巧後,您將能更高效地處理日文文本。


4. 支援日文處理的 Python 函式庫介紹與使用方式

Python 擁有許多專門處理日文文本的函式庫,可以大幅提升處理效率。本章節將介紹幾個代表性的日文對應函式庫,並說明它們的基本使用方式。

代表性的日文處理函式庫

MeCab

MeCab 是一個功能強大的形態素解析工具。形態素解析是指將句子切割成單詞,並取得詞性等語法資訊。這在日文自然語言處理中相當常見。

安裝方式

您可以透過 Python 的綁定套件 mecab-python3 來使用 MeCab:

pip install mecab-python3
基本使用方式

以下為使用 MeCab 進行日文形態素解析的範例:

import MeCab  
  
text = "今日は天気が良いです。"  
mecab = MeCab.Tagger()  
parsed = mecab.parse(text)  
print(parsed)

輸出範例:

今日    名詞,副詞可能,*,*,*,*,今日,キョウ,キョー  
は      助詞,係助詞,*,*,*,*,は,ハ,ワ  
天気    名詞,一般,*,*,*,*,天気,テンキ,テンキ  
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ  
良い    形容詞,自立,*,*,形容詞・アウオ段,基本形,良い,ヨイ,ヨイ  
です    助動詞,*,*,*,特殊・デス,基本形,です,デス,デス  
。      記號,句點,*,*,*,*,。,。,。  
EOS

Janome

Janome 是一個用純 Python 實作的形態素解析函式庫。它不依賴外部程式,設定簡單,是快速開發或原型製作的好選擇。

安裝方式
pip install janome
基本使用方式

以下為使用 Janome 進行形態素解析的範例:

from janome.tokenizer import Tokenizer  
  
text = "今日は天気が良いです。"  
tokenizer = Tokenizer()  
for token in tokenizer.tokenize(text):  
    print(token)

輸出範例:

今日    名詞,副詞可能,*,*,*,*,今日,キョウ,キョー  
は      助詞,係助詞,*,*,*,*,は,ハ,ワ  
天気    名詞,一般,*,*,*,*,天気,テンキ,テンキ  
が      助詞,格助詞,一般,*,*,*,が,ガ,ガ  
良い    形容詞,自立,*,*,形容詞・アウオ段,基本形,良い,ヨイ,ヨイ  
です    助動詞,*,*,*,特殊・デス,基本形,です,デス,デス  
。      記號,句點,*,*,*,*,。,。,。

SudachiPy

SudachiPy 不僅能進行形態素解析,還能靈活地依據日文語境處理專有名詞與詞語分割。

安裝方式
pip install sudachipy sudachidict_core
基本使用方式

以下為使用 SudachiPy 進行解析的範例:

from sudachipy.tokenizer import Tokenizer  
from sudachipy.dictionary import Dictionary  
  
text = "今日は天気が良いです。"  
tokenizer = Dictionary().create()  
mode = Tokenizer.SplitMode.C  
for token in tokenizer.tokenize(text, mode):  
    print(token.surface())

輸出範例:

今日  
は  
天気  
が  
良い  
です  
。

函式庫選擇的重點

根據下列觀點選擇最適合的函式庫:

| 函式庫 | 特點 | 適用情境 |
|-|–|–|
| MeCab | 提供高精度的形態素解析 | 大型專案、進階分析 |
| Janome | 純 Python 實作,安裝簡單 | 輕量開發、原型驗證 |
| SudachiPy | 適合處理日文中複雜的語境 | 專有名詞處理、精細分詞 |

小結

Python 提供了各種強大的日文處理函式庫。了解每個函式庫的特點並根據需求選擇適合的工具,可以有效提升文本處理的效率與準確度。


RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

5. 處理日文資料的輸入與輸出

使用 Python 處理日文資料時,正確地讀取與寫入檔案,以及處理各種資料格式(例如:CSV、JSON)是非常重要的。本章節將詳細說明日文資料的 I/O 基礎與常見格式的操作方式。

讀寫檔案

讀取文字檔案

讀取包含日文的文字檔案時,務必要指定編碼格式。建議使用 UTF-8,以避免出現亂碼。

範例:讀取日文文字檔

with open("example.txt", "r", encoding="utf-8") as file:  
    content = file.read()  
    print(content)

寫入文字檔案

當將包含日文的資料寫入檔案時,同樣需要指定編碼格式。

範例:寫入日文文字檔

with open("example.txt", "w", encoding="utf-8") as file:  
    file.write("こんにちは、Pythonでファイル操作をしています。")

處理 CSV 檔案

CSV 是最常用的資料交換格式之一。Python 可透過 csv 模組輕鬆處理 CSV 檔案。

讀取 CSV 檔案

讀取包含日文的 CSV 檔案時,建議指定 encoding="utf-8-sig",以避免在如 Excel 等工具中出現亂碼。

範例:讀取日文 CSV 檔

import csv  
  
with open("example.csv", "r", encoding="utf-8-sig") as file:  
    reader = csv.reader(file)  
    for row in reader:  
        print(row)

寫入 CSV 檔案

寫入 CSV 檔案時也需要指定正確的編碼方式。

範例:寫入日文 CSV 檔

import csv  
  
data = [["名前", "年齢", "住所"], ["佐藤", "30", "東京"], ["鈴木", "25", "大阪"]]  
  
with open("example.csv", "w", encoding="utf-8-sig", newline="") as file:  
    writer = csv.writer(file)  
    writer.writerows(data)

處理 JSON 檔案

JSON(JavaScript Object Notation)是輕量且常用的資料交換格式。Python 可透過 json 模組處理 JSON 資料。

讀取 JSON 檔案

讀取包含日文的 JSON 檔案時,記得設定編碼為 UTF-8。

範例:讀取日文 JSON 檔

import json  
  
with open("example.json", "r", encoding="utf-8") as file:  
    data = json.load(file)  
    print(data)

寫入 JSON 檔案

寫入 JSON 時,設定 ensure_ascii=False 可保留原始日文內容,而非轉換成 Unicode 轉義字元。

範例:寫入日文 JSON 檔

import json  
  
data = {"名前": "佐藤", "年齢": 30, "住所": "東京"}  
  
with open("example.json", "w", encoding="utf-8") as file:  
    json.dump(data, file, ensure_ascii=False, indent=4)

與資料庫連接

在資料庫中儲存日文資料時,正確設定字元編碼是關鍵。大多數資料庫(如 MySQL、PostgreSQL)皆支援 UTF-8,可正確儲存與讀取日文。

使用 SQLite 儲存與讀取日文資料

import sqlite3  
  
## 連接資料庫  
conn = sqlite3.connect("example.db")  
cursor = conn.cursor()  
  
## 建立資料表  
cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)")  
conn.commit()  
  
## 插入日文資料  
cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ("佐藤", 30))  
conn.commit()  
  
## 讀取資料  
cursor.execute("SELECT * FROM users")  
rows = cursor.fetchall()  
for row in rows:  
    print(row)  
  
conn.close()

注意事項與最佳實踐

統一編碼設定

將所有資料統一使用 UTF-8 編碼,可大幅降低亂碼風險。

加入錯誤處理

在資料讀寫過程中可能會出現錯誤,建議加入錯誤處理機制以提升安全性。

範例:加上錯誤處理

try:  
    with open("example.txt", "r", encoding="utf-8") as file:  
        content = file.read()  
except FileNotFoundError as e:  
    print(f"找不到檔案: {e}")

依資料格式選擇適當工具

根據資料應用情境選擇適合的模組或函式庫(例如:pandas 適合用於資料分析)。

小結

只要掌握正確的編碼知識與合適的工具,就能輕鬆進行日文資料的輸入與輸出。透過本章介紹的方法,您可以有效處理日文資料,提升專案的效率與品質。


6. 處理日文時的注意事項與最佳實踐

使用 Python 處理日文資料時,了解語言特有的問題與挑戰非常重要。本章將說明如何因應日文的特殊性,同時提供提升開發效率的最佳實踐。

處理日文時的注意事項

亂碼的原因與預防方法

亂碼通常是由於資料編碼與程式設定不一致所導致。在處理日文時,請特別注意以下幾點。

常見原因
  • 檔案的實際編碼與程式讀取時的設定不一致
  • 與外部系統(如資料庫、API)進行資料交換時,使用了不同的編碼
預防對策
  1. 全面使用 UTF-8 編碼
    UTF-8 是支援多語言的標準編碼,建議所有檔案與系統設定統一使用 UTF-8。
  2. 明確指定編碼
    在讀寫檔案或與外部系統通信時,務必設定正確的編碼參數。

範例:指定編碼讀取檔案

with open("example.txt", "r", encoding="utf-8") as file:  
    content = file.read()

日文文字的特殊處理

統一全形與半形字元

日文資料常會混用全形與半形字元,統一格式可以提高處理效率與準確性。

範例:將全形轉為半形

import unicodedata  
  
text = "Python 2024"  
normalized = unicodedata.normalize("NFKC", text)  
print(normalized)  ## Python 2024
日文文字分類

日文包含平假名、片假名與漢字等不同字種,可使用正規表達式篩選特定類型。

範例:只提取漢字

import re  
  
text = "今日は2024年12月15日です。"  
kanji = re.findall(r"[一-龥]", text)  
print(kanji)  ## ['今', '日', '年', '月', '日']

與外部資料的整合

在與 API、資料庫等外部系統整合時,也需注意編碼與資料格式的對應。

設定資料庫的字元編碼

雖然多數資料庫支援 UTF-8,但若未正確設定,仍可能發生亂碼問題。

範例:MySQL 中設定 UTF-8

CREATE DATABASE example_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

處理日文的最佳實踐

提升程式碼可讀性

當程式中包含日文資料時,應確保程式碼結構清晰、易於維護。

  • 適當撰寫註解與文件,說明程式的邏輯
  • 函式名稱與變數名稱建議使用英文

活用日文對應函式庫

使用專門的日文處理函式庫(如形態素解析、NLP 工具)能顯著提升開發效率。

範例:使用 Janome 進行形態素分析

from janome.tokenizer import Tokenizer  
  
text = "今日は天気が良いです。"  
tokenizer = Tokenizer()  
for token in tokenizer.tokenize(text):  
    print(token.surface, token.part_of_speech)

使用單元測試驗證日文處理

在處理日文時,建議設置單元測試,確認編碼與邏輯正確性。

範例:使用 pytest 驗證日文編碼

def test_japanese_encoding():  
    text = "こんにちは"  
    encoded = text.encode("utf-8")  
    assert encoded.decode("utf-8") == text

加強錯誤處理

日文處理中常會遇到檔案編碼錯誤或格式錯誤,應加入例外處理以提高穩定性。

範例:加入錯誤處理

try:  
    with open("example.txt", "r", encoding="utf-8") as file:  
        content = file.read()  
except UnicodeDecodeError as e:  
    print(f"文字編碼錯誤: {e}")

小結

掌握 Python 處理日文資料時的注意事項與最佳實踐,能有效避免錯誤並提升開發效率。特別是編碼統一、選用合適函式庫與錯誤處理,都是成功處理日文的關鍵。


年収訴求

7. 總結與下一步行動

本文從基礎到進階,全面說明了如何使用 Python 處理日文資料。以下是各章節的重要重點整理:

本文重點回顧

  1. 前言
  • 介紹了 Python 出色的多語言支援能力,讓日文處理變得簡單有效。
  1. Python 中的日文字元編碼基礎
  • 說明了字元編碼的重要性,推薦使用 UTF-8,並解釋了編碼設定方法。
  1. 使用 Python 處理日文的方法
  • 介紹了日文字串的基本操作、正規表達式應用與常見問題的解決方法。
  1. 日文處理函式庫介紹與使用方法
  • 介紹了 MeCab、Janome、SudachiPy 等常用函式庫與實際操作方式。
  1. 日文資料的輸入與輸出
  • 學習了處理文字檔、CSV、JSON 等常見格式的操作技巧。
  1. 處理日文時的注意事項與最佳實踐
  • 介紹了防止亂碼的方法、日文特殊問題的應對,以及實用的開發建議。

Python 處理日文的優勢

Python 提供了豐富的文字處理功能與函式庫,是處理日文資料的理想工具,具有以下優勢:

  • 優秀的多語言支援能力:內建支援 Unicode,可大幅減少亂碼風險。
  • 豐富的函式庫:如 MeCab、Janome、SudachiPy 等,能對應各種日文處理需求。
  • 語法簡潔、易讀:能用簡單的程式碼完成強大的處理功能。

建議的下一步行動

開始實作小型專案

  • 嘗試使用日文資料製作小型應用程式或進行資料分析。
  • 範例:進行日文詞頻分析、使用形態素分析進行文本分類。

延伸學習函式庫的應用

  • 深入了解本文提到的各個函式庫,探索更多應用場景。
  • 範例:使用 MeCab 開發日文聊天機器人。

挑戰處理多語言資料

  • Python 不僅能處理日文,也支援其他語言,可嘗試開發多語言應用。

擴展 Python 技能

  • 除了日文處理,也可以學習 Python 的其他應用領域,如資料分析、網頁開發、機器學習等。

培養問題解決能力

  • 實際處理編碼錯誤與文字亂碼問題,有助於累積實務經驗與應變能力。

進一步學習資源推薦

結語

只要掌握基本知識與技巧,使用 Python 處理日文並不困難。希望本文能作為您的參考指南,幫助您在實務專案中有效應用這些技術。Python 的日文處理世界充滿可能,等著您來探索!