日本語テキストをローマ字に変換したいんだけど、どうすりゃいいの?
そんな疑問を持つあなた。答えはここにある。pykakasiだ。
本記事では、Pythonライブラリ「pykakasi」について、できること・できないこと・用途・代替ライブラリまで、徹底的に解説する。これを読めば、pykakasiの全体像がスッと頭に入るはずだ。
TL;DR(忙しい人向け)
- pykakasi: 日本語(漢字・ひらがな・カタカナ)→ローマ字変換のPythonライブラリ
- 得意なこと: シンプルな読み仮名変換、分かち書き、ふりがな生成
- 苦手なこと: 文脈に応じた高精度な読み推定、外来語の原語スペル変換
- 代替候補: cutlet(MeCab連携で高精度)、jaconv(かな同士の変換特化)
- ライセンス: GPL-3.0(商用利用時は注意)
そもそもpykakasiって何者?
pykakasiは、日本語テキストをローマ字(ラテン文字)に変換するためのPython NLP(自然言語処理)ライブラリだ。
公式の説明を見てみよう。
公式(PyPI)より引用:
"pykakasi is a Python Natural Language Processing (NLP) library to transliterate hiragana, katakana and kanji (Japanese text) into rōmaji (Latin/Roman alphabet). It can handle characters in NFC form."【和訳】pykakasiは、ひらがな・カタカナ・漢字(日本語テキスト)をローマ字(ラテン/ローマアルファベット)にトランスリタレート(翻字)するPython自然言語処理ライブラリです。NFC形式の文字を処理できます。
名前の由来も面白い。「KAKASI」は「KAnji KAna Simple Inverter(漢字かな単純変換器)」の略で、東北大学の佐藤雅彦氏が開発したSKK(Simple Kana Kanji Converter)の逆変換器として生まれた。CASEじゃなくてKASIなのは、日本語の「かかし」を掛けてるわけだ。なかなか洒落てる。
基本情報まとめ
| 項目 | 内容 |
|---|---|
| ライブラリ名 | pykakasi |
| 最新バージョン | 2.3.0(2024年6月時点) |
| 対応Python | 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, PyPy3 |
| ライセンス | GPL-3.0 |
| 公式リポジトリ | https://codeberg.org/miurahr/pykakasi |
| PyPI | https://pypi.org/project/pykakasi/ |
| ドキュメント | https://pykakasi.readthedocs.io/ |
注意点として、開発元はGitHubからCodebergに移行している。GitHubのリポジトリは2022年7月にアーカイブ済みだ。
インストール方法
pipでインストール(推奨)
pip install pykakasi
condaでインストール
conda install -c conda-forge pykakasi
どちらも一発で入る。依存関係の心配は不要だ。
pykakasiでできること
1. 漢字・ひらがな・カタカナ → ローマ字変換
これがメインの機能。使い方はシンプルだ。
import pykakasi
kks = pykakasi.kakasi()
text = "かな漢字"
result = kks.convert(text)
for item in result:
print(f"{item['orig']}: ひらがな '{item['hira']}', カタカナ '{item['kana']}', ローマ字: '{item['hepburn']}'")
出力:
かな: ひらがな 'かな', カタカナ 'カナ', ローマ字: 'kana'
漢字: ひらがな 'かんじ', カタカナ 'カンジ', ローマ字: 'kanji'
convert()メソッドが返すのは辞書のリスト。各辞書には以下のキーが含まれる:
| キー | 内容 |
|---|---|
orig |
元のテキスト |
hira |
ひらがな変換結果 |
kana |
カタカナ変換結果 |
hepburn |
ヘボン式ローマ字 |
kunrei |
訓令式ローマ字 |
passport |
パスポート式ローマ字 |
2. ふりがな風の出力
漢字の上にルビを振りたい?そんなときも対応できる。
import pykakasi
kks = pykakasi.kakasi()
text = "かな漢字交じり文"
result = kks.convert(text)
for item in result:
print(f"{item['orig']}[{item['hepburn'].capitalize()}] ", end='')
print()
出力:
かな[Kana] 漢字[Kanji] 交じり[Majiri] 文[Bun]
3. 複数のローマ字変換方式に対応
日本語のローマ字表記には複数の流派がある。pykakasiは主要なものをサポートしている。
| 方式 | 特徴 | 例(ふじさん) |
|---|---|---|
| ヘボン式(hepburn) | 最も一般的、パスポートや駅名表記に使用 | fujisan |
| 訓令式(kunrei) | 日本の学校教育で教える方式 | huzisan |
| 日本式(nihon) | 五十音表に忠実な方式 | huzisan |
| パスポート式(passport) | パスポート用の特殊ルール | fujisan |
import pykakasi
kks = pykakasi.kakasi()
text = "富士山"
result = kks.convert(text)
for item in result:
print(f"ヘボン式: {item['hepburn']}")
print(f"訓令式: {item['kunrei']}")
print(f"パスポート式: {item['passport']}")
4. 分かち書き(wakati)
テキストを単語単位で分割する機能もある。
import pykakasi
# 旧APIでの分かち書き
wakati = pykakasi.wakati()
conv = wakati.getConverter()
text = "かな漢字交じり文"
result = conv.do(text)
print(result)
出力:
かな 漢字 交じり 文
5. 旧API(v1.x系)も使える
v2.0.0以降は新しいconvert()メソッドが推奨されているが、旧APIも後方互換性のために残っている。
import pykakasi
text = "かな漢字交じり文"
kakasi = pykakasi.kakasi()
kakasi.setMode("H", "a") # ひらがな→ASCII
kakasi.setMode("K", "a") # カタカナ→ASCII
kakasi.setMode("J", "a") # 漢字→ASCII
kakasi.setMode("r", "Hepburn") # ヘボン式を使用
kakasi.setMode("s", True) # スペースを挿入
kakasi.setMode("C", True) # 先頭大文字化
conv = kakasi.getConverter()
result = conv.do(text)
print(result)
出力:
kana Kanji Majiri Bun
ただし、旧APIはv3.0でdeprecated(非推奨)になる予定なので、新規開発ではconvert()メソッドを使おう。
pykakasiでできないこと
万能に見えるpykakasiだけど、苦手なこともある。正直に書いておこう。
1. 文脈に応じた高精度な読み推定
pykakasiは独自の辞書を使って変換を行う。形態素解析器(MeCabなど)との連携機能はない。そのため、文脈によって読み方が変わる漢字の処理が弱い。
たとえば「今日」は「きょう」とも「こんにち」とも読める。pykakasiは辞書に登録された読みを返すだけで、前後の文脈から最適な読みを推測することはしない。
2. 外来語の原語スペルへの変換
「カツカレー」を「Cutlet curry」のように、外来語を元の言語のスペルで出力する機能はない。pykakasiは純粋に音を変換するので、「カツカレー」は「katsukaree」になる。
3. 高度な形態素解析
pykakasiは形態素解析器ではない。品詞の判定、係り受け解析、固有表現抽出といった高度なNLP処理は守備範囲外だ。
4. 人名・地名の読み仮名推定の精度
人名や地名は読み方のバリエーションが多い。「田中」は「たなか」だけど、「田島」は「たじま」か「たしま」か。こういった曖昧さを解決する能力は限定的だ。
5. リアルタイム性が求められる大量処理
速度面では、MeCab + cutletの組み合わせの方が高速な場合がある。大量のテキストを処理する場合は、ベンチマークを取ってから採用を決めよう。
実際の用途・ユースケース
じゃあ、pykakasiは何に使えるのか?実用的なユースケースを挙げてみる。
1. URL用スラグ(slug)の生成
日本語タイトルの記事をURLフレンドリーな形式に変換したいとき。
import pykakasi
import re
def generate_slug(japanese_text):
kks = pykakasi.kakasi()
result = kks.convert(japanese_text)
romaji = ''.join([item['hepburn'] for item in result])
# 英数字とハイフン以外を除去し、小文字化
slug = re.sub(r'[^a-zA-Z0-9]+', '-', romaji).lower().strip('-')
return slug
print(generate_slug("今日の天気は晴れです"))
# 出力: kyou-no-tenki-ha-hare-desu
2. 検索システムの索引作成
ユーザーがローマ字入力で日本語コンテンツを検索できるようにする。
import pykakasi
def create_search_index(texts):
kks = pykakasi.kakasi()
index = {}
for text in texts:
result = kks.convert(text)
romaji = ''.join([item['hepburn'] for item in result]).lower()
index[romaji] = text
return index
documents = ["東京タワー", "大阪城", "京都御所"]
search_index = create_search_index(documents)
print(search_index)
# 出力: {'toukyoutawaa': '東京タワー', 'oosakajou': '大阪城', ...}
3. 音声合成(TTS)の前処理
音声合成エンジンに渡す前に、漢字を読み仮名に変換する。
import pykakasi
def to_hiragana(text):
kks = pykakasi.kakasi()
result = kks.convert(text)
return ''.join([item['hira'] for item in result])
print(to_hiragana("本日は晴天なり"))
# 出力: ほんじつはせいてんなり
4. ふりがな自動付与システム
子供向けコンテンツや外国人向け日本語教材での活用。
5. データクレンジング
日本語データの正規化処理の一環として。
代替ライブラリとの比較
pykakasi以外にも選択肢はある。目的に応じて使い分けよう。
cutlet(推奨度: 高)
公式(GitHub)より引用:
"Cutlet is a Japanese to romaji converter."
"pykakasi: self contained, it does segmentation on its own and uses its own dictionary."【和訳】Cutletは日本語からローマ字への変換ツールです。pykakasiは自己完結型で、独自のセグメンテーションと辞書を使用します。
| 項目 | pykakasi | cutlet |
|---|---|---|
| 形態素解析 | 独自辞書 | MeCab/fugashi連携 |
| 精度 | 中 | 高 |
| 外来語処理 | 音をそのまま変換 | 原語スペル対応可能 |
| 依存関係 | 少ない | MeCab辞書が必要 |
| 速度 | 中 | 高 |
cutletの使用例:
import cutlet
katsu = cutlet.Cutlet()
print(katsu.romaji("カツカレーは美味しい"))
# 出力: 'Cutlet curry wa oishii'
# 外来語スペル機能をオフにする場合
katsu.use_foreign_spelling = False
print(katsu.romaji("カツカレーは美味しい"))
# 出力: 'Katsu karee wa oishii'
jaconv(用途が異なる)
公式(PyPI)より引用:
"jaconv (Japanese Converter) is interconverter for Hiragana, Katakana, Hankaku (half-width character) and Zenkaku (full-width character)"【和訳】jaconv(Japanese Converter)は、ひらがな・カタカナ・半角・全角文字の相互変換器です。
注意: jaconvはローマ字変換機能を持っていない。ひらがな⇔カタカナ、半角⇔全角の変換に特化している。
import jaconv
# ひらがな→カタカナ
print(jaconv.hira2kata('ともえまみ'))
# 出力: 'トモエマミ'
# カタカナ→ひらがな
print(jaconv.kata2hira('トモエマミ'))
# 出力: 'ともえまみ'
# 半角→全角
print(jaconv.h2z('ティロ・フィナーレ'))
# 出力: 'ティロ・フィナーレ'
使い分けガイド
| やりたいこと | 推奨ライブラリ |
|---|---|
| シンプルなローマ字変換 | pykakasi |
| 高精度なローマ字変換 | cutlet |
| 外来語を原語スペルで出力 | cutlet |
| ひらがな⇔カタカナ変換 | jaconv |
| 半角⇔全角変換 | jaconv |
| 依存関係を最小限にしたい | pykakasi |
| 商用利用(GPLを避けたい) | cutlet(MIT License) |
注意点・トラブルシューティング
1. ライセンスに注意(GPL-3.0)
pykakasiはGPL-3.0ライセンスだ。商用ソフトウェアに組み込む場合、ソースコードの公開義務が発生する可能性がある。ライセンス的に厳しい場合は、MIT LicenseのcutletやBSD Licenseのjaconvを検討しよう。
2. NFC形式の文字を使う
pykakasiはUnicodeのNFC(正規化形式C)で正規化された文字を前提としている。NFD形式の文字が混ざっていると、正しく変換できない場合がある。
import unicodedata
text = "がぎぐげご" # NFDの場合、濁点が分離している可能性
normalized = unicodedata.normalize('NFC', text)
3. 旧APIは将来削除される
setMode()やgetConverter()を使った旧APIは、v3.0で削除予定。新規開発ではconvert()メソッドを使おう。
4. メンテナンス状況
Snykの分析によると、pykakasiのメンテナンスは「Inactive」と評価されている。とはいえ、週間ダウンロード数は約17万回あり、依然として広く使われている。急に使えなくなる心配は少ないが、長期プロジェクトでは代替ライブラリも視野に入れておこう。
5. 読み間違いが発生するケース
GitHub Issueには、「思った」「言った」「行った」のような漢字+促音の組み合わせで誤変換が発生するケースが報告されていた(#114)。現在は修正済みだが、変換結果は必ず確認しよう。
まとめ
pykakasiは、日本語テキストをローマ字に変換するシンプルで使いやすいライブラリだ。
向いている用途:
- URL用スラグ生成
- 検索インデックス作成
- ふりがな付与
- 軽量な前処理
向いていない用途:
- 高精度な読み仮名推定が必要なケース
- 外来語を原語スペルで出力したいケース
- GPL-3.0を避けたい商用プロジェクト
代替ライブラリとしてcutlet(高精度、MeCab連携)やjaconv(かな・半角全角変換特化)があることも覚えておこう。
目的に合ったツールを選んで、日本語処理を楽しんでほしい。
公式リファレンス
- PyPI: https://pypi.org/project/pykakasi/
- ドキュメント: https://pykakasi.readthedocs.io/
- リポジトリ(Codeberg): https://codeberg.org/miurahr/pykakasi
- 元となったKAKASI: http://kakasi.namazu.org/
関連記事
この記事が役に立ったら、ぜひフォローやスキをお願いします。