0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[網羅的にわかる]pykakasiってなんだ?

0
Posted at

日本語テキストをローマ字に変換したいんだけど、どうすりゃいいの?

そんな疑問を持つあなた。答えはここにある。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形式の文字を処理できます。

出典: https://pypi.org/project/pykakasi/

名前の由来も面白い。「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は自己完結型で、独自のセグメンテーションと辞書を使用します。

出典: https://github.com/polm/cutlet

項目 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)は、ひらがな・カタカナ・半角・全角文字の相互変換器です。

出典: https://pypi.org/project/jaconv/

注意: 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(かな・半角全角変換特化)があることも覚えておこう。

目的に合ったツールを選んで、日本語処理を楽しんでほしい。


公式リファレンス


関連記事


この記事が役に立ったら、ぜひフォローやスキをお願いします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?