最近、広大なインターネットを散策していると、 Chris Harrisonの驚くべき作品に出会い、少しショックを受けて、「Wikipediaを視覚化するのは難しいのか」と思い、試してみることにしました。
それでは始めましょう!
デバイスとツール
最初のステップは、視覚化する対象を決定し、その意味を使用することです。 そして、私の選択が次の手段にどのように当てはまるかを少し勉強しました。
Wiki APIの開発者はそれをうまく説明したので、説明を逐語的に翻訳して、1つまたは別のメソッドを呼び出す方法を理解しないでください。
Graphvizパッケージについて既に書いたhabrで、それを再度説明する必要はないと思います。 しかし、私はすぐにドット言語の説明を読み、 graphvizツールはほとんど.dotファイルの形成を書き始めました。
PyGraphvizと呼ばれるpythonモジュールに助けられました。これにより、グラフ構造を簡単に操作でき、それが.dotファイルに書き込まれます。
基本
そのため、クロスウィキペディアの記事を視覚化します。 これを行うには、参照によってメソッドを呼び出す必要があります。
ru.wikipedia.org/w/api.php?action=query&format=xml&titles=_&prop=links
ここで、 actionはメソッドのタイプ、 formatは出力応答フォーマット、この場合はXML、 propです -クロスリンクをリクエストします
出力では、次の答えが得られます。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- < API >
- < クエリ >
- < 正規化 >
- < n from = "Habrahabr" to = "Habrahabr" />
- </ 正規化 >
- < ページ >
- < page pageid = "340809" ns = "0" title = "Habrahabr" >
- < リンク >
- < pl ns = "0" title = "2006" />
- < pl ns = "0" title = "2006" />
- < pl ns = "0" title = "2007" />
- < pl ns = "0" title = "Digg.com" />
- < pl ns = "0" title = "Linux.org.ru" />
- < pl ns = "0" title = "News 2.0" />
- < pl ns = "0" title = "Newsland" />
- < pl ns = "0" title = "Pligg" />
- < pl ns = "0" title = "Slashdot" />
- < pl ns = "0" title = "URL" />
- </ リンク >
- </ ページ >
- </ ページ >
- </ クエリ >
- < クエリ継続 >
- < リンク plcontinue = "340809 | 0 |ブログ" />
- </ query-continue >
- </ API >
DOMまたはSAXメソッドを使用して処理されます。
プログラミング
そのため、処理にはSAXを使用し、xml.sax.handler.ContentHandlerからクラスを継承しました。
class LinksListHandler(xml.sax.handler.ContentHandler):
次に、メインコールが再定義されます。
- startElement
- endElement
リクエストを処理する手順は次のとおりです。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- def get_links(ページ):
- #wiki APIドキュメントhttp://en.wikipedia.org/w/api.phpを参照
- query_val = { 'action' : 'query' 、
- 'prop' : 'リンク' 、
- 「タイトル」 :ページ、
- 'format' : 'xml' }
- url = wiki_url()+ '?' + urllib.urlencode(query_val)
- リクエスト= urllib2.Request(url)
- verbose_message( "Wiki url:" + url)
- 試してください :
- 応答= urllib2.urlopen(要求)
- urllib2.HTTPErrorを除く:
- 「HTTP要求エラー!」を出力します
- sys.exit(1)
- #verbose_message( "Response xml:\ n" + response.read())
- lh = LinksListHandler()
- saxparser = xml.sax.make_parser()
- saxparser.setContentHandler(lh)
- saxparser.parse(応答)
- lh.linksを返す
グラフ構築
PyGraphvizモジュールを使用すると、作業は非常に簡単です。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- def make_wiki_graph(wiki_page、depth):
- gv = AGraph()
- page_list = [wiki_page]
- temp_list = []
- verbose_message( 'グラフ作成' + wiki_page)
- pageLinks = get_links(wiki_page)
- gv.add_node(wiki_page)
- 範囲内のi(深さ):
- print '>>>> Get' + str(i)+ 'level'
- page_listのページの場合:
- list = get_links(ページ)
- node = gv.get_node(ページ)
- node.attr [ 'fontsize' ] = "%i" %(MIN_FONT * 2 *(深さ-i))
- リスト内のリンク:
- verbose_message(ページ+ "=>" +リンク)
- gv.add_edge(ページ、リンク)
- temp_list.append(リンク)
- page_list = temp_list
- temp_list = []
- gvを返す
結果
ネストの4つのレベルを持つ数学の記事
5レベルのネストを持つ記事「Habrahabr」
その他:
ソクラテス
Habrahabr 3レベル
その他の例