メインコンテンツへスキップ

日本語を単語で認識する Python MeCabで形態素解析してみた。

    こんにちはRcatです。
    今回は形態素解析やっていきます。
    私もこの名前は今回初めて知りました。何やるかっていうとこういうことです。

    画像

    一見、いやそれ仕様だよねと思うかもしれませんが、なんでダブルクリックしたその文字だけじゃなく、その周辺もちょうどよく選択されているんでしょうか?
    今回はこの部分に疑問を持って自作のツールに生かせないか考えてみることにしました。


    はじめに

    利用規約

    情報や作品の活用時は事前に利用規約をご確認ください。

    コメントについて

    利用規約のガイドラインを確認の上コメントしてください


    概要

    というわけで困った時のチャットGPTです。
    とりあえずこんな感じで聞いてみました。何だこいつって聞き方ですね。
    そんな奴にも親切に形態素解析という方法を教えてくれました。

    画像

    MeCabライブラリで形態素解析(単語抽出)

    というわけで、ここからはいきなりライブラリを使いながらどういう動作をするのか見ていこうと思います。

    インストール

    このライブラリは2部構成に分かれているので、2つのインストールコマンドが必要です。
    1つ目がライブラリ本体で2つ目が辞書のデータになります。日本語の単語を認識するのに必要ということですね。

    pip install mecab-python3
    pip install mecab-ipadic

    ちなみに公式リファレンスはこちら
    辞書には何種類かあるみたいで、その辺は公式の方を確認してください。
    とりあえずおすすめされていたものをインストールしています。

    サクッと使用する

    ぐだぐだ言ってても仕方ないのでさっさと使います。
    使い方は簡単でライブラリをインポートしてクラスをインスタンスした後、文字列を渡すだけ

    >>> import MeCab
    >>> tagger = MeCab.Tagger()
    >>> print(tagger.parse("ねこはとてもかわいくてあいらしいです"))
    ねこ    ネコ    ネコ    猫      名詞-普通名詞-一般                      1
    は      ワ      ハ      は      助詞-係助詞
    とても  トテモ  トテモ  迚も    副詞                    0
    かわいく        カワイク        カワイイ        可愛い  形容詞-一般     形容詞  連用形-一般     3
    て      テ      テ      て      助詞-接続助詞
    あいらしい      アイラシー      アイラシイ      愛らしい        形容詞-一般     形容詞  終止形-一般     4
    です    デス    デス    です    助動詞  助動詞-デス     終止形-一般
    EOS
    
    >>> print(tagger.parse("猫はとても可愛くて愛らしいです"))
    猫      ネコ    ネコ    猫      名詞-普通名詞-一般                      1
    は      ワ      ハ      は      助詞-係助詞
    とても  トテモ  トテモ  迚も    副詞                    0
    可愛く  カワイク        カワイイ        可愛い  形容詞-一般     形容詞  連用形-一般     3
    て      テ      テ      て      助詞-接続助詞
    愛らしい        アイラシー      アイラシイ      愛らしい        形容詞-一般     形容詞  終止形-一般     4
    です    デス    デス    です    助動詞  助動詞-デス     終止形-一般
    EOS

    確かに単語通りに分かれていますね。
    出力データはタブで区切られたTSV形式なので、それを活用してリストに変換すると以下のような感じ。
    はい、たったこれだけで単語ことに分割が完了しました。やばいですね。

    >>> [line.split('\t')[0] for line in tagger.parse("猫はとても可愛くて愛らしいです").splitlines() if '\t' in line]
    ['猫', 'は', 'とても', '可愛く', 'て', '愛らしい', 'です']

    使い道

    使い道としては、文章の折り返しポイントを決めるために使おうと考えています。

    活用事例

    こちらは下で紹介している、英語の動画を全自動で日本語に翻訳して吹き替えて字幕を入れるためのツールで作成した動画の一部なのですが、この字幕の折り返しが文字数依存になっています。
    この例題の動画ではGoogle翻訳で読み上げたので、なかなか区切りがつかず、一文が非常に長くなって字幕の行数が増えているのが特徴です。
    こういう時の対策です。

    画像

    上の方を見るとリラックスという単語なのにリラックで折り返されてしまっていますね。こういうのは字幕として読みにくいです。
    そこで、今回の形態素分析を用いてどこで折り返すべきかといったプログラムを追加しました。
    その結果が下の方です。
    "作ります。"で改行されて"見たり"で改行されていますね。
    最後の"ます"が微妙ですが。多分単語としては"し"と"ます。"なんでしょうね。
    少なくとも上の時よりは読みやすくなったと思います。


    ソースコード

    先ほどの全自動動画翻訳ツールに組み込んだソースはこちらです。

    画像
     
     
    モノづくりが趣味。 "売ってないなら自分で作ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワーク 全部やります。 記事執筆はAI不使用。 ご連絡や利用規約はプロフィール記事参照。

    あなたへのおすすめ