python

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

python 形態素解析

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

今回は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

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

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

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

自然言語処理

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

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

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

形態素解析の内容

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

実際には、

  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の動作確認を行なっていきます

python

import MeCab

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

pythonで形態素解析を行う

形態素解析に実行

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

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

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']

分かち書き

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

import MeCab

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

>>>出力結果

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

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

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

今回は形態素解析を行いつつ、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