SucachiPy による形態素解析

【概要】 日本語形態素解析ツール「SudachiPy」の体験を通じ、その技術と応用を学ぶ。SudachiPyは、多様な辞書と分割モードにより、日本語テキスト分析を実現する。プログラム実行で単語分割や品詞情報を確認でき、日本語処理の仕組みを理解できる。

目次

はじめに

ここでは、SudachiPyという日本語形態素解析技術を体験することを目的とする。

SudachiPyは、株式会社Works Applicationsが開発した日本語形態素解析器である。その技術は「Sudachi: A Japanese Tokenizer for Improving Text Analysis」という論文で発表されている。

新規性・特徴: SudachiPyは、一般的な形態素解析器が単一の辞書を使用するのに対し、従来の形態素解析器が抱えていた複合語の過剰分割や未登録語への対応の難しさを解決するため、複数の粒度(単語の分割の細かさ)の辞書を組み合わせることで、文脈に応じた柔軟な単語分割を可能にする。

特徴を活かせるアプリ例: ニュース記事の自動要約、チャットボットの応答精度向上、検索エンジンの関連性向上など、日本語のテキストデータを深く理解する必要があるアプリケーションでその特徴が活かされる。

体験価値: 本プログラムを実行することで、入力した日本語の文章がどのように単語に分割され、それぞれの単語がどのような品詞や原型を持つのかを直接確認できる。これにより、日本語の構造や形態素解析の仕組みに対する理解を深め、AIがどのように日本語を処理しているかを体験できる。

事前準備

Python, Windsurfをインストールしていない場合の手順(インストール済みの場合は実行不要)。

  1. 管理者権限でコマンドプロンプトを起動する(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)。
  2. 以下のコマンドをそれぞれ実行する(winget コマンドは1つずつ実行)。

REM Python をシステム領域にインストール
winget install --scope machine --id Python.Python.3.12 -e --silent
REM Windsurf をシステム領域にインストール
winget install --scope machine --id Codeium.Windsurf -e --silent
REM Python のパス設定
set "PYTHON_PATH=C:\Program Files\Python312"
set "PYTHON_SCRIPTS_PATH=C:\Program Files\Python312\Scripts"
echo "%PATH%" | find /i "%PYTHON_PATH%" >nul
if errorlevel 1 setx PATH "%PATH%;%PYTHON_PATH%" /M >nul
echo "%PATH%" | find /i "%PYTHON_SCRIPTS_PATH%" >nul
if errorlevel 1 setx PATH "%PATH%;%PYTHON_SCRIPTS_PATH%" /M >nul
REM Windsurf のパス設定
set "WINDSURF_PATH=C:\Program Files\Windsurf"
if exist "%WINDSURF_PATH%" (
    echo "%PATH%" | find /i "%WINDSURF_PATH%" >nul
    if errorlevel 1 setx PATH "%PATH%;%WINDSURF_PATH%" /M >nul
)

必要なライブラリのインストール

本プログラムはSudachiPyを使用する。SudachiPyがインストールされていない場合は、以下のコマンドを管理者権限のコマンドプロンプトで実行する。

コマンドプロンプトを管理者として実行(手順:Windowsキーまたはスタートメニュー > cmd と入力 > 右クリック > 「管理者として実行」)し、以下を実行する。


pip install sudachipy sudachidict-core

プログラムコード

本プログラムは、日本語の形態素解析を行うためにSudachiPyライブラリを使用している。SudachiPyは、日本語の文章を「形態素」と呼ばれる最小単位に分割し、それぞれの形態素の品詞や原型などの情報を取得するツールである。

本プログラムでは、SudachiPyのCモードを利用している。SudachiPyにはA, B, Cの3つの異なる分割モードがあり、利用者が用途に応じて適切な粒度でテキストを分析できる柔軟性を持つ。


# プログラム名: SudachiPy日本語形態素解析プログラム
# 特徴技術名: SudachiPy(日本語形態素解析器)
# 出典: Takaoka, K., Hisamoto, S., Kawahara, N., Sakamoto, M., Uchida, Y., & Matsumoto, Y. (2018). Sudachi: a Japanese Tokenizer for Business. Proceedings of the Eleventh International Conference on Language Resources and Evaluation (LREC 2018).
# 特徴機能: 多段階分割モード(A/B/Cモード)による柔軟な形態素解析。Cモードでは複合語を一つの単位として扱い、文脈に応じた適切な分割を実現
# 学習済みモデル: 該当なし(辞書ベースの形態素解析器)
# 方式設計:
#   - 関連利用技術: なし
#   - 入力と出力: 入力: テキスト(標準入力から複数行の日本語文章)、出力: 形態素解析結果(表層形、品詞、原形、正規化形)
#   - 処理手順: 1. SudachiPy辞書の初期化、2. Cモードでのトークナイザー設定、3. 入力文章の取得、4. 各文章の形態素解析、5. 解析結果の表示
#   - 前処理、後処理: 前処理: なし、後処理: なし
#   - 追加処理: なし
#   - 調整を必要とする設定値: 分割モード(現在はCモード固定)- A/B/Cモードの選択により解析粒度を調整可能
# 将来方策: 分割モードを実行時にユーザが選択できるメニュー機能の実装により、用途に応じた最適な解析粒度の選択を可能にする
# その他の重要事項: 辞書データのサイズが大きいため、初回起動時に時間がかかる場合がある
# 前準備: pip install sudachipy sudachidict-core

from sudachipy import tokenizer
from sudachipy import dictionary

# 設定値
DEFAULT_SPLIT_MODE = 'C'  # デフォルトの分割モード(A:最小単位, B:中間, C:最大単位)

print('SudachiPy日本語形態素解析プログラム')
print('概要: 入力された日本語文章を形態素解析し、単語ごとに詳細(表層形、品詞、原形、正規化形)を表示します')
print('操作: 解析したい文章を入力してください。複数行の入力が可能です。空行(Enterキーのみ)で入力を終了します')
print('=' * 40)

# SudachiPyの辞書とトークナイザーを初期化
tokenizer_obj = dictionary.Dictionary().create()

# 分割モード選択
print('分割モードを選択してください:')
print('A: 最小単位での分割(短単位)')
print('B: 中間的な分割')
print('C: 最大単位での分割(長単位)')
mode_choice = input('選択 (A/B/C) [デフォルト: C]: ').upper()
if mode_choice not in ['A', 'B', 'C']:
    mode_choice = DEFAULT_SPLIT_MODE

if mode_choice == 'A':
    split_mode = tokenizer.Tokenizer.SplitMode.A
elif mode_choice == 'B':
    split_mode = tokenizer.Tokenizer.SplitMode.B
else:
    split_mode = tokenizer.Tokenizer.SplitMode.C

print(f'\n選択された分割モード: {mode_choice}')
print('=' * 40)

print('解析対象の文章を入力してください(複数行可)')
print('入力終了は空行(Enterキーのみ)で判定します。')

input_documents = []
while True:
    line = input()
    # 空行で入力を終了
    if not line:
        break
    input_documents.append(line)

# 入力された文章がない場合は、メッセージを表示して終了
if not input_documents:
    print('処理対象の文章がありません。')
    exit()

print('\n' + '=' * 40)
print('             解析結果')
print('=' * 40 + '\n')

# 結果を保存するリスト
results = []

# 統計情報用の変数
total_morphemes = 0
pos_counter = {}

# メイン処理
# 各文書を形態素解析し、結果を表示
for i, doc in enumerate(input_documents):
    result_line = f'--- 文書 {i+1} ---'
    print(result_line)
    results.append(result_line)

    # 形態素解析を実行
    morphemes = tokenizer_obj.tokenize(doc, split_mode)

    # 解析結果を表示
    for m in morphemes:
        total_morphemes += 1
        pos = m.part_of_speech()[0]
        pos_counter[pos] = pos_counter.get(pos, 0) + 1

        # 表層形、品詞、原形、正規化された形を表示
        result_detail = f'  表層形: {m.surface()}\t 品詞: {pos}\t 原形: {m.dictionary_form()}\t 正規化形: {m.normalized_form()}'
        print(result_detail)
        results.append(result_detail)
    print() # 各文書の後に改行
    results.append('')

# 統計情報を表示
print('=== 統計情報 ===')
print(f'総単語数: {total_morphemes}')
print('品詞別集計:')
stat_info = [f'=== 統計情報 ===', f'総単語数: {total_morphemes}', '品詞別集計:']

for pos, count in sorted(pos_counter.items(), key=lambda x: x[1], reverse=True):
    stat_line = f'  {pos}: {count}'
    print(stat_line)
    stat_info.append(stat_line)

# 統計情報も結果に追加
results.extend(stat_info)

# 結果をファイルに保存
with open('result.txt', 'w', encoding='utf-8') as f:
    for line in results:
        f.write(line + '\n')

print('\nresult.txtに保存しました')

使用方法

  1. 上記のプログラムを実行する
  2. プログラムが起動すると、「解析対象の文章を入力してください(複数行可)」というメッセージが表示される。
  3. 解析したい日本語の文章を入力し、Enterキーを押す。複数行入力する場合は、1行入力するごとにEnterキーを押し、全ての入力が終わったら空行でEnterキーを再度押す。
  4. 入力が終了すると、解析結果が表示される。各形態素の表層形(実際に表示される形)、品詞、原形(辞書形)、正規化形(表記ゆれを吸収した形)が確認できる。

実験・探求のアイデア

本プログラムを様々な文章で実行し、以下のような実験を通してSudachiPyの特性や日本語の構造を探求することができる。

AIモデル選択

本プログラムでは、SudachiPyのCモードを利用している。SudachiPyには他にも以下の分割モードが存在する。

実験のアイデア: プログラムコード内のsplit_mode = tokenizer.Tokenizer.SplitMode.Cの部分をsplit_mode = tokenizer.Tokenizer.SplitMode.Asplit_mode = tokenizer.Tokenizer.SplitMode.Bに変更し、同じ文章を解析してみる。各モードで単語の分割のされ方や品詞情報がどのように変化するかを比較することで、SudachiPyの柔軟な分割能力を体験できる。

実験要素

体験・実験・探求のアイデア(新発見を促す)