DATAFLUCT Tech Blog

データ技術・データサイエンス・MLOps に関するトレンドを追いかけます

WordCloudで小説の特徴をテキストマップ化してみた

みなさん、こんにちは。DATAFLUCTのKazumiです。

今回は文章の解析を簡単に知ってもらうために、WordCloudというPythonのライブラリを用いて小説の「テキストマップ」を見ていきます。テキスト中の単語の出現頻度を大きさで表現することで、視覚的に描写することができるようになります。

1.【問題】このテキストマップが表す小説は何でしょう?

さっそく、WordCloudを使って、テキストマップを6個作ってみました。せっかくなので何の小説をもとにしてテキストマップを作ったのか当ててみてほしいと思います。答えは6つ目の小説のテキストマップの画像の後にまとめていますので、ぜひ当ててみてください!

#1  ヒント:Potter!

 

 

#2 ヒント:アニメ「名探偵コナン」の工藤新一(江戸川コナン)が好きな作家

 

 

#3 ヒント:モーリス・ルブラン作のアルセーヌルパンシリーズ

 

 

#4 アメリカでは有名な冒険のお話

 

 

#5 おそらく、誰もが一度は幼少期に聞いたことのある、有名な童話。

 

 

#6 猫のお話なのに猫という言葉がほとんど出てこないお話

 

 

どの作品を指しているのか、皆さんはわかりましたか?

# 1 〜 6 の答えと、どんな特徴が出ているかの解説していきます。

 

 

#1 ⇒ ハリーポッター「賢者の石」 JKローリング作

原題では「Harry Potter and the Philosopher's Stone」と呼ばれています。ここではハリー、ロン、ハーマイオニー、魔法使い、石、クィレル(第一作目の特徴)といった単語が出ています。ハグリッドという言葉が出てきているのも面白いです。

 

#2 ⇒ シャーロックホームズ シリーズ 「緋色の研究」:コナンドイル作

原題では「A Study in Scarlet」となっています。シャーロックホームズ、探偵、頼んだ、ジェファーソン、ドリッパー、ONE(唯一の)という単語が出てきます。

 

#3  ⇒ アルセーヌルパンシリーズ 「奇岩城」 モーリスルブラン作

フランス語の原題ではL'Aiguille creuseとなっています。英語に翻訳された作品ではThe Hollow Needleとなっています。地名がたくさん出ていますが、針、アルセーヌルパン、レイモンド、Beautreletという単語が特徴です。

 

#4 ⇒ トムソーヤの大冒険 マーク・トウェイン作

トム、少年、小さな、今、逃げろ、叔母、ソーヤ、ポリー、ジョー、ハックという言葉が特徴を持ちます。

 

#5 ⇒ 星の王子様 サン=テグ=チュペリ作

小さな、王子様、星、一つの、羊、星、王様、何も、キツネ、砂漠、といった特徴があります。

 

#6 ⇒ 吾輩は猫である 夏目漱石作

寒月君、東風君、主人は、吾輩は、と云う、先生という特徴がしっかり現れています。

 

2.実際に作ってみよう!

テキストマップをどんなふうに作ったのか、気になると思います。ですので、Lewis Carrollさんの著した「Alice in Wonderland」の小説を題材に、実際に作ってみたいと思います。日本では「不思議の国のアリス」と呼ばれ、親しまれているものです。例えば、「ウサギの道案内」とか「トランプの兵士」とかは有名で、耳にしたことはきっとあるはずです。

利用準備

使用環境:Jupyter Notebook, Python 3.8.8, wordcloud 1.8.1, Windows 11

  1. 小説をダウンロードする
    Alice's Adventures in Wonderland by Lewis Carrollから
    Plain Text UTF-8のFormatを選択して、内容をコピーして、UTF-8形式で保存します。
  2. 文字フォントをダウンロードする
    sanfran/ヒラギノ丸ゴ ProN W4.ttc at master · posteroffonts/sanfranから

「Download」を押して、保存します。

【コード】

#必要なライブラリを読み込む
from wordcloud import WordCloud 
import matplotlib.pyplot as plt 

#ダウンロードした小説のパスを指定して読み込む 
f = open(r"ファイルのPATH",encoding='utf-8') 
text = f.read() 

#連結語句を入れないテキストマップの作成 
WordCloud_Alice_in_wonderland_1 = WordCloud(width = 900,height = 500,background_color='white',colormap='summer',collocations=False,font_path=r"フォントの保存場所").generate(text) 

#連結語句を入れたテキストマップの作成 
WordCloud_Alice_in_wonderland_1 = WordCloud(width = 900, height = 500,background_color='white',colormap='summer',collocations=True,font_path=r"フォントの保存場所").generate(text) 

#連結語句を入れないテキストマップの表示
plt.figure(figsize=(15,12)) 
plt.imshow(WordCloud_Alice_in_wonderland_1) 
plt.axis('off') 
plt.show() 

#連結語句を入れたテキストマップの表示
plt.figure(figsize=(15,12)) 
plt.imshow(WordCloud_Alice_in_wonderland_2) 
plt.axis('off') 
plt.show() 

#それぞれのテキストマップを保存する
WordCloud_Alice_in_wonderland_1.to_file(r"ファイルの保存場所")  
WordCloud_Alice_in_wonderland_2.to_file(r"ファイルの保存場所")

実行した結果

collocations=False(連結語句を入れない)時のテキストマップ

collocations=True(連結語句を入れる)時のテキストマップ

2パターンのテキストマップを作ることができました。今回は、collocations(連結語句)のTrue/Falseでの比較もできるようにしています。連結語句とは、ある単語と単語の”よく使われる組み合わせ、自然な語のつながり”という意味です。

例えば「几帳面」とか「朝飯前」とかのように、文字通りの意味ではないけれどもニュアンスが馴染みのあるもので、会話の際に出てきても違和感を持たない語句をいいます。これをFalseにすると連結語句を考慮されませんが、Trueにすると考慮されます。

collocationsをTrueにするかFalseにするかで、特徴的な単語が異なってくるので少し見てみます。

上の画像および表から分かるように、この連結語句があるかどうかでテキストマップから小説「不思議の国のアリス」という小説を想像しやすいかどうかが大きく変わってきます。これによって、分析した結果のテキスト情報からの示唆が大きく変わるのでcollocationsの設定で変えられることを覚えておきましょう。

3.WordCloudで英語のテキストマップを取り上げた理由

テキストマップをいくつか紹介してきましたが、改めてWordCloudを説明します。

  • WordCloudは、文章中で出現頻度が高い単語を複数選び出し、その頻度に応じた大きさで図示する手法
  • 具体的には、半角の空白を使って形態素という文章の最小単位に分割することで単語を認識する
  • そのうえで単語ごとの頻出率を設定された計算式に沿って計算し、設定した方法に従ってテキストマップと呼ばれる画像を作る

WordCloudは基本的に、半角の空白をもって形態素に分割するので、クイズで出した「吾輩は猫である」のような日本語文だとうまく形態素に分割できません。そのため、半角空白で単語を分割しやすい英語のテキストマップを中心に取り上げてみました。

日本語文を形態素解析するには一工夫が必要になりますが、この方法については別の記事で取り上げげたいと思います。最後まで読んでくださり、ありがとうございました。