Python x データ分析 | ワードクラウドを用いたデータ可視化_Mecabによる形態素分析
- 2023.06.24
- Python
今回は前回の続きです。
形態素分析ツール Mecab
今回は 形態素分析ツール Mecab を利用します。
MeCabは、日本語の形態素解析エンジンであり、テキストを形態素(単語や文節など)に分割するためのツールです。
高速かつ高精度な形態素解析を提供し、自然言語処理やテキストマイニングなどのタスクで広く使用されています。
今回はWindows環境でのインストールを行います。
1)バイナリパッケージをインストールする
私の現在の環境はWin11なのですが、公式サイトの32bit版だとMecabが文字化けしてしまい、解析できませんでした。。。
以下の様な感じ↓
\udce3\t\udc96\udcbc\ucd8c, \udc88\udcca.....
ですので、こちらのサイトをもとに64bit版を入れることで利用することができました。
一応…)公式サイトからダウンロードする場合
64bit版はCaboChaが対応していないので、もし公式を入れたい場合は以下から。
公式サイトにアクセスし、バイナリパッケージ「XXX.exe」をダウンロードします。
サイトリンク↓
2)ダウンロードしたexeを実行する
上記「1)」で取得したexeを実行します。
文字コードは「UTF-8」とします。
インストール時に、同時に辞書もダウンロードすることができますので、ダウンロードします。
3)pythonのモジュールをインストール
mecab-python3をインストールします。
pip install mecab-python3
以上で準備完了です。
プログラム
前回作成したPythonプログラムを改造し、Mecabのデータを取り込めるようにします。
データ元は前回同様、オバマ大統領の就任演説です。(リンク)
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import MeCab
# 形態素解析器としてMeCabを初期化します
mecab = MeCab.Tagger()
# ワードクラウドに表示するテキストデータを用意します
with open('text_data.txt', 'r', encoding='utf-8') as file:
text = file.read()
# 使用するフォントのパスを指定します
font_path = 'C:/Windows/Fonts/meiryo.ttc'
# テキストを形態素解析して、単語のリストを取得します
parsed_text = mecab.parse(text).split('\n')
words = []
for line in parsed_text:
if line == 'EOS':
break
else:
word = line.split('\t')[0]
words.append(word)
# ワードクラウドを作成します
wordcloud = WordCloud(width=800, height=400, font_path=font_path,background_color='white').generate(' '.join(words))
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
結果を見てみましょう。
単語というよりは助詞が強く表示されます。これでは可視化とは言い難い状況です…
「単語」のみを抽出する
プログラムを以下のように書き換えます。
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import MeCab
# 形態素解析器としてMeCabを初期化します
mecab = MeCab.Tagger()
# ワードクラウドに表示するテキストデータを用意します
with open('text_data.txt', 'r', encoding='utf-8') as file:
text = file.read()
# 使用するフォントのパスを指定します
font_path = 'C:/Windows/Fonts/meiryo.ttc'
# テキストを形態素解析して、単語のリストを取得します
parsed_text = mecab.parse(text).split('\n')
words = []
print(parsed_text)
for line in parsed_text:
if line == 'EOS':
break
else:
elements = line.split('\t')
if len(elements)==2 and elements[1].startswith('名詞'):
word = elements[0]
words.append(word)
# ワードクラウドを作成します
wordcloud = WordCloud(width=800, height=400, font_path=font_path,background_color='white').generate(' '.join(words))
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
結果が以下の通りです。
だいぶ的を絞ることができました。もう少し調整してみます。
NGワードを何個かピックアップして除外してみます。
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from wordcloud import STOPWORDS
import MeCab
# 形態素解析器としてMeCabを初期化します
mecab = MeCab.Tagger()
# ワードクラウドに表示するテキストデータを用意します
with open('text_data.txt', 'r', encoding='utf-8') as file:
text = file.read()
# 使用するフォントのパスを指定します
font_path = 'C:/Windows/Fonts/meiryo.ttc'
# テキストを形態素解析して、単語のリストを取得します
parsed_text = mecab.parse(text).split('\n')
words = []
print(parsed_text)
for line in parsed_text:
if line == 'EOS':
break
else:
elements = line.split('\t')
if len(elements)==2 and elements[1].startswith('名詞'):
word = elements[0]
words.append(word)
#除外ワード
NGWORD_Lists = ['私','彼ら','そこ','ここ','あそこ','たち','こと','あれ','これ','それ','ため','もの','ん','の','よう','これら']
for NGWORD in NGWORD_Lists:
STOPWORDS.add(NGWORD)
# ワードクラウドを作成します
wordcloud = WordCloud(width=800, height=400, font_path=font_path,background_color='white').generate(' '.join(words))
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
結果が以下です。
見た目が整いました。
ほかの文書ではどうなるか?
では、先ほど作成したプログラムを使って、別の文章を可視化してみます。
例1)第4回東京グローバルダイアログ 岸田総理大臣 挨拶
外務省が公開している岸田総理大臣の演説内容です。
https://www.mofa.go.jp/mofaj/fp/pp/page3_003632.html
G7の「G」や、「広島」「ウクライナ」などが挙がっていることが分かります。
例2)栗山監督 入学式の挨拶
侍ジャパンの栗山監督の入学スピーチです。
https://news.yahoo.co.jp/articles/dc697bc8a7e9ceb6d8527246a95c737377db6d9a?page=2
「入学」「みなさん」といった歓迎スピーチに関連するワードのほか、「野球」や「人」、「ジャパン」などもちりばめられていることが分かります。
まとめ
ということで、今回は「ワードクラウド」を作成し、文章の可視化を行いました。
視覚的に相手に情報を伝える手段として、十分に使えそうですね!
ではまた!
エラー: データの取得に失敗しました。
-
前の記事
Python x データ分析 | ワードクラウドを用いたデータ可視化 2023.06.24
-
次の記事
Python x データ分析 | ワードクラウドを用いたデータ可視化_スクレイピング活用 2023.06.25