wikipeidaからwordcloudを作成する(pythonで情報収集)前編

wikipeidaからwordcloudを作成する(pythonで情報収集)前編



目次

  1. 前回のあらすじ

  2. アルゴリズム

  3. ソースコード




前回までのあらすじ



リンク
wikipedia-python.html
前回はwikipediaへpythonからアクセスする方法を書きました
しかし、ただwikipediaのページにアクセスしてもおもしろくない

なので今回はwikipediaのページから、さらに先のページへと連続的にアクセスして、リンクを深掘りしていきたいと思います!

最終的な目標は、

検索したwikipediaのページを中心にリンクを収集することで、検索ワードを中心にデータを収集し、ワードクラウドを作成する





アルゴリズム



今回のアルゴリズムは以下のようにします

その1:検索ワードからwikipediaのページを取り出す

まずは、wikipediaのapiを使って、wikipediaを検索し、ページを取り出します。
具体的なやり方は以下のサイトで、
wikipedia-python.html
ソースコードのみであれば、以下のような形ですね
    
# coding: UTF-8

import wikipedia
wikipedia.set_lang("ja")

tohomas_page_result = wikipedia.page("きかんしゃトーマス")

print(tohomas_page_result)
    


その2:wikipediaのページのリンクを集める & リンクを配列に追加

wikipedia.page("検索ワード")によって返される"wikipediaPage オブジェクト"には
"links"というプロパティが含まれています
このプロパティにwikipediaページ内のリンクが全て詰め込まれているのです
このプロパティを利用して、wikipedia内のすべてのリンクを集めます。

# coding: UTF-8

import wikipedia
wikipedia.set_lang("ja")

tohomas_page_result = wikipedia.page("きかんしゃトーマス")

all_links = tohomas_page_result.links
print(all_links)



その3:リンク先に移動し、移動先のリンクを配列に追加

知りたいのは検索対象のページだけではありません。
リンク先のページも調査対象に含まれます
ですので先ほど集めたリンクすべてに移動して、さらにリンクを集める必要があるのです




その4:その2、3 を任意の深さまで繰り返す

その2とその3を繰り返し行うことで、一番最初に検索したワードを中心に捜査が伸びていきます
これを繰り返すことで、検索したいワードとその周囲に存在する関連ワードを調べることができるのです




ソースコード




注意
その1:
word_listへリンクを収集していきますが、10000以上のリンクが集まったら捜査を打ち切ります

その2:
再帰処理を行っているので、アルゴリズムは若干複雑です

その3:
clear_linksで年や月のリンクを削除しています

その4:
最終的には、リンク(word)とその数(count)のデータを作成しています

    
# coding: UTF-8

import wikipedia
wikipedia.set_lang("ja")

import collections
import pprint

import json
import os


def clear_links(my_list):
    return_list = []
    print(len(my_list))
    for word in my_list:
        if ("月" not in word) and ("年" not in word) :
            return_list.append(word)
    print(len(return_list))
    
    return return_list



def make_list(word):
    word_list = []

    def extend(word, depth = 2):
        if len(word_list) > 10000:
            return
        depth -= 1
        if depth < 0 :
            return
        try:
            next_links = wikipedia.page(word).links
            next_links = clear_links(next_links)
        except:
            return
        print(depth)
        word_list.extend(next_links )
        for word in next_links:
            extend(word, depth)

        #path = "/home/ec2-user/cmysite/static/cloud/data"
    extend(word)


    c = collections.Counter(word_list)
    new_dict = {}
    for key, value in c.items():
        if value <= 1:
            continue
        new_dict[key] = value


    return new_dict


def build_json(my_dict, path):
    #別スレッドを走らせる

    ys = []
    for key, value in my_dict.items():
        data = collections.OrderedDict()
        data["word"] = key
        data["count"] = value
        ys.append( data )

    
    with open(path,'w') as fw:
        json.dump(ys,fw, ensure_ascii=False)


if __name__ == "__main__":
    build_wiki_json("パーシー_(きかんしゃトーマス)")

    
    




tags

python
API
wikipedia
wordcloud

popular page

プログラミング言語の学ぶ順番について(初心者から中級者へ)後編

Pythonで入門書が終わった後(中級者)に勧めたい技術3選

urllibとbeautifulSoupでtwitterのツイート数,フォロー数,フォロワー数,いいね数,を取得する

another page

wikipediaにpythonからアクセスする

Pythonで入門書が終わった後(中級者)に勧めたい技術3選

ツイッターの自動的なフォローをpythonとseleniumで!(RPA)

CONTACT ME RIGHT NOW!

Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s.

5th Avenue, 987
38399, New York,
USA.

Tel. 9888-4394
Mail. hello@example.com
Skype. ExampleSkype

Your message has been sent. Thank you!

© Copyrights Studio. All Rights Reserved

Created with Studio template by TemplateMag
/* フッター/コピーライトのスタイル指定 */ footer { padding: 40px 16px; } footer .copyright small { color: #868686; font-size: 1.4rem; font-family: "Ubuntu Condensed", sans-serif; letter-spacing: .05em; }