Googleサジェスト×PlantUMLでマインドマップの作成

概要

本記事の目的:

Pythonを使用して、Googleサジェスト機能に表示される項目からマインドマップを作成し画像を取得する。
※最終目標はSwiftで作成することなので、細かいところは詰めずに機能のみに着目する。

以下二つの記事で作成した内容をベースにしますので、必要に応じて事前にご確認ください。

GoogleのサジェストAPIとは?Pythonのrequestsを使って取得する方法
Googleの予測検索機能をHTTP GETで取得し、XML形式データから必要なデータを抽出するところまでのPythonコードを説明します。
PlantUMLを使ってPythonでマインドマップを作成する方法
UML図などの作成に有用なPlantUMLをPythonを利用して実行し、作成した図を画像として取得する方法について解説します。

PlantUMLでマインドマップ

入力

PlantUMLでマインドマップを作成する場合は

  • @startmindmap@endmindmap で囲む
  • 要素は「*」で示す(マインドマップの階層は「*」の数で変更する)
  • 要素に色をつける場合は「*」の後に「[#HEX]」で示す
@startmindmap
*[#1FA808] 野菜
**[#E1D48E] じゃがいも
**[#FFCCAA] にんじん
@endmindmap

上記のような入力でマインドマップを作成した場合の画像は以下のリンク先のようになります。

http://www.plantuml.com/plantuml/png/SoWkIImgoStCIybDBE3IYbOsT7EqCB28LNZPtlUYVmwN5b38rT35nC8rLk5nuup7JSsF6tiUDxOyRce2oxcvEJixEeBaLZzkcWnMCPdB8JKl1Mea0000

Googleサジェスト機能との組み合わせ

GoogleのサジェストAPIとは?Pythonのrequestsを使って取得する方法
Googleの予測検索機能をHTTP GETで取得し、XML形式データから必要なデータを抽出するところまでのPythonコードを説明します。

↑で作成したクラスを使用します。
上記クラスを使用して取得できるサジェスト候補を複数回実行することで以下のように整理していこうと思います。

  • 階層1→「入力1」のサジェスト結果:「候補1」、「候補2」、…
  • 階層2→「候補1」のサジェスト結果:「候補1-1」、「候補1-2」、…
  • 階層2→「候補2」のサジェスト結果:「候補2-1」、「候補2-2」、…

実装

● サジェスト結果をいくつ取得するか:候補数
● 階層をいくつにするか:分岐数
from getautocomplete import *

# User Setting
candidates = 3
branches = 4
keyword = "キーワード"

# Default
str = '''
@startmindmap
'''

# Init
gac = GetAutoComplete()

query = keyword
dict = {'1' : "* " + query}

for branch in range (branches):
    dict_add = {}

    for key in dict:
        pattern = '1' + '_[0-{}]'.format(candidates)*branch
        if re.compile(pattern).fullmatch(key):
            res = gac.get_responce(dict[key])
            res_xml = gac.responce_to_xml(res)

            for candidate in range(candidates):
                # 取得できた候補の数が指定した数よりも少ない場合はスキップ
                if candidate >= len(res_xml):
                    break
                dict_add[key+'_{}'.format(candidate)] = "*" * (branch+2) + " " + res_xml[candidate] + " "
    dict.update(dict_add)

for s in sorted(dict.items()):
    str +=  (s[1] + '\n')

str += '@endmindmap\n'
  • 17行目:取得した検索結果は辞書型変数に格納します。
    • 「1_1:候補1」、「1_1_1:候補1-1」のように数字と候補を格納して行くことで、PlantUMLの入力形式に整形する際に処理が楽になります
  • 32行目: 取得した候補データの値に対して、階層に応じて「*」を追加します。
  • 35-36行目:検索候補を辞書型変数のkeyに基づいてソートします。

一連の処理でstrにはPlantUMLの入力データが格納されます。

画像の取得

PlantUMLを使ってPythonでマインドマップを作成する方法
UML図などの作成に有用なPlantUMLをPythonを利用して実行し、作成した図を画像として取得する方法について解説します。

あとはHTTP GETメソッド(に対応したライブラリ)を使用してPlantUMLのオンラインサーバから画像を取得するのみです。

先ほど作成したソースの適切な場所に以下を追記します。

from makemindmap import *

# User Setting
filename = "img.png"

# Init
mmm = MakeMindMap()

# 最後
mmm.deflate(str)
mmm.get_image(filename)

これで #User Settingの項目を自由に変更することで、検索候補を使用したマインドマップが取得できます。

まとめ

import re
from numpy import size

from getautocomplete import *
from makemindmap import *

# DEBUG
import pprint

# User Setting
candidates = 3
branches = 4
keyword = "キーワード"
filename = "img.png"

# Default
str = '''
@startmindmap
'''

# Init
gac = GetAutoComplete()
mmm = MakeMindMap()

query = keyword
dict = {'1' : "* " + query}

for branch in range (branches):
    dict_add = {}

    for key in dict:
        pattern = '1' + '_[0-{}]'.format(candidates)*branch
        if re.compile(pattern).fullmatch(key):
            res = gac.get_responce(dict[key])
            res_xml = gac.responce_to_xml(res)

            for candidate in range(candidates):
                # 取得できた候補の数が指定した数よりも少ない場合はスキップ
                if candidate >= len(res_xml):
                    break
                dict_add[key+'_{}'.format(candidate)] = "*" * (branch+2) + " " + res_xml[candidate] + " "
    dict.update(dict_add)

for s in sorted(dict.items()):
    str +=  (s[1] + '\n')

str += '@endmindmap\n'

mmm.deflate(str)
mmm.get_image(filename)

最終的な目標はSwiftでアプリ化することなので、細かいところまでは詰めていませんが、一連の機能としては実装できていることを確認しました。

PlantUMLでは様々な図をわかりやすい入力形式で作成できるので、ぜひ応用してみてください。

コメント