お疲れ様です。
形態素解析器のSudachiPyのユーザ辞書の設定をしたので手順をメモしておきます。
普段からuv環境でPythonを使用しているので、uv環境で作成することを意識した形で手順を記載しようと思います。
(基本的には通常のPython環境と大差はありませんが。)
SudachiPyはインストールされた前提で話を進めます。
インストールしていない場合は下記でインストールしてください。
SudachiDictは3種類(small、core、full)のうちいずれかでOKです。
uv add sudachipy sudachidict-core
ユーザ辞書の設定
実際にユーザ辞書作成の手順を記載します。流れとしては下記の1~3になります。
- 登録する単語の情報を作成する
- ユーザ辞書をビルドする
- 作成したユーザ辞書を登録する
今回使用するプログラムのソースは下記のGitHubのリポジトリに残しておきますので、併せてご参考ください。
github.com
1. 登録する単語の情報を作成する
登録したい単語の情報を特定の形式のcsvにまとめる必要があります。
専用のプログラムを書いて一括で実行するのが良いと思います。
実際にプログラムで作成したcsvは以下のようになります。
エレファントカシマシの楽曲名をいくつか使用しています。

登録に必要な情報は以下の通りです。csvでは左から順に並んでいます。
注意点としてはcsvファイルの文字コードがutf-8でなければいけません。
Windows環境の場合、デフォルトがcp932なので出力時に必ず指定するようにしてください。
- 見出し (TRIE 用)
- 左連接ID
- 右連接ID
- コスト
- 見出し (解析結果表示用)
- 品詞1
- 品詞2
- 品詞3
- 品詞4
- 品詞 (活用型)
- 品詞 (活用形)
- 読み
- 正規化表記
- 辞書形ID
- 分割タイプ
- A単位分割情報
- B単位分割情報
- ※未使用
0、4、12(見出し、正規化表記)に登録したい単語が入ります。
1(左連接ID)と2(右連接ID)は単語の前後にどのような品詞・単語が接続できるかを判定するためのIDです。いきなり調整することは難しいので固定値でも良いと思います。
3(コスト)は値が小さいほど辞書の中で優先で選択されるようになります。例えば、"風"という単語をコスト1でユーザ辞書に追加した場合、システム辞書にも同様に"風"という単語が存在します。形態素解析の際に"風"という単語が登場するとコストの小さいユーザ辞書側の情報が優先で取得されるようになります。
11(読み)は登録する単語の読み仮名を全角カタカナで記載します。登録する単語数が多い場合、1つ1つ手入力するのは大変なので私はLLM(Gemini)に読みを作成させています。
また、今回は楽曲名を辞書に追加するということで、7(品詞3)に"曲名"と設定しています。この部分は基本的にどんな文字列が入っても問題ないようです。なので、識別しやすい文字列で登録することでユーザ登録した単語を抽出するという使い方も可能になります。
ソースコード全体は下記に載せておきます(長いので折り畳み)。
import json
import os
import re
from dotenv import load_dotenv
from google import genai
load_dotenv()
PROMPT = """
あなたは日本語の楽曲タイトルの読み仮名推定を行うアシスタントです。
次の楽曲タイトルの読みを、全角カタカナで1つだけ返してください。
ルール:
- 返答は全角カタカナのみとする
- 日本語・カタカナ・英字・記号が混ざっていても、最も自然な読みを推定する
- 促音・長音・語尾の変化は自然な日本語として扱う
- 返答は JSON 形式のみとし、キーは "reading" にする
- 読みが曖昧な場合でも、最も自然な仮名表記を返す
- 余計な説明やコードブロックは付けない
- ひらがなや英字は使わず、必ず全角カタカナに変換する
例:
- "星の砂" -> {{"reading":"ホシノスナ"}}
- "さよならパーティー" -> {{"reading":"サヨナラパーティー"}}
- "DEAD OR ALIVE" -> {{"reading":"デッドオアアライブ"}}
- "ハロー New York!" -> {{"reading":"ハローニューヨーク"}}
タイトル: {keyword}
"""
def main() -> None:
client = genai.Client(api_key=os.getenv("GOOGLE_API_KEY"))
keywords = []
examples = [
"今宵の月のように",
"風",
"悪魔メフィスト",
"漂う人の性",
"FLYER",
"Hello. I love you",
"ヒトコイシクテ、アイヲモトメテ",
]
for title in examples:
response = client.models.generate_content(
model="gemini-3.5-flash-lite", contents=PROMPT.format(keyword=title)
)
reading = title
try:
result = json.loads(response.text.strip())
if isinstance(result, dict) and "reading" in result and result["reading"]:
reading = result["reading"]
except Exception:
text = response.text.strip()
match = re.search(r'"reading"\s*:\s*"([^"]+)"', text)
if match:
reading = match.group(1)
elif text:
reading = text.strip().strip("\"'`")
print(f"{title} -> {reading}")
keyword_info = []
keyword_info.append(title)
keyword_info.append("4786")
keyword_info.append("4786")
keyword_info.append("1")
keyword_info.append(title)
keyword_info.append("名詞")
keyword_info.append("固有名詞")
keyword_info.append("曲名")
keyword_info.append("*")
keyword_info.append("*")
keyword_info.append("*")
keyword_info.append(reading)
keyword_info.append(title)
keyword_info.append("*")
keyword_info.append("*")
keyword_info.append("*")
keyword_info.append("*")
keyword_info.append("*")
keywords.append(keyword_info)
with open("./keywords.csv", mode="w", encoding="utf-8") as f:
for keyword in keywords:
f.write(",".join(keyword) + "\n")
if __name__ == "__main__":
main()
2. ユーザ辞書をビルドする
csvが作成できたら次はユーザ辞書をビルドします。
uv環境なのでuv runで実行したパターンで記載します。
-sの後にインストール済みのSudachiPyのシステム辞書のパスを指定します。
これもuv環境なので、プロジェクトフォルダ内の「.venv」フォルダからSudachiPyのフォルダを探し、その中から「system.dic」を探してください。
「system.dic」のパスの後に1で作成したcsvファイルのパスを指定します。
uv run sudachipy ubuild -s .venv\Lib\site-packages\sudachidict_core\resources\system.dic .\keywords.csv

ビルドに成功するとこのような表示が出ます。
実行したときのカレントディレクトリに「user.dic」というファイルが作成されていることを確認してください。
これがビルドしたユーザ辞書になります。

3. 作成したユーザ辞書を登録する
最後に作成したユーザ辞書をSudachiPyで使えるように登録します。
SudachiPyの設定ファイル「sudachi.json」がライブラリ内のフォルダにあるので探してください。
それを複製してカレントディレクトリに配置して編集するか、ファイルをそのまま編集するかどちらでもOKです。
個人的には複製して別ファイルで管理した方がユーザ辞書の設定なしの状態とで使い分けられるのでおすすめです。

「sudachi.json」に下記の内容を追記してください。
リスト内には作成した「user.dic」のパスを記載します。今回はカレントディレクトリに設置しているのでこの書き方です。
"userDict": ["user.dic"]
これで設定を追加できましたが、複製した「sudachi.json」を使用する場合はPythonプログラムでの読み込み時に引数config_pathで設定ファイルのパスを指定する必要があるのでご注意ください。
これを設定しない場合はライブラリのフォルダ内のデフォルトの「sudachi.json」が読み込まれるので、ユーザ辞書を使用しない場合はconfig_pathの指定なしとすることで使い分けができます。
dictionary = sudachipy.Dictionary(config_path="sudachi.json")
動作確認
実際に動作確認してみます。
比較のため、ユーザ辞書の設定をする前と後の両方の出力を示します。
入力する文章は以下で"今宵の月のように"と"風"の部分が今回ユーザ辞書で追加した単語になります。
今宵の月のようにと風という曲が好きです。
設定前後を比較すると、設定後の方で"今宵の月のように"が1つの単語として取得できていることがわかります。
また、"風"はシステム辞書にもある単語なので設定前は普通名詞として取得されていますが、設定後はユーザ辞書に登録した曲名としての"風"が取得できています。


参考サイト
ユーザ辞書の作成や設定方法について参考にしたサイトが以下になります。
Sudachiの詳細については下記の記事が網羅的に書かれておりわかりやすかったです。