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

目次

1. 介紹

Python 是眾多程式語言中特別受歡迎的一種,以簡單且易學的語法聞名。它廣泛應用於資料分析、人工智慧、Web 開發等領域,在日文文字處理方面也是一個非常強大的工具。然而,會遇到日文特有的挑戰(例如:字元編碼的差異或漢字的複雜性),如果沒有正確的知識,問題解決可能會很困難。

本文將說明如何使用 Python 有效處理日文的方法,以易懂的方式向初學者解說。閱讀本文後,能解答下列疑問。

閱讀本文可了解的事項

  • 使用 Python 處理日文時的基本設定方法
  • 日文文字處理中常見的問題及其解決方案
  • 使用 Python 函式庫處理日文的實用方法
  • 在實際應用案例中活用日文的方法

熟練使用 Python 後,就能輕鬆處理包含日文的資料,從而擴大資料解析或應用程式開發的範圍。

為什麼使用 Python 處理日文?

Python 是擅長多語言支援的程式語言之一,特別是預設支援 UTF-8,因此處理日文等多位元組字元相當容易。此外,還提供豐富的專門針對日文的函式庫和框架。因此,從初學者到上級使用者,都廣受支持。

例如,日文的自然語言處理(NLP)、形態素解析、資料庫管理、日文對應的 Web 應用程式建置等,在許多實用情境中,Python 都是不可或缺的存在。

本文的目的

本文的目的,是提供使用 Python 處理日文時所需的基礎知識,以及實務技巧。具備 Python 中日文處理的知識,就能提升程式的效率,並在實務中派上用場。

在下一節中,首先詳細說明處理日文時不可或缺的「字元編碼」基本知識。

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

在 Python 中處理日文時,首先應理解的概念是「字符編碼」。字符編碼是用來在電腦上處理文字的規格,如果沒有正確理解它,在包含日文的資料處理中可能會發生問題。本節將說明字符編碼的基礎以及在 Python 中的處理方式。

什麼是字符編碼?

字符編碼是用來將文字轉換為位元組(數位資料)的規格。字符編碼有各種各樣的種類,但代表性的如下。

  • UTF-8:國際標準規格。在許多環境中使用,在 Python 中也推薦作為預設字符編碼。
  • Shift_JIS:日本國內廣泛使用的規格。在舊系統或部分資料中可見。
  • EUC-JP:日文環境中一度使用的字符編碼。
  • ISO-2022-JP:主要用於電子郵件的字符編碼。

這些字符編碼各自以不同的方式將文字轉換為位元組,因此如果以不同的字符編碼處理資料,可能會發生文字亂碼。

Python 中的字符編碼處理

在 Python 中,字串內部以「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 型)之間進行編碼或解碼。

編碼(字串 → 位元組列):

text = "你好"
encoded_text = text.encode("utf-8")
print(encoded_text)  ## b'こんにちだ̄'

解碼(位元組列 → 字串):

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 = "Sato-san"
message = greeting + "、" + name
print(message)  ## 你好、Sato-san

範例:日語字串的重複

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

取得日語字串的長度

使用len()函式,即可取得字串的長度(字數)。

text = "你好"
print(len(text))  ## 2

不過,字數與位元組數可能不同,因此需注意。若要取得位元組數,可利用以下方式進行編碼。

範例:取得位元組數

text = "你好"
byte_length = len(text.encode("utf-8"))
print(byte_length)  ## 6

日語字串的擷取

Python 的字串可使用擷取來取得部分內容。

範例:取得部分字串

text = "你好、Python"
substring = text[0:5]  ## 取得最前面的5個字元
print(substring)  ## 你好、P

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

日語字串的搜尋

可使用正規表達式來搜尋特定模式。

範例:日語字串的搜尋

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 = "  こんにちは  
"
cleaned_text = text.strip()
print(cleaned_text)  ## こんにちは

日語的字元分類

日語混有平假名、片假名與漢字等字元類型。可利用正規表達式來判別各類字元。

範例:僅抽出漢字

import re

text = "今日は2024年12月15日です。"
kanji = re.findall(r"[u4E00-u9FFF]", text) # 基本のCJK統合漢字
print(kanji)  ## ['今', '日', '年', '月', '日']

總結

本節說明了使用 Python 操作日語字串的基本方法、正規表達式的活用方式,以及日語特有挑戰的因應方法。運用這些知識,即可有效率地處理日語文字。

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

Python 有許多用來有效率處理日文文字的函式庫。本節將介紹幾個代表性的支援日文的函式庫,並說明它們的基本使用方法。

代表性的支援日文函式庫

MeCab

MeCab 是一個強大的工具,用來進行形態素解析。形態素解析是指將文章分割成單字,並抽出其品詞等資訊的處理。在日文的自然語言處理中經常被使用。

安裝方法

MeCab 透過使用 Python 綁定 mecab-python3 即可從 Python 使用。

pip install mecab-python3
基本使用方法

以下是對日文文字進行形態素解析的範例。

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 有各種用來強化日文文字處理的函式庫。理解各自的特點,並選擇最適合專案的函式庫,即可有效率地處理日文文字。

5. 日文資料的輸入輸出

使用 Python 處理日文資料時,檔案的讀寫以及資料格式(例如:CSV 或 JSON)的正確處理非常重要。本節將從日文資料輸入輸出的基本原理開始,詳細說明常用格式的操作方法。

檔案的讀取與寫入

文字檔案的讀取

讀取包含日文的文字檔案時,務必指定編碼。特別是指定 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 = [["姓名", "年齡", "地址"], ["Satō", "30", "Tōkyō"], ["Suzuki", "25", "Ōsaka"]]

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 資料時,指定編碼即可防止文字亂碼。

範例:JSON 檔案的讀取

import json

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

向 JSON 檔案的寫入

將 Python 的字典型資料以 JSON 格式儲存時,指定 ensure_ascii=False 即可直接儲存日文。

範例:向 JSON 檔案的寫入

import json

data = {"姓名": "Satō", "年齡": 30, "地址": "Tōkyō"}

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 (?, ?)", ("Satō", 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 進行資料分析)。

總結

使用 Python 進行日文資料的輸入輸出,透過基本的編碼知識與適當的程式庫,即可輕鬆實現。本節介紹的方法,可幫助您有效率地處理日文資料,並提升專案生產力。

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

在 Python 中處理日文時,了解語言特有的挑戰與注意事項非常重要。本節將說明處理日文特有問題的方法,以及提升工作效率的最佳實務。

處理日文時的注意事項

文字亂碼的原因與預防措施

文字亂碼是在使用不同編碼處理資料時發生的。在 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"[u4E00-u9FFF]", text)
print(kanji)  ## ['今', '日', '年', '月', '日']

與外部資料的聯動

在與外部系統(例如:API、資料庫)互動時,需要注意編碼設定與格式。

資料庫的文字編碼設定

許多資料庫預設支援 UTF-8,但若文字編碼設定不同,可能會發生錯誤。

範例:MySQL 中的 UTF-8 設定

CREATE DATABASE example_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

處理日文的最佳實務

提升程式碼的可讀性

處理日文的程式碼,設計時需考慮其他開發者易讀性。

  • 利用註解或文件來明確程式碼的意圖。
  • 函式或變數名稱使用英文記述。

活用支援日文的函式庫

對於形態素解析或自然語言處理等日文特有任務,活用專用函式庫可提升效率。

範例:使用 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 等適合日語特有處理的函式庫的使用方法。
  1. 日語資料的輸入輸出
  • 學習了文字、CSV、JSON 等格式的資料讀寫方法。
  1. 處理日語時的注意事項與最佳實務
  • 說明了防止文字亂碼的對策、日語特有問題的處理方法,以及高效作業的最佳實務。

Python 在日語處理中的便利性

Python 提供了豐富的函式庫,用於字串操作、資料處理及自然語言處理,在處理日語時也非常便利。特別在以下方面展現強項。

  • 多語言支援的彈性: 標準支援 Unicode,降低文字亂碼的風險。
  • 豐富的函式庫: MeCab、Janome、SudachiPy 等,能應對日語特有的課題。
  • 簡潔的程式碼結構: 以簡潔易讀的程式碼實現日語處理。

下一步

活用本文,提升 Python 在日語處理方面的應用技能,請嘗試以下下一步。

開始實踐專案

  • 挑戰使用日語資料的簡單應用程式或分析專案吧。
  • 範例: 日語文字的頻率分析、透過形態素解析進行文章分類。

函式庫的應用

  • 深入探討本文介紹的函式庫,並試著在各種情境中使用。
  • 範例: 使用 MeCab 建構日語聊天機器人。

挑戰日語以外的多語言處理

  • 使用 Python 也能應對其他語言。請嘗試開發多語言相容的應用程式。

進一步推進 Python 的學習

  • 不限於日語處理,學習 Python 的其他領域(資料分析、Web 開發、機器學習等),能擴展技能的廣度。

磨練疑難排解能力

  • 透過解決實際發生的編碼錯誤或文字亂碼問題,能習得實踐技能。

進一步學習的資源

最後

Python 中的日語處理,透過少許知識與巧思,就能簡單且高效地進行。參考本文介紹的內容,請務必在實際專案中活用。Python 用於日語處理的世界廣大,充滿許多可能性。

 

侍エンジニア塾