WordCloudで日本語解析
WordCloudで英文の解析に成功したので日本語の文章に挑戦しました。
つくるもの
pythonスクリプトと同じフォルダに入れた日本語の文章をWordCloudで解析し文章中に頻出する単語を可視化します。
日本語解析の難しさ
直感的ですが、英文は単語が必ずスペースで区切られているため、文中の単語を抽出するのは比較的簡単に思えます。 一方、日本語は単語が連続しているので、文章を意味のある最小単位に分解し解析する(形態素解析)が必要だそうです。 日本語の形態素解析はWordCloudの守備範囲外なので、Janomeというpythonライブラリを活用します。
Janomeのインストール
自宅のMac環境ではpipコマンドで一発でインストールできました。
# pip install janome
WordCloudとは異なり、会社のWindows環境でも同コマンドで問題なくインストールできました。
コード全体
# Import packages and modules import matplotlib.pyplot as plt from wordcloud import WordCloud, STOPWORDS from janome.tokenizer import Tokenizer import sys, os # Read text os.chdir(sys.path[0]) text = open('jp.txt', mode='r', encoding='utf-8').read() # Tokenize text tk = Tokenizer() tokens = tk.tokenize(text) words = [] for token in tokens: token_list = token.part_of_speech.split(",") if token_list[0] == "名詞" or token_list[0] == "動詞" or token_list[0] == "形容詞": words.append(token.surface) words = " ".join(words) # Generate WordCloud object stopwords = {'田中','太郎'} stopwords |= STOPWORDS wc = WordCloud( background_color='black', stopwords=stopwords, font_path=r"/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc", height = 600, width=600 ) wc.generate(words) # Write to image file wc.to_file('result_jpn.png')
コード解説
英文の解析と異なる部分だけ紹介します。
公式ドキュメント
パッケージとモジュールのインポート
# Import packages and modules import matplotlib.pyplot as plt from wordcloud import WordCloud, STOPWORDS from janome.tokenizer import Tokenizer import sys, os
Tokenizer
は文字列をトークン(意味を持つ最小単位)に分解するクラス
それ以外については,WordCloudによる英文の解析と同じです。
トークンの抽出
# Tokenize text tk = Tokenizer() tokens = tk.tokenize(text) words = [] for token in tokens: token_list = token.part_of_speech.split(",") if token_list[0] == "名詞" or token_list[0] == "動詞" or token_list[0] == "形容詞": words.append(token.surface) words = " ".join(words)
tk = Tokenizer() tokens = tk.tokenize(text)
Tokenizer()
オブジェクトを生成して、文字列text
をトークンのリストにする
tokens
はジェネレータなので print(next(tokens))
で中身を見ます。
属性 | 例 |
---|---|
surface (表層形) | 田中 |
part_of_speech[0] (品詞) | 名詞 |
part_of_speech[1] (品詞細分類1) | 固有名詞 |
part_of_speech[2] (品詞細分類2) | 人名 |
part_of_speech[3] (品詞細分類3) | 姓 |
infl_type (活用型) | * |
infl_form (活用形) | * |
base_form (基本形) | 田中 |
reading (読み) | タナカ |
phonetic(発音) | タナカ |
属性を使ってWordCloudで表示したい品詞などを絞り込むことができます。
for token in tokens: token_list = token.part_of_speech.split(",") if token_list[0] == "名詞" or token_list[0] == "動詞" or token_list[0] == "形容詞": words.append(token.surface) words = " ".join(words)
tokens
から条件にあったトークンのみをリストwords
に追加します。
最後に、words = " ".join(words)
でwordsの区切りを,
からスペースに変換します。
結果
文字列抽出の条件はイケていないですが、日本語のWordCloudができました。
WordCloud入門
業務でとったアンケートの分析を可視化したくて、WordCloudに挑戦しました。
WordCloudとは
WordCloudとは、テキスト中に出現する単語を出現頻度に比例して散りばめた画像を作成するツールです。 下のサンプルはオンライン英会話のメモをWordCloudに入力した結果です。ビジネス系の英会話メモなのでビジネスに関係する用語が多数、大きく表示されていますね。
つくるもの
pythonスクリプトと同じフォルダに入れた英語の文章をWordCloudで解析し文章中に頻出する単語を可視化します。私の目的である日本語の文章解析はプラスアルファの作業が必要なため、別の記事で紹介します。
WordCloudのインストール
自宅のMac環境ではpipコマンドで一発でインストールできました。
# pip install wordcloud
会社のWindows環境で同コマンドを実行したところ、エラーがでてインストールできなかったため、以下の記事を参考にインストールしました。
- 自分のPythonとWindows環境(32bit or 64bit)に適合する .whl ファイルをここからダウンロードする
- コマンドプロンプトでダウンロードしたパスに移動する
- コマンドを実行する
# py -<python version> -m pip install <filename.whl>
コード全体
# Import packages and modules import matplotlib.pyplot as plt from wordcloud import WordCloud, STOPWORDS import sys, os # Read text os.chdir(sys.path[0]) text = open('cloud.txt', mode='r', encoding='utf-8').read() # Generate WordCloud object stopwords = {'Will','Yasu'} stopwords |= STOPWORDS wc = WordCloud( background_color='black', stopwords=stopwords, font_path=r"/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc", height = 600, width=600 ) wc.generate(text) # Write to image file wc.to_file('result.png')
コード解説
公式ドキュメント
パッケージとモジュールのインポート
# Import packages and modules import matplotlib.pyplot as plt from wordcloud import WordCloud, STOPWORDS import sys, os
matplotlib.pyplot
はWordCloudで解析した結果を画像化するのに使います。
WordCloud
ワードクラウドの生成、描画用のクラスです。
STOPWORDS
自然言語をコンピュータで処理するときに処理対象外とする英単語の集合(set)です。
print()
で中身を見ると{'such', 'down', 'into', "i'll", "i've", 'himself'...}
のようにどんな文章でも出てきそうな一般的な単語が格納されています。
sys
はパスの取得、os
はディレクトリの移動に使っており、WordCloudの利用には必須ではありません。
テキストの読み込み
# Read text os.chdir(sys.path[0]) text = open('cloud.txt', mode='r', encoding='utf-8').read()
os.chdir(sys.path[0])
でpythonスクリプトがあるフォルダをカレントディレクトリにします。
sys.path[0]
は Python インタプリタを起動したスクリプトのあるディレクトリの文字列です。
open('cloud.txt', mode='r', encoding='utf-8').read()
でカレントディレクトリのcloud.txt
を読込みます。
WordCloudオブジェクトの生成
# Generate WordCloud object stopwords = {'Will','Yasu'} stopwords |= STOPWORDS wc = WordCloud( background_color='black', stopwords=stopwords, font_path=r"/System/Library/Fonts/ヒラギノ角ゴシック W6.ttc", height = 600, width=600 ) wc.generate(text)
自作のストップワードのsetを作成し、STOPWORDS
と結合します。
ちなみにYasuはオンライン英会話のロールプレイに頻出する人名です。
stopwords = {'Will','Yasu'} stopwords |= STOPWORDS
wc = WordCloud()
にはオブジェクト生成時のオプションをしています。
font_path=r
のr
は文字リテラル内のエスケープシーケンスを展開しない(raw文字列にする)という意味です。
wc.generate(text)
で読み込んだテキストのWordCloudを生成します。
イメージファイルへの書き込み
私の環境(MacBook Pro 2019 2.8Ghz Core i7)では、2000行の英文テキストを数秒で画像化できました。
# Write to image file wc.to_file('result.png')
結果
冒頭の画像に比べて、追加したstopwordsが除外されています。