Python & MeCab を使った形態素解析がうまくいかない!

スポンサーリンク
036-ホビー

へっぽこヘタレシステム管理者の管理人です・・・

さて、アンケートの結果を形態素解析して、

ワードクラウドを作ろうと画策しているのですが・・・

現時点では、形態素解析で躓いている現状です。

PythonとMeCabのインストール

まずは・・・

PythonとMecabをダウンロードしてインストールします。

Pythonのダウンロードはこちら

コードの編集はVSCODEが使いやすいと思います。

VSCODEのダウンロードはこちら

Pythonをインストールしたらコマンドプロンプトで・・・

次の2行を叩いて、MeCabと辞書をインストールします。

pip install mecab-python3
pip install unidic-lite

Mecabが動くか確認

次にMeCabが動くか確認します。

まずは、VSCODEに次のコードをコピペして実行します。

import MeCab

def analyze_text(text):
    """
    MeCabを使用して形態素解析を行う関数
    """
    try:
        # 標準辞書とユーザー辞書のパスを指定
        standard_dic_path = r"C:\\Users\\ユーザーフォルダ名\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\unidic_lite\\dicdir"
        mecab = MeCab.Tagger(f"-d {standard_dic_path}")
        
        if not mecab:
            return "MeCabの初期化に失敗しました(Taggerの生成に失敗)"
        
    except Exception as e:
        return f"MeCabの初期化に失敗しました: {str(e)}"
    
    try:
        # 入力テキストを解析
        parsed_result = mecab.parse(text)
        return parsed_result
    except Exception as e:
        return f"形態素解析中にエラーが発生しました: {str(e)}"

def main():
    """
    プログラムのメイン関数
    """
    print("形態素解析ツールへようこそ!")
    print("""
以下の形式でテキストを入力してください。

テキスト入力部分

複数行の入力が可能です。
入力が終わったらCtrl+D(Linux/Mac)またはCtrl+Z(Windows)を押してください。
:""")
    
    # 長文入力を受け付ける
    lines = []
    try:
        while True:
            line = input()
            lines.append(line)
    except EOFError:
        print("\n入力を終了しました。解析を実行します...\n")
    
    # 入力テキストを連結
    text = "\n".join(lines)
    
    # 形態素解析
    analyzed = analyze_text(text)
    print("\n解析結果:")
    print(analyzed)

if __name__ == "__main__":
    main()

テキストを入力して【CTRL+Z】を押せと表示されるので・・・

適当にテキストを打って動くか確認します。

【今日は天気が良いですね。】と入力すると・・・

解析結果:
今日    キョー  キョウ  今日    名詞-普通名詞-副詞可能                  1
は      ワ      ハ      は      助詞-係助詞
天気    テンキ  テンキ  天気    名詞-普通名詞-一般                      1
が      ガ      ガ      が      助詞-格助詞
良い    ヨイ    ヨイ    良い    形容詞-非自立可能       形容詞  終止形-一般     1
です    デス    デス    です    助動詞  助動詞-デス     終止形-一般
ね      ネ      ネ      ね      助詞-終助詞
。                      。      補助記号-句点
EOS

とかえってくればOKです。

さて、ここで・・・

【児童手当】と入力してみます。

解析結果:
児童    ジドー  ジドウ  児童    名詞-普通名詞-一般                      1
手当    テアテ  テアテ  手当て  名詞-普通名詞-サ変可能                  1
EOS

【児童】と【手当】に分かれてしまいます。

次に【少子高齢化】と入力してみます。

解析結果:
少子    ショーシ        ショウシ        少子    名詞-普通名詞-一般                      1
高齢    コーレー        コウレイ        高齢    名詞-普通名詞-一般                      0
化      カ      カ      化      接尾辞-名詞的-サ変可能
EOS

【少子】と【高齢】と【化】

に分かれてしまいます。

あまりにも細分化されすぎるので、これではちょっと使えません。

辞書を変えてみる

ネット調べてみると【Unidic辞書】が良いという情報があったので辞書を変更してみます。

Unidic辞書】のダウンロードはこちら

辞書の解凍は【7ZIP]を使います。

※普通に解答するとなぜか動きません。(文字コードがおかしくなるのか?)

辞書を解凍してPythonコードの辞書のフォルダを変更します。

ダウンロードした辞書を解凍して適当にフォルダに入れて辞書フォルダのパスを変更します。

# 変更前
 standard_dic_path = r"C:\\Users\\ユーザーフォルダ名\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\unidic_lite\\dicdir"
# 変更後
 standard_dic_path = r"C:\\Users\\ユーザーフォルダ名\\AppData\\Local\\Programs\\Python\\Python313\\Lib\\site-packages\\unidic_lite\\dicdir2"

結果は同じ・・・

全く使えん・・・

スポンサーリンク

ユーザー辞書の作成

諦めてユーザー辞書の作成を試みます。

まずは・・・

ユーザー辞書のCSVファイルをUTF-8で作成します。

CSVファイルの作成にはルールがある様で・・・

次の様にするようです。

  • 文脈ID:1285 → 名詞を表す
  • コスト:優先度 → 数値が低いと優先度があがるらしい

表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音
児童手当,1285,1285,5000,名詞,固有名詞,一般,*,*,*,児童手当,ジドウテアテ,ジドウテアテ
少子高齢化,1285,1285,5000,名詞,一般,*,*,*,*,少子高齢化,ショウシコウレイカ,ショウシコウレイカ

さて、君ずユーザー辞書の作成ですが・・・

Gemini君に、

行政、地域課題、行政サービス等の単語を500個作ってくれとお願いすると適当に作ってくれました。

AIって便利です。

スポンサーリンク

Gemini君に作ってもらった用語一覧はこちら

次にユーザー辞書の作成です。

ユーザー辞書の作成にはWindows版のMeCabをインストールする必要があるようです。

Windows版のMeCabはこちら

インストールする際に文字コードを聞かれますので、

【UTF-8】を選択してください。

ブログランキングにご協力ください!
ブログランキング・にほんブログ村へ

MeCabのパスを環境変数に追加しておきます。

C:\Program Files\MeCab\bin

次に作成したCSVファイルからユーザー辞書を作成します。

コードは次のとおりです。

mecab-dict-index -d "unidic辞書を入れたフォルダ" -u "ユーザー辞書を出力するフォルダ" -f utf-8 -t utf-8 "CSVの格納フォルダ\user.csv"

最後にPythonのコードを修正します。

修正する部分は次のとおりです。

# 標準辞書とユーザー辞書のパスを指定
user_dic_path = r"ユーザー辞書の絶対パス・ファイル名まで指定"
standard_dic_path = r"unidic辞書のフォルダの絶対パス"
mecab = MeCab.Tagger(f"-u {user_dic_path} -d {standard_dic_path}")

※ちなみにフォルダを指定するバックスラッシュは次のとおり必ず2個いれてください。

2個いれないとエラーが出ます。

c:\ → C:\\

テスト

児童手当・少子高齢化

と入力してテストしました。

解析結果:
児童手当        名詞,固有名詞,一般,*,*,*,児童手当,*,*
・      補助記号,一般,*,*,*,*,*,・,・,*,・,*,記号,*,*,*,*,*,*,補助,・,・,*,*,*,*,*,12103251534336,44
少子高齢化      名詞,固有名詞,一般,*,*,*,少子高齢化,*,*
EOS

ユーザー辞書がしっかりと反映されました。

こうやってブログに忘備録として掲載すれば・・・

簡単に見えますが・・・

実はユーザー辞書の作成と適用にかなりの時間がかかり、

2日くらい無駄にしました。

エセSEのやることなんてこんなものです。

あとは、ユーザー辞書の単語の精度をどれだけ上げられるかですね。

しかし、たったこれだけのことですが、結構苦労したので嫌になりました。

ただ、純粋に遊びとしては面白かったですね。

unidic-liteではなくunidicを使う場合

unidic-liteではなくunidicを使う場合は次のコマンドとなる

pip install mecab-python3
pip install unidic
# ただしUnidicはpipだけでは辞書本体がダウンロードされないため下記コマンドで辞書本体をダウンロードする。

python -m unidic download

ブログ開設に必要なドメイン取得、サーバーレンタル、ASPの登録等は、こちらのサイトから!

コメント

タイトルとURLをコピーしました