Takashi Unuma's blog.

WordCloud による論文分析

はじめに

学術論文を読む際、タイトルやアブストラクトを一読し、どんな内容か把握することが多い。学術誌によっては、キーワードが書いてあったりするので、それを参考にするのも良いだろう。また、文章内に登場する単語毎の頻度分布を作成し、その頻出する語によって文章の特徴を把握することも可能である。最近では、WordCloud というものが Python ベースで利用可能となってきている。それを応用し、大気科学系の学術誌が出版されたら、URL を入力として論文内の単語を解析、その単語の頻度分布を図化したものとともに X に投稿するといった取り組みをしている方も居るようだ。ただし、XML や plain HTML を入力の想定としている。このため、既に持っている PDF 形式の文章や論文では解析が出来ないという課題があった。そこで、本稿では PDF 形式の文章でも行える WordCloud によるテキストマイニングについて紹介する。

準備

ソースコード

基本的には、こちらを元にした。本家と違うところは、除外する単語のリストを読み込んでいるところと、PDF 形式の文章を pdftotext で TEXT 形式にしているところである。

import os
import re
from glob import glob
import pdftotext
from wordcloud import WordCloud, STOPWORDS
import matplotlib.pyplot as plt

# 除外する単語のリストの設定
exclude_words = list(STOPWORDS)
stopword_files = glob(os.path.join('data/', 'exclude_words/', "*.txt"))
for fname in stopword_files:
    with open(fname, "r") as f:
        exclude_words += f.read().split("\n")
exclude_words = set(exclude_words)

# PDF データの取得 (例として Unuma et al. 2023 をダウンロード)
!wget 'https://www.jstage.jst.go.jp/article/sola/19/0/19_2023-020/_pdf/-char/en' -O test.pdf

# PDF を読み込み、text 整形。
with open("test.pdf", "rb") as f:
    pdf = pdftotext.PDF(f)
text = []
for page in pdf:
    text.append(re.sub('[0-9][0-9]', ' ', page).replace("\n", " "))
text = ''.join(text)
text = re.sub('[0-9]', ' ', text).replace('      ', " ").replace('     ', " ").replace('    ', " ").replace('   ', " ")

# WordCloud による解析・可視化
wordcloud = WordCloud(stopwords=exclude_words, colormap='cividis').generate(text)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.savefig('skewt.png', bbox_inches='tight')

出力結果

図のような結果となる。使っている単語の数が多いものほど単語が大きく表示され、少ないものほど小さくなる。

本当は raindrop size distribution で解析してほしかったのだが、raindrop size と size distribution で分割されてしまっている。ほか、著者名は除外リストに入れたほうが良いかもしれない。

おわりに

PDF 形式の文章でも、Wordcloud を用いてテキストマイニングをする方法について紹介した。

参考文献/URL

更新履歴

  • 2024-01-02: 初稿

— Jan 2, 2024