python PR

pythonでMecabを使って形態素解析をやってみよう

python 形態素解析
記事内に商品プロモーションを含む場合があります

形態素解析とは自然言語処理の一種です

今回はpythonで形態素解析を行なっていきたいと思います

pythonで形態素解析エンジンMeCabを使用する方法についても併せて解説していきますので、参考にしてみてください

また、僕自身が収益化したサンプルコードも載せています

こんなあなたにおすすめ

pythonで形態素解析を行いたい

pythonでデータ分析の引き出しを増やしたい

pythonのMeCabを使ってみたい

独学で収益を出した方法は以下の記事から

アイキャッチ
pythonを独学で学び収益を出す方法【無料特典あり】pythonを独学で学び始めて筆者が、どのように収益5桁を達成したのかを具体的に解説していきます。この順番に進めていけば、一年以内にpythonを使って収益化できるようになります。...

 

pythonで形態素解析をやってみよう【収益化したサンプルコードあり】

python 形態素解析 サンプルコード

まずは完成しているサンプルコードから

サンプルコードの解説は記事の後半でしていきます

import collections
import MeCab
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import seaborn as sns
sns.set(font='Hiragino Sans')

f= open('.txt', 'r', encoding='UTF-8')
text=f.read()
f.close()
tagger =MeCab.Tagger()
tagger.parse('')
node = tagger.parseToNode(text)

word_list=[]
while node:
    word_type = node.feature.split(',')[0]
    if word_type in ["名詞",'代名詞']:
        word_list.append(node.surface)
    node=node.next
word_chain=' '.join(word_list)

c=collections.Counter(word_list)
font_path='/System/Library/Fonts/ヒラギノ明朝 ProN.ttc'
words = ["もの","こと","あれ","それ","どれ","です","ます","こと"]
result = WordCloud(width=800, height=600, background_color='white', 
                   font_path=font_path,regexp=r"[\w']+", 
                   stopwords=words).generate(word_chain)
result.to_file("./wordcloud_sample1.png")
print(c.most_common(20))
fig = plt.subplots(figsize=(8, 10))

sns.set(font="Hiragino Maru Gothic Pro",context="talk",style="white")
sns.countplot(y=word_list,order=[i[0] for i in c.most_common(20)],palette="Blues_r")

形態素解析とは?

形態素解析とは

形態素解析とは、文を単語単位に区切り、各単語の品詞を特定する解析技術のことを指しています

形態素解析(けいたいそかいせき、Morphological Analysis)とは、文法的な情報の注記の無い自然言語のテキストデータ(文)から、対象言語の文法や、辞書と呼ばれる単語の品詞等の情報にもとづき、形態素(Morpheme, おおまかにいえば、言語で意味を持つ最小単位)の列に分割し、それぞれの形態素の品詞等を判別する作業である。自然言語処理の分野における主要なテーマのひとつであり、機械翻訳やかな漢字変換など応用も多い(もちろん、かな漢字変換の場合は入力が通常の文と異なり全てひらがなであり、その先に続く文章もその時点では存在しないなどの理由で、内容は機械翻訳の場合とは異なったものになる)。

wikipediaより

言葉だけでは分かりにくいので、実際にやってみましょう

import MeCab
 
mecab = MeCab.Tagger('-Ochasen')
sent ="昨日はHTMLの勉強をした"
print(mecab.parse(sent))

>>>出力結果

昨日	キノウ	昨日	名詞-副詞可能		
は	ハ	は	助詞-係助詞		
HTML	HTML	HTML	名詞-固有名詞-組織		
の	ノ	の	助詞-連体化		
勉強	ベンキョウ	勉強	名詞-サ変接続		
を	ヲ	を	助詞-格助詞-一般		
し	シ	する	動詞-自立	サ変・スル	連用形
た	タ	た	助動詞	特殊・タ	基本形
EOS

このように文を単語ごとに区切り、単語の品詞を特定してくれています

これが形態素解析となります

また、形態素解析は自然言語処理の分野における主要なテーマでもあります

Mecabとは?

MeCabとは、形態素解析が行えるソフトウェアのことを指します

pythonのライブラリではありませんが、MeCabとpythonは連携して使用することができます

自然言語処理

自然言語処理とは普段私たちが使用している言葉を、言葉が持つ意味を様々な方法で解析することを指します

自然言語処理は形態素解析の他にも、以下のようなものがあります

  • 構文解析
  • 意味解析
  • 文脈解析

形態素解析の内容

サンプルコードでは単語を区切り、品詞を特定し、活用形まで出力してくれています

実際には、

  1. 単語への分かち書き
  2. 各単語の品詞の特定
  3. 活用形の特定

という流れで処理がされています

単語への分かち書き

単語への分かち書きというのは、文を最小単位である単語に分ける作業のことを言います

import MeCab
 
mecab = MeCab.Tagger('-Owakati')
sent ="昨日はHTMLの勉強をした"
print(mecab.parse(sent))

>>>出力結果

昨日	キノウ	昨日	名詞-副詞可能		
は	ハ	は	助詞-係助詞		
HTML	HTML	HTML	名詞-固有名詞-組織		
の	ノ	の	助詞-連体化		
勉強	ベンキョウ	勉強	名詞-サ変接続		
を	ヲ	を	助詞-格助詞-一般		
し	シ	する	動詞-自立	サ変・スル	連用形
た	タ	た	助動詞	特殊・タ	基本形
EOS

今回の例で言うと、

形態素解析分かち書き

上記のようになります

各単語の品詞の特定

次に各単語の品詞の特定ですが、以下のようになります

形態素解析品詞の特定

pythonを使った形態素解析では、より細かく格助詞や終助詞なども特定してくれます

これをうまく使えば、文章を抜き出してきて(作って)中学生の文法の問題を作ることも可能ですね

活用形の特定

最後に活用形の特定です

活用形は自立語の用言(動詞・形容詞・形容動詞)と付属語の助動詞のみになります

そもそも国語の文法として、上記4種類しか活用しないので、それ以外は表示されません

形態素解析活用形の特定

pythonで形態素解析を行う準備

形態素解析準備

ではpythonで形態素解析を行うための準備をしていきます

pythonで形態素解析を行うためには「MeCab」と言うエンジンを使用します

MeCabの環境構築

筆者はM1 Macを使用しているので、windowsユーザーの方は公式ホームページをご覧ください

流れとしては以下のようになります

  1. Homebrewのインストール
  2. MeCabと形態素解析に必要な辞書をインストール
  3. MeCabの動作確認
  4. mecab-ipadic-NEologdのインストール

Homebrewのインストール

まずはHomebrewをインストールしておきます

ターミナルを開いて以下のコマンドを実行します

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
homebrewインストール

その後、パスワードの入力を求められるので、パスワードを入力します

途中で以下の内容が表示されるので、表示されたらEnterを押します

Press RETURN to continue or any other key to abort

Homebrewのインストールが終わったら、パスを追加していきます

==> Next steps:
-Add Homebrew to your PATH in /Users/ユーザ名/.zprofile:
    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/ユーザ名/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
-Run 'brew help' to get started
-Further documentation:
    https://docs.brew.sh
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/ユーザ名/.zprofile
homebrewパス

Homebrewが正常にインストールされ、パスが通っているかを確認します

brew help
homebrewパスの確認

上記の画面が表示されれば、Homebrewのインストールとパスは正常に通っているのでOKです

MeCabと形態素解析に必要な辞書をインストール

Homebrewのインストールが完了したら、MeCabおよび形態素解析に必要な辞書をインストールしていきます

これもターミナル上で行なっていきます

brew install mecab

brew install mecab-ipadic

pip install mecab-python3

MeCabおよび形態素解析に必要な辞書をインストールはこれで完了です

Mecabの動作確認

そのままターミナル上でMeCabの動作確認を行なっていきます

python

import MeCab

MeCabをインポートしてエラーが出なければ準備完了です

pythonでMecabを使って形態素解析を行う

形態素解析に実行

では実際に形態素解析を行っていきましょう

最初に示しているサンプルコードはまた違ったサンプルコードで実行していきます

MeCabの基本

MeCabでは基本的に以下の順番で出力されます

形態素の表層形, 品詞, 品詞細分類1, 品詞細分類2, 品詞細分類3, 活用型, 活用形, 原形, 読み,発音

import MeCab

tagger = MeCab.Tagger()
print(tagger.parse("昨日はHTMLの勉強をした").split())

>>>出力結果

['昨日', 'キノー', 'キノウ', '昨日', '名詞-普通名詞-副詞可能', '2,0', 'は', 'ワ', 'ハ', 'は', '助詞-係助詞', 'HTML', 'HTML', 'HTML', 'HTML', '名詞-普通名詞-一般', '0', 'の', 'ノ', 'ノ', 'の', '助詞-格助詞', '勉強', 'ベンキョー', 'ベンキョウ', '勉強', '名詞-普通名詞-サ変可能', '0', 'を', 'オ', 'ヲ', 'を', '助詞-格助詞', 'し', 'シ', 'スル', '為る', '動詞-非自立可能', 'サ行変格', '連用形-一般', '0', 'た', 'タ', 'タ', 'た', '助動詞', '助動詞-タ', '終止形-一般', 'EOS']

splitしない場合

splitをしない場合のMecabの出力結果はこちら

import MeCab
 
mecab = MeCab.Tagger()
sent ="昨日はHTMLの勉強をした"
print(mecab.parse(sent))

>>>出力結果

昨日	キノウ	昨日	名詞-副詞可能		
は	ハ	は	助詞-係助詞		
HTML	HTML	HTML	名詞-固有名詞-組織		
の	ノ	の	助詞-連体化		
勉強	ベンキョウ	勉強	名詞-サ変接続		
を	ヲ	を	助詞-格助詞-一般		
し	シ	する	動詞-自立	サ変・スル	連用形
た	タ	た	助動詞	特殊・タ	基本形
EOS

分かち書き

次に形態素解析の基本である、分かち書きを進めていきます

import MeCab

tagger = MeCab.Tagger("-Owakati")
print(tagger.parse("昨日はHTMLの勉強をした").split())

>>>出力結果

['昨日', 'は', 'HTML', 'の', '勉強', 'を', 'し', 'た']

MeCab.Tagger()

MeCab.Tagger()で形態素解析を行うための辞書を指定します

このTaggerは「タグ付けする」という意味になります

MeCabにTaggerでタグ付けをするということです

MeCab::Tagger のコンストラクタの引数は, 基本的に mecab の実行形式に与えるパラメータと同一で, それらを文字列として与えます.

MeCab公式HPより

今回のサンプルコードは「-Owakati」を指定していますが、それ以外にも、

  • MeCab.Tagger(“-Ochasen”):ChaSen互換形式
  • MeCab.Tagger(“-Oyomi”):読みのみを出力
  • MeCab.Tagger(“-Odump”):単語の全情報
  • MeCab.Tagger(“-Osimple”):シンプルな形態素解析

などがあります

import MeCab
 
mecab = MeCab.Tagger('-Ochasen')
sent ="昨日はHTMLの勉強をした"
print(mecab.parse(sent))

>>>出力結果

昨日	キノウ	昨日	名詞-副詞可能		
は	ハ	は	助詞-係助詞		
HTML	HTML	HTML	名詞-固有名詞-組織		
の	ノ	の	助詞-連体化		
勉強	ベンキョウ	勉強	名詞-サ変接続		
を	ヲ	を	助詞-格助詞-一般		
し	シ	する	動詞-自立	サ変・スル	連用形
た	タ	た	助動詞	特殊・タ	基本形
EOS
import MeCab
 
mecab = MeCab.Tagger('-Oyomi')
sent ="昨日はHTMLの勉強をした"
print(mecab.parse(sent))

>>>出力結果

キノウハHTMLノベンキョウヲシタ
import MeCab
 
mecab = MeCab.Tagger('-Odump')
sent ="昨日はHTMLの勉強をした"
print(mecab.parse(sent))

>>>出力結果

0 BOS BOS/EOS,*,*,*,*,*,*,*,* 0 0 0 0 0 0 2 1 0.000000 0.000000 0.000000 0
2 昨日 名詞,副詞可能,*,*,*,*,昨日,キノウ,キノー 0 6 1314 1314 67 2 0 1 0.000000 0.000000 0.000000 4626
14 は 助詞,係助詞,*,*,*,*,は,ハ,ワ 6 9 261 261 16 6 0 1 0.000000 0.000000 0.000000 5501
19 HTML 名詞,固有名詞,組織,*,*,*,* 9 13 1292 1292 45 5 1 1 0.000000 0.000000 0.000000 18682
24 の 助詞,連体化,*,*,*,*,の,ノ,ノ 13 16 368 368 24 6 0 1 0.000000 0.000000 0.000000 19304
30 勉強 名詞,サ変接続,*,*,*,*,勉強,ベンキョウ,ベンキョー 16 22 1283 1283 36 2 0 1 0.000000 0.000000 0.000000 21841
35 を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 22 25 156 156 13 6 0 1 0.000000 0.000000 0.000000 21392
41 し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ 25 28 610 610 31 6 0 1 0.000000 0.000000 0.000000 24165
44 た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ 28 31 435 435 25 6 0 1 0.000000 0.000000 0.000000 21709
47 EOS BOS/EOS,*,*,*,*,*,*,*,* 31 31 0 0 0 0 3 1 0.000000 0.000000 0.000000 20599
import MeCab
 
mecab = MeCab.Tagger('-Osimple')
sent ="昨日はHTMLの勉強をした"
print(mecab.parse(sent))

>>>出力結果

昨日	名詞-副詞可能
は	助詞-係助詞
の	助詞-連体化
勉強	名詞-サ変接続
を	助詞-格助詞-一般
し	動詞-自立
た	助動詞
EOS

mecab.parse()

mecab.parseでは、指定した辞書を使用して、指定した文字列やテキストファイルの形態素解析を実施していきます

sentを指定しなくても、文字列を直接入力すれば、形態素解析を行うことができます

しかし、形態素解析を行う場合の多くはテキストファイルなどから読み込んで実行をすると思いますので、指定する方が便利だと思います

import MeCab
 
mecab = MeCab.Tagger('-Osimple')
#sent ="昨日はHTMLの勉強をした"
print(mecab.parse("昨日はHTMLの勉強をした"))

>>>出力結果

昨日	名詞-副詞可能
は	助詞-係助詞
の	助詞-連体化
勉強	名詞-サ変接続
を	助詞-格助詞-一般
し	動詞-自立
た	助動詞
EOS

mecab.parseToNode()

前回の記事のサンプルコードでは、「mecab.parseToNode()」を使用しました

これを使用することで、最初のnodeを取得し、node.nextとすることで、次のnodeに移ります

surfaceには単語が、featureには特徴(品詞の種類や活用形など)が含まれます

import collections
import MeCab
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import seaborn as sns
sns.set(font='Hiragino Sans')

f= open('.txt', 'r', encoding='UTF-8')
text=f.read()
f.close()
tagger =MeCab.Tagger()
tagger.parse('')
node = tagger.parseToNode(text)

word_list=[]
while node:
    word_type = node.feature.split(',')[0]
    if word_type in ["名詞",'代名詞']:
        word_list.append(node.surface)
    node=node.next
word_chain=' '.join(word_list)

形態素解析に出てきた品詞の数を数える

形態素解析を実施した後に、どの品詞がどれくらいの数出てきているのかを知りたい時があります

そういう時は「collections.Counter」を使用することで数を数えることができます

import collections
 ・・・省略・・・
 ・・・省略・・・
 ・・・省略・・・
 ・・・省略・・・

word_list=[]
while node:
    word_type = node.feature.split(',')[0]
    if word_type in ["名詞",'代名詞']:
        word_list.append(node.surface)
    node=node.next
word_chain=' '.join(word_list)

#word_listの中身を数える
c=collections.Counter(word_list)

形態素解析のサンプルコードを解説

では最後に以下のサンプルコードの解説をしていきます

今回は形態素解析を行いつつ、wordcloudを実行していきます

こんな感じの画像を作成していきます

形態素解析+wordcloud

使用するテキストは首相の会見内容を行っていきます

こちらのページの内容をコピペしてテキストファイルとして保存しておきましょう

import collections
import MeCab
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import seaborn as sns
sns.set(font='Hiragino Sans')

#textファイルの読み込み
f= open('.txt', 'r', encoding='UTF-8')
text=f.read()
f.close()

#読み込んだtextファイルで形態素解析を行う
tagger =MeCab.Tagger()
tagger.parse('')
node = tagger.parseToNode(text)

#取り出す品詞を決めている.今回は名詞と代名詞
word_list=[]
while node:
    word_type = node.feature.split(',')[0]
    if word_type in ["名詞",'代名詞']:
        word_list.append(node.surface)
    node=node.next
word_chain=' '.join(word_list)

c=collections.Counter(word_list)

#フォントパスの指定
font_path='/System/Library/Fonts/ヒラギノ明朝 ProN.ttc'
#wordcloud上から除外するワードの設定
words = ["もの","こと","あれ","それ","どれ","です","ます","こと"]

#wordcloudを実行する
#regexp=r"[\w']+"で1文字のものも取り出す
#result.to_fileでpngファイルとして出力
#printでよく使われている単語top20を出力
result = WordCloud(width=800, height=600, background_color='white', 
                   font_path=font_path,regexp=r"[\w']+", 
                   stopwords=words).generate(word_chain)
result.to_file("./wordcloud_sample1.png")
print(c.most_common(20))

#形態素解析の結果と合わせてグラフ化する
fig = plt.subplots(figsize=(8, 10))
sns.set(font="Hiragino Maru Gothic Pro",context="talk",style="white")
sns.countplot(y=word_list,order=[i[0] for i in c.most_common(20)],palette="Blues_r")


>>>出力結果

[('こと', 114), ('接種', 65), ('感染', 48), 
('総理', 43), ('状況', 43), ('3', 43), ('回', 37),
 ('これ', 30), ('対策', 30), ('対応', 27), ('方', 24), 
('岸田', 23), ('2', 23), ('ワクチン', 23), ('1', 22),
 ('月', 22), ('入国', 22), ('皆', 21), ('記者', 20), ('水際', 19)]

形態素解析のtop20をグラフ化した結果

形態素解析

pythonで形態素解析をやってみよう【収益化したサンプルコードあり】のまとめ

  • pythonで形態素解析をうまく使えば収益化可能
  • 形態素解析を行ったら作図も可能
  • 文字起こし→形態素解析・wordcloudのセットだとよりgood
  • MeCabは形態素解析用のソフトウェア
  • MeCabとpythonは連携して使うことができる
  • 指定の品詞のみや品詞の数をカウントすることができる
My Agile Privacy
This website uses technical and profiling cookies. Clicking on "Accept" authorises all profiling cookies. Clicking on "Refuse" or the X will refuse all profiling cookies. By clicking on "Customise" you can select which profiling cookies to activate.