統合ゼミ アドベントカレンダー#18「WordCloudで学会講演タイトルを可視化してみた」
1.はじめに
本記事は,統合ゼミ アドベントカレンダー#18の記事です.
本記事では,人工知能学会 言語・音声理解と対話処理研究会の各回の概要ページから講演タイトルを抽出し,講演タイトルのWordCloudを作成を試みます.
WordCloudとは,テキストデータを可視化する手法の1つで,以下の図のようなもののことです.単語の登場頻度が高いほど文字が大きくなっており,重要そうな単語が一目でわかります.
研究会のページのソースを確認していただくと,本文はcodeタグ内にあり,講演タイトルは「1. ○○○○」「2. ××××」...となっていることがわかります.
そのため,まず,requestでHTMLソースを取得し,BeautifulSoupでcodeタグの中身を取り出します.次に,codeタグの中身から講演タイトルを順番に取り出し,形態素解析システム『MeCab』で単語分割します.そして,講演タイトルの全名詞からWordCloudを作成します.
2.形態素解析システム『MeCab』のインストール
以下のページから,MeCabをインストールします.
3.必要なパッケージのインストール
以下のパッケージをpip installします.
pip install requests
pip install bs4
pip install mecab-python3
pip install wordcloud
4.フォントをダウンロード
WordCloudで日本語を扱うには,日本語フォントを用意する必要があります.(日本語フォントがないと文字化けしてしまいます)
日本語フォントであれば,なんでもよいと思いますが,ここでは「Google Fonts」から「Noto Sans Japanese」をダウンロードします.
以下のページにアクセスし,「Download Family」をクリックするとZipファイルがダウンロードされます.ダウンロードが完了したら,Zipファイルを解凍し,「NotoSansJP-Bold.otf」を次章のPythonファイルと同じフォルダ(ディレクトリ)にコピーします.
5.全体のプログラム
プログラムを以下に添付します.
まず,requestでHTMLソースを取得し,BeautifulSoupでcodeタグの中身を取り出します.次に,codeタグの中身から講演タイトルを順番に取り出し,形態素解析システム『MeCab』で単語分割します.そして,講演タイトルの全名詞からWordCloudを作成します.
import requests
from bs4 import BeautifulSoup
import MeCab
from wordcloud import WordCloud
# HTMLのテキストを受け取り,名詞のリストを返す
def get_word(cont):
m = MeCab.Tagger("-Ochasen")
word_list = []
n = 1
for line in cont:
num = str(n) + '.'
if num in line:
text = line[line.find('.')+1:]
node = m.parseToNode(text)
while node:
hinshi = node.feature.split(",")[0]
if hinshi in ["名詞"]:
word = node.feature.split(",")[6]
word_list.append(word)
node = node.next
n += 1
return word_list
# URLからテキスト情報を抽出し,名詞のリストを返す
def get_word_list_from_url(url):
html = requests.get(url)
soup = BeautifulSoup(html.content, "html.parser")
# メインのタグを抽出
cont = soup.find('code')
# タグの要素のみ取り出す
cont = cont.text
# 1行毎にリスト化
cont = cont.split('\n')
word_list = get_word(cont)
return word_list
# 名詞のリストからWordCloudを作成
def save_wordcloud(word_list):
# WordCloudでは単語をスペース区切りにしておく必要があるため
# リストの単語を半角スペースで結合する
words = ""
for word in word_list:
words = words + " " + word
# 日本語フォントのパス
# 日本語用のフォントを用意しておかないとWordCloudにする際に文字化けしてしまう
fpath = "NotoSansJP-Bold.otf"
# WordCloudを作成
wordcloud = WordCloud(background_color="white", font_path=fpath, width=600, height=400, min_font_size=15)
wordcloud.generate(words)
# WordCloudを画像で保存
wordcloud.to_file("./wordcloud.png")
if __name__ == '__main__':
# Webページから抽出する単語のリスト
word_list = []
# URLのリスト
url_list = ["https://jsai-slud.github.io/sig-slud/87th-sig.html",
"https://jsai-slud.github.io/sig-slud/88th-sig.html",
"https://jsai-slud.github.io/sig-slud/89th-sig.html",
"https://jsai-slud.github.io/sig-slud/90th-sig.html",
"https://jsai-slud.github.io/sig-slud/91th-sig.html",
"https://jsai-slud.github.io/sig-slud/92th-sig.html",
"https://jsai-slud.github.io/sig-slud/93th-sig.html"]
# URLのリストから1ページずつ参照し,名詞のリストを取得
for url in url_list:
words = get_word_list_from_url(url)
word_list += words
# WordCloudを作成と保存
save_wordcloud(word_list)
6.作成されたWordCloud
前章のプログラムにより作成されたWordCloudが以下の図です.
対話システムに関する研究が多く発表されている研究会ですので「対話システム」が多いことがわかります.こういった当たり前に登場する単語はあえて除去した方が良いかもしれませんね.
今回は87回から93回の講演タイトルを用いていますが,時系列で単語の変化を追っていくとトレンドみたいなものもわかるかもしれません.
参考サイト
PythonでHTMLを解析してデータ収集してみる? スクレイピングが最初からわかる『Python 2年生』
Pythonで文章中の頻出単語を抽出する方法