WIKI使用して、WIKI使用してください!

こんばんは親愛なる友人!



最近、広大なインターネットを散策していると、 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です -クロスリンクをリクエストします



出力では、次の答えが得られます。





  1. < API >
  2. < クエリ >
  3. < 正規化 >
  4. < n from = "Habrahabr" to = "Habrahabr" />
  5. </ 正規化 >
  6. < ページ >
  7. < page pageid = "340809" ns = "0" title = "Habrahabr" >
  8. < リンク >
  9. < pl ns = "0" title = "2006" />
  10. < pl ns = "0" title = "2006" />
  11. < pl ns = "0" title = "2007" />
  12. < pl ns = "0" title = "Digg.com" />
  13. < pl ns = "0" title = "Linux.org.ru" />
  14. < pl ns = "0" title = "News 2.0" />
  15. < pl ns = "0" title = "Newsland" />
  16. < pl ns = "0" title = "Pligg" />
  17. < pl ns = "0" title = "Slashdot" />
  18. < pl ns = "0" title = "URL" />
  19. </ リンク >
  20. </ ページ >
  21. </ ページ >
  22. </ クエリ >
  23. < クエリ継続 >
  24. < リンク plcontinue = "340809 | 0 |ブログ" />
  25. </ query-continue >
  26. </ API >
*このソースコードは、 ソースコードハイライターで強調表示されました。




DOMまたはSAXメソッドを使用して処理されます。



プログラミング



そのため、処理にはSAXを使用し、xml.sax.handler.ContentHandlerからクラスを継承しました。

class LinksListHandler(xml.sax.handler.ContentHandler):





次に、メインコールが再定義されます。





リクエストを処理する手順は次のとおりです。





  1. def get_links(ページ):
  2. #wiki APIドキュメントhttp://en.wikipedia.org/w/api.phpを参照
  3. query_val = { 'action''query'
  4. 'prop''リンク'
  5. 「タイトル」 :ページ、
  6. 'format''xml' }
  7. url = wiki_url()+ '?' + urllib.urlencode(query_val)
  8. リクエスト= urllib2.Request(url)
  9. verbose_message( "Wiki url:" + url)
  10. 試してください
  11. 応答= urllib2.urlopen(要求)
  12. urllib2.HTTPErrorを除く:
  13. 「HTTP要求エラー!」を出力します
  14. sys.exit(1)
  15. #verbose_message( "Response xml:\ n" + response.read())
  16. lh = LinksListHandler()
  17. saxparser = xml.sax.make_parser()
  18. saxparser.setContentHandler(lh)
  19. saxparser.parse(応答)
  20. lh.linksを返す
*このソースコードは、 ソースコードハイライターで強調表示されました。




グラフ構築



PyGraphvizモジュールを使用すると、作業は非常に簡単です。





  1. def make_wiki_graph(wiki_page、depth):
  2. gv = AGraph()
  3. page_list = [wiki_page]
  4. temp_list = []
  5. verbose_message( 'グラフ作成' + wiki_page)
  6. pageLinks = get_links(wiki_page)
  7. gv.add_node(wiki_page)
  8. 範囲内のi(深さ):
  9. print '>>>> Get' + str(i)+ 'level'
  10. page_listのページの場合:
  11. list = get_links(ページ)
  12. node = gv.get_node(ページ)
  13. node.attr [ 'fontsize' ] = "%i" %(MIN_FONT * 2 *(深さ-i))
  14. リスト内のリンク:
  15. verbose_message(ページ+ "=>" +リンク)
  16. gv.add_edge(ページ、リンク)
  17. temp_list.append(リンク)
  18. page_list = temp_list
  19. temp_list = []
  20. gvを返す
*このソースコードは、 ソースコードハイライターで強調表示されました。


結果



ネストの4つのレベルを持つ数学の記事

画像

5レベルのネストを持つ記事「Habrahabr」

画像



その他:

ソクラテス

Habrahabr 3レベル



その他の例

スクリプト自体




All Articles