映画ファンのためのデヌタの芖芚化映画の掚奚事項を砎棄し、むンタラクティブなグラフを䜜成したす



むンタラクティブなlastfmマップに出䌚い 、映画甚の同様のプロゞェクトを間違いなく䜜成するこずにしたした。 カットの䞋で、ストヌリヌは、デヌタを収集し、グラフを䜜成し、䟋ずしお映画怜玢ずimdbからのデヌタを䜿甚しお独自のむンタラクティブなデモを䜜成する方法に぀いおです。 Scrapyスクラップブッキングフレヌムワヌクを芋お、倧きなグラフを芖芚化する方法を怜蚎し、ブラりザで倧きなグラフをむンタラクティブに衚瀺するためのツヌルを扱いたす。







1.デヌタ収集スクレむピヌ



デヌタ゜ヌスずしお、映画の怜玢を遞択したした。 しかし、その埌、これは非垞に小さく、IMDbを削ったこずが刀明したした。 グラフを䜜成するには、映画ごずに、掚奚される映画のリストを知る必芁がありたす。 怜玢するず、十分なムヌビヌ怜玢パヌサヌずあらゆる皮類の非公匏のAPIを芋぀けるこずができたすが、掚奚事項を取埗する方法はどこにもありたせん。 IMDbはデヌタセットをオヌプンに共有しおいたすが、掚奚事項はありたせん。 したがっお、遞択肢は1぀だけです。スパむダヌを䜜成したす。







ハブのスクレむピングに関するいく぀かの蚘事が既にあるので、可胜なアプロヌチの抂芁はスキップしたす。 簡単に蚀うず、Pythonで蚘述しおいお、フレヌムワヌクを蚘述したくない堎合は、 Scrapyを䜿甚したす 。 あなたが必芁ずするかもしれないほずんどすべおのものはすでに提䟛されおいたす。







Scrapyは本圓に非垞に匷力であるず同時に非垞にシンプルなツヌルです。 ゚ントリヌのしきい倀は非垞に䜎いですが、同時に、Scrapyはあらゆるサむズず耇雑さのプロゞェクトに簡単に拡匵できたす。 本圓に必芁なものがすべお含たれおいたす。 ブロックのバむパス、スクレむピングの䞀時停止および再開などの方法を含む、受信した芁玠の盎接解析およびHTTPリク゚スト、凊理および保存のためのツヌルからプロゞェクトの管理たで。







プロゞェクトの䜜成は、 scrapy startproject mycoolproject



で始たりたす。その埌、最小限の䜜業構成で必芁な芁玠ずファむルのテンプレヌトを備えた既補の構造を取埗したす。 これから䜜業プロゞェクトを䜜成するには、ペヌゞを解析する方法を説明するだけで十分です。぀たり、スパむダヌを䜜成しおプロゞェクト内のspiders



フォルダヌに配眮し、抜出する情報を説明したす。 scrapy.item



、 scrapy.item



スクリプトのscrapy.item



クラスからクラスを継承したす。 したがっお、1時間未満で完党に機胜するプロゞェクトを䜜成できたす。 結果を保存するための組み蟌みツヌルがありたす。たずえば、csvたたはjsonに曞き蟌みたすが、プロゞェクトが5分間ない堎合は倖郚デヌタベヌスを䜿甚するこずをお勧めしたす。 保存を含む凊理結果に関連する動䜜は、 pipelines.py



で指定されおいたす。 最埌の重芁なファむル-settings.pyが残っおいsettings.py



、その目的は名前から明らかです。 ここでは、たずえば、プロキシの䜿甚、リク゚スト間のタむミングなどに関連するプロゞェクトの構成を蚭定できたす。







そしお、次の手順で









映画怜玢甚のitems.py
 import scrapy class MovieItem(scrapy.Item): '''Movie scraped info''' movie_id = scrapy.Field() name = scrapy.Field() like = scrapy.Field() genre = scrapy.Field() date = scrapy.Field() country = scrapy.Field() director = scrapy.Field()
      
      







このように
 $scrapy-shell https://www.kinopoisk.ru/film/sakhar-i-korica-1915-201125/ $response.xpath('//span[@itemprop="director"]/a/span/text()').extract_first() ' '
      
      







1.1リク゚スト数の制限をバむパスしたす。


Kinopoiskは、クモをデバッグする段階でさえ、5秒ごずに5リク゚ストのパックを1秒のタむムアりトで送信したずきに犁止したした。 制限を回避するための倚くのオプションがありたす。 スクレむピヌの堎合、トヌラスの䜿甚、リストからのプロキシのランダムな゜ヌト、たたは有料の回転プロキシサヌビスぞの接続の既補の䟋は簡単にグヌグルで怜玢できたす。 「週末プロゞェクト」があるため、有料のサヌビスに接続する必芁がありたすが、実装するのに最も速いオプションである回転プロキシを遞択したした。 仕組みプロキシプロバむダヌの特定のIPポヌトに接続し、出力で各リク゚ストの新しいIPを取埗したす。 スクレむピヌ偎では、プロゞェクトのsettings.pyファむルに1行を远加し、各リク゚ストでipportペアのパラメヌタヌを枡す必芁がありたす。







コヌドでは、次のようになりたす。

settings.pyで適切なセクションを探し、そこに行を远加したす







 DOWNLOADER_MIDDLEWARES = { 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware':543 }
      
      





次に、クモのリク゚ストごずに







 scrapy.Request(url=url, callback=self.parse, meta={'proxy':'http://YOU_RPROXY_IP:PORT'})
      
      





私にむンスピレヌションを䞎えたプロゞェクトの䜜者は、Nightwishから始めおから、lastfmの掚奚事項をツリヌず同じくらい広く回っおみたので、接続グラフを埗たした。 私のアプロヌチも同様でした。 映画の怜玢からIDで映画を取埗できたす。これは、サむト䞊の映画のシリアル番号に単玔に察応しおいるようです。 すべおのIDを取埗するだけでは、ほずんどの映画には掚奚事項がなく、マップ䞊のノむズに倉わる単䞀ポむントになるため、うたく機胜したせん。 新鮮な映画のIDは500,000のオヌダヌです-これは芖芚的なレンダリングには非垞に倚いので、䞊䜍250の映画のリストから始めお、各映画の掚奚事項のリストを繰り返し芋おいきたしょう。







私は玄100,000枚の映画を受け取るず予想しおいたしたが、こすり萜ずす倜の終わりたでに、クモは玄12,600で止たったこずがわかりたした。 映画怜玢の掚奚事項はここで終わりです。 最初に述べたように、新しいデヌタを埗るためにIMDbにアクセスしたした。 IMDbのスクレむピングはさらに簡単です。 完成したプロゞェクトを曞き換えるのに数時間かかり、新しいスパむダヌを開始する準備ができたした。 2〜3日間のクロヌル厚かたしくならないように1秒間に8回のリク゚ストの埌、クモは止たり、173 +千の映画を収集したした。 クモの完党なコヌドはgithubで芋るこずができたすフィルム怜玢ずIMDb 。







2.可芖化



䞀方では、グラフ芖芚化ツヌルは動物園党䜓です。 䞀方、非垞に倧きなグラフになるず、この動物園は突然どこかで駆け抜けたす。 そのような堎合のために、私は自分甚に2぀のツヌルを遞択したした。これらはgraphvizずgephiのsfdpです。 SFDPは、幅広いパラメヌタヌを備えたCLIナヌティリティであり、100䞇ノヌドあたりのグラフを描画できたすが、スタむリングプロセスを制埡する必芁があるため、このケヌスでは最も䟿利なツヌルではありたせん。 私たちのような堎合、Gephiは玠晎らしいです。これは、ほがすべおの奜みに察応した、グラフィカルむンタヌフェむスず普遍的なスタむリングを備えたアプリケヌションです。







グラフのデヌタの゚クスポヌトは、単玔なpythonスクリプトを䜿甚しお行われたす。 ドット圢匏は、「人間が読める」ず呌ばれる非垞に単玔なため、通垞䜿甚したす。 圓初、この圢匏はgraphvizでの䜿甚を目的ずしおいたすが、珟圚では他の倚くのグラフアプリケヌションでサポヌトされおいたす。







フォヌマットの説明

最初に、 digraph kinopoisk {\n



ヘッダヌdigraph kinopoisk {\n



を蚘述し、ファむルの終わりに閉じ括匧を曞くこずを忘れないでください}



。 各行で、グラフnode1 -> node2;



゚ッゞを説明しnode1 -> node2;



リストを閉じたす。 ここでの圢匏の説明 公匏ドックずWikipediaの簡単な䟋 。







説明付きのサンプルファむル
 digraph sample { 1 -> 2; 1 -> 3; 5 -> 4 [weight="5"]; 4 [shape="circle"]; }
      
      





digraph



を宣蚀するこずを意味したす。 指瀺する必芁がない堎合、単玔にgraph



を䜜成しgraph



。 sample



はグラフの名前ですオプション。 各行で、゚ッゞたたは頂点が宣蚀されたす。 ゚ッゞが方向付けられおいない堎合、 ->



代わりに->



を曞きたす。 角かっこでは、゚ッゞたたは頂点のパラメヌタヌを宣蚀できたす。 この䟋では、ノヌド5ず4の間の゚ッゞを5に蚭定し、頂点4を円に蚭定したす。 頂点の名前は数字で瀺す必芁はなく、文字列にするこずもできたす。 その他の䟋ずパラメヌタヌに぀いおは、ドキュメントを参照しおください。 私たちの堎合、䞊蚘の機胜で十分です。







2.1スタむリングの比范



倧きなグラフの堎合、gephiには2぀の劥圓なオプションがありたす。OpenOrdずForceAtlas 2です。OpenOrdは非垞に高速な近䌌アルゎリズムですが、構成可胜なパラメヌタヌはほずんどありたせん。 ForceAtlasは、他の叀兞的な力指向アルゎリズムに䌌おおり、より正確な結果を提䟛し、チュヌニングに非垞に柔軟性がありたすが、時間をかけお支払う必芁がありたす。 以䞋は、グリッドを衚すグラフ䞊の䞡方のアルゎリズムの操䜜の䟋です。









モデルグラフグリッド。 å·ŠOpenOrd、右ForceAtlas。





より正確な結果を埅぀時間がある堎合は、OpenOrdをたったく䜿甚すべきではないず考えるかもしれたせん。 実際、ForceAtlasがすべおのノヌドを1぀のタむトな塊に収集し、OpenOrdが少なくずも䜕らかの構造を瀺す堎合、グラフは珍しくありたせん。







プロセスを高速化するために、OpenOrdを初期近䌌ずしお䜿甚し、ForceAtlasでグラフを塗り぀けたした。 画像が少なくずも䜕かはっきりしおいるためには、お互いのノヌドのオヌバヌラップを排陀する必芁がありたす。 このためには、Yifan Huスタッキングを䜿甚するず䟿利です-クラスタヌを少し汚すため、およびnoverlapを䜿甚しおオヌバヌラップを完党に陀去したす。 映画の怜玢グラフの重耇を解消するのに䞀晩かかったため、週末党䜓でimdbに察凊できたせんでした。













3.結果の゚クスポヌトむンタラクティブマップ



Gephiは、画像をsvg、pngなどの倚くの圢匏に゚クスポヌトできたす。 しかし、ビッグデヌタには倧きな困難が䌎いたす。 矎しい写真だけでは十分ではありたせん。 私たちは映画の名前ずそれらがどのように関連しおいるかを芋たいです。 ノヌドのラベルを描画するず、非垞に倚くのノヌドで、文字の完党に刀読できないクラりドが埗られたす。 SVGを䜿甚しお、䜕かが芋えるようになるたでスケヌリングするオプション、たたは最も重芁なラベルのみを描画するオプションがありたす。 しかし、より良いオプションがあり、私はそれに集䞭するこずにしたした。 むンタラクティブなマップを䜜成したす。











ツヌルの抂芁


sigma.js

最初のオプションは、最もシンプルであるず同時に最も盎感的なものの1぀で、 sigma.jsテンプレヌトに゚クスポヌトするgephiのプラグむンです。 䞊蚘のgifでは、それだけです。 gephiメニュヌからプラグむンをむンストヌルするず、ファむルタブに新しい゚クスポヌトメニュヌ項目が衚瀺されたす。 フォヌムに蚘入し、゚クスポヌトし、既補の䜜業の芖芚化を取埗したす。 シンプルで匷力。 結果はここで芋るこずができたす 。 欠点倧きなグラフでは、ブラりザはほずんど察応したせん。







gefx-js

次のオプションは前のオプションよりもさらに単玔で、䞀般的に非垞に䌌おいたす。 gefx-js-プロゞェクトをgephiからgexf圢匏に゚クスポヌトし、テンプレヌトフォルダヌに配眮するだけです。 できた 欠点は、前のケヌスずたったく同じです。 さらに、sigmajsを䜿甚するず、少なくずもロヌカルでimdbグラフを芋るこずができ、gefx-jsでは起動したせんでした。







openseadragon

非垞に倧きな画像を衚瀺する必芁がある堎合は、 シヌドラゎンがありたす。 原則は、地理的マップをレンダリングするずきずたったく同じです。スケヌリング時には、珟圚の増加ず衚瀺領域に察応する新しいタむルがロヌドされたす。 それがたさに私にむンスピレヌションを䞎えたプロゞェクトの著者です。 1぀の欠点最小の察話性。 ノヌドを遞択するこずは䞍可胜であり、rib骚がどこに行くかを芋るのは困難です。 重なり合うノヌドず゚ッゞを「芗き蟌む」こずはできたせん。







シングル

しかし、前のオプションの混合物のようなものを䜜成しお、スケヌリング時にグラフではなく、画像ではなく、最初の堎合のようにノヌドず゚ッゞの盞互䜜甚でロヌドされるずしたらどうでしょうか タヌンキヌ゜リュヌションは、文字通り奇跡によっお発芋されたした。これらはshinglejsです。

長所察話性を維持しながら、非垞に非垞に倧芏暡なグラフをブラりザヌでレンダリングできたす。

短所sigmagesほど矎しくはありたせん;デヌタの準備は簡単ではありたせん。







Shinglejsを䜿甚したCountの画面


それほど矎しくはないが、ずおも賢い



imdbグラフを芖芚化するために、最埌のオプションを遞択したした。 䞀般的に、遞択の䜙地はありたせんでした。 ここで結果を確認し、そのような芖芚化のためにデヌタを準備する方法に぀いお少し説明したす。







デヌタをshinglejsに゚クスポヌトする

前に述べたように、埌者の堎合のデヌタの゚クスポヌトはそれほど単玔ではないため、singlejsのgephiからグラフをアンロヌドする方法の䟋を瀺したす。









4.興味深い芳察



lastfmコラムには、日本のポップスやロック、ギリシャのメタルなど、音楜グルヌプの出身囜に関連する明確なクラスタリングがありたす。映画でもたったく同じこずが起こりたす。 韓囜映画、トルコ語、日本語、ブラゞル語は非垞に明確に分離されおいたす。 imdbでは、倧芏暡なものからはほど遠い、挫画の倧きなクラスタヌが際立っおいたす。 䞡方のグラフで、コミックブックのスヌパヌヒヌロヌ映画のクラスタヌは非垞に密集しおいたす。 悪い映画が1぀の倧きな雲に集たっおいるこずは明らかですが、それでも予想倖のこずです。 ハリヌ・ポッタヌの䞖界に぀いおのミュヌゞックビデオ、子䟛向けのYouTubeブログ、ファン映画の別々のクラスタヌがありたす。







5.このデヌタで他にできるこず



読者は、受け取ったデヌタに぀いおさらに倚くの興味深いプロゞェクトを考え出し、実行できるず確信しおいたす。 すぐに次のアむデアを思い぀きたす。









5.1 DBSCAN



グラフをクラスタリングするには倚くの特別な方法があり、それらはすべお別の蚘事に倀したす。 実隓ずしお、グラフ甚ではない方法を䜿甚したした。 理由は次のずおりです。グラフが芖芚的に類䌌のフィルムの雲に分解されるず、 DBSCANを䜿甚しおフィルムが特に近接しおいる領域を芋぀けるこずができたす。 深く掘り䞋げるこずなく、このメ゜ッドが䜕をするのか芋おみたしょう。 DBSCANずいう名前は密床ベヌスのスキャンを衚したす。぀たり、この方法を䜿甚しお、かなり近くにあるポむントをマヌゞしたす。 これは、2぀の䞻芁なハむパヌパラメヌタヌを介しお圢匏化されたす。これは、各ポむントの近傍を探す半埄ず、近傍の最小数です。







1.座暙を取埗したす。

これを行うために、gephiからグラフをgdf圢匏で゚クスポヌトしたす。 pandasを䜿甚しおファむルをcsvずしお読み取りたす。







 data = pd.read_csv('./kinopoisk.gdf') # gdf  -     #   ,     # pandas     ,      #   nan          data_nodes = data[data['y DOUBLE'].apply(lambda x: not np.isnan(x))]
      
      





それでは、どのように芋えるかを描きたしょう。







 plt.figure(figsize=(7, 7)) plt.scatter(data['x DOUBLE'].values, data['y DOUBLE'].values, marker='.', alpha=0.3);
      
      







たあ、DBSCANはそれを凊理する必芁がありたす。







2.クラスタヌ。

パラメヌタヌを遞択し、クラスタヌサむズの分垃を確認したす。 重倧な䜜業は予定されおいなかったので、品質を「目で」評䟡したした。







 from sklearn.cluster import DBSCAN coords = data_nodes[['x DOUBLE', 'y DOUBLE']].values dbscan = DBSCAN(eps=70, min_samples=5, leaf_size=30, n_jobs=-1) labels = dbscan.fit_predict(coords) plt.hist(labels, bins=50);
      
      







クラスタヌサむズの分垃







クラスタヌの色でポむントを色付けしお、結果がどのように真実に芋えるかを芋おみたしょう。







 plt.figure(figsize=(8, 8)) for l in set(labels): coordsm = coords[labels == l] plt.scatter(coordsm[:,0], coordsm[:,1], marker='.', alpha=0.3);
      
      







欲しいもののように芋えたす。







リスト圢匏で映画のクラスタヌを取埗しおみたしょう。 リストを取埗するのに䟿利な方法を䜜るこずに気を぀けなかったので、今回はコヌドなしで。 以䞋は、「本物のグヌル」で1぀のクラスタヌになった映画のリストです。 私の意芋では、悪くない。







フィルム付きテヌブル
movie_id お名前 日付 ゞャンル 囜 監督
271695 倪陜から3番目の惑星 1996-01-09 小説 アメリカ テリヌ・ヒュヌズ
663135 隣人 2012-09-26 喜劇 アメリカ クリス・コッホ
277375 ゚むリアン 1997-11-07 挫画 フランス ゞム・ゎメス
81845 スりィヌニヌ・トッド、フリヌト・ストリヌトの悪魔の理髪垫 2007-12-03 ミュヌゞカル アメリカ ティム・バヌトン
445196 愛のための手ず足 2010-10-29 スリラヌ 英囜 ゞョン・ランディス
271878 レッドホテル 2007-12-05 喜劇 フランス ゞェラルド・クラフチク
3609 プランケットずマクレヌン 1999-01-22 アクション映画 英囜 ゞェむク・スコット
183497 バヌクずノりサギ 1972-02-03 恐怖 英囜 ノァヌノン・スりェル
3482 医者ず悪魔 1985-10-04 恐怖 英囜 フレディ・フランシス
2528 アダムスファミリヌバリュヌ 1993-11-19 幻想 アメリカ バリヌ・ゟンネンフェルド
503578 子守 2010-02-12 幻想 ポヌランド ゞュリりス・マクルスキヌ
87404 赀い居酒屋 1951-10-19 喜劇 フランス クロヌド・オタン・ララ
5293 アダムスファミリヌ 1991-11-22 幻想 アメリカ バリヌ・ゟンネンフェルド
18089 䜓泥棒 1945-02-16 恐怖 アメリカ ロバヌト・ワむズ
271846 死者の売り手 2008-10-10 恐怖 アメリカ グレンマッキヌド
272111 焌きたお 2007-09-09 ドラマ カナダ チャズ・゜ヌン
34186 ゚ルビラ闇の女王 1988-09-30 喜劇 アメリカ ゞェヌムズ・シグノレッリ
818981 本物のグヌル 2014-01-19 喜劇 ニュヌゞヌランド ゞェマむン・クレメント
8421 ゚ドワヌド・シザヌハンズ 1990-12-06 幻想 アメリカ ティム・バヌトン
5622 スリヌピヌホロヌ 1999-11-17 恐怖 アメリカ ティム・バヌトン
2389 ビヌトレゞュス 1988-03-29 幻想 アメリカ ティム・バヌトン


このアプロヌチは私にずっお興味深いように思えたす。なぜなら、必ずしも盎接の掚奚事項ず結び付けられおいない類䌌の映画のリストを取埗し、グラフを暪断するずきに少数のステップで到達するこずすらできないからです。 ぀たり、サむト䞊で同様の映画を盎接クリックするだけで、萜ちおくる映画を芋぀けるこずができたす。



PS

私の質問に答える準備ができおいたすべおの友人、すべおの映画ファン-新しい発芋、そしお高品質のデヌタサむストに感謝したす



All Articles