Python でWord Cloud を実装する。
Python を用いた自然言語処理の有名なものにWord Cloud というものがある。
これはテキストから単語の出現頻度を参考に視覚化を行うものだ。(どこかのワイドショーで使われているやつ)
この実装をChatGPTを使いながら実施してみたので、参考になればと思い公開する。
実行環境はGoogle Colaboratory を想定している。読み取るファイルはtxt 形式のものだ。
コード中の下記だけは自分の指定のファイルパスに適宜書き換えて欲しい。
!pip install janome wordcloud
!pip install japanize_matplotlib
!sudo apt update
!sudo apt install fonts-ipaexfont
import os
from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.charfilter import UnicodeNormalizeCharFilter, RegexReplaceCharFilter
from janome.tokenfilter import POSKeepFilter, LowerCaseFilter, ExtractAttributeFilter
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import japanize_matplotlib
# テキストデータの前処理用の設定
char_filters = [UnicodeNormalizeCharFilter(), RegexReplaceCharFilter('<.*?>', '')]
keep_pos = ['名詞', '動詞', '連体詞', '形容詞', '副詞', '感動詞']
token_filters = [POSKeepFilter(keep_pos),
LowerCaseFilter(),
ExtractAttributeFilter('base_form')]
analyzer = Analyzer(char_filters=char_filters, token_filters=token_filters)
# テキストファイルが保存されているディレクトリのパス
text_dir_path = '/content/texts' # パスを指定してください
# 全てのトークンを格納するリスト
all_tokens = []
# 各ファイルからトークンを抽出
for file_name in os.listdir(text_dir_path):
file_path = os.path.join(text_dir_path, file_name)
try:
with open(file_path, 'r', encoding='utf-8') as f:
text = f.read().strip()
tokens = [token for token in analyzer.analyze(text)]
all_tokens.extend(tokens)
except Exception as e:
print(f"Error processing {file_path}: {e}")
# 一般的な日本語のストップワード
common_stop_words = set([
'もの', 'こと', 'とき', 'そう', 'たち', 'これ',
'よう', 'これら', 'それ', 'ん', 'てる', 'いる',
'ある', 'する', 'の', 'さ', 'れる', 'せる',
'なる', 'ない', 'その', 'ため', 'から', 'によって',
'により', 'おり', 'より', 'にて', 'ほど', 'など',
'たり', 'だり', 'しかし', 'けれど', 'ながら',
'また', 'も', 'または', 'そして', 'または'
])
# 分析に特に適した追加のストップワード
# このリストは分析のコンテキストや目的に応じて調整することができます
additional_stop_words = set([
'です', 'ます', 'あれ', 'これ', 'それ', 'どれ',
'ここ', 'そこ', 'あそこ', 'どこ', 'だれ', 'かも',
'ところ', 'こちら', 'そちら', 'あちら', 'どちら',
'どの', 'なに', 'なん', 'かな', 'できる', 'いく',
'やる', 'こと', 'よう', 'もの'
])
# ストップワードの統合
stop_words = common_stop_words.union(additional_stop_words)
# 日本語フォントのパス
font_path = '/usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf'
# Word Cloudの生成
word_chain = ' '.join(all_tokens)
wordcloud = WordCloud(background_color='white',
font_path=font_path,
width=900,
height=500,
max_words=1000,
stopwords=stop_words).generate(word_chain)
# Word Cloudの表示
plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
ちなみに適当なサンプルファイルで作成した例がこちら。