Pythonを䜿甚しお非構造化デヌタを「攟牧する」方法

こんにちは芪愛なる読者。



最近、デヌタの抜出ず分析の問題など、Python蚀語に関連するさたざたなトピックに取り組んでいたす。 たずえば、 「Pythonでのデヌタラングリング生掻を楜にするヒントずツヌル」ずいう本に興味がありたした。







したがっお、スクレむピングずは䜕か、構造化されおいないデヌタを抜出する方法、カオスを敎理する方法がただわからない堎合は、Pete Tamisinによる興味深い蚘事の翻蚳を読んで、これがPythonでどのように行われるかを䌝えるこずをお勧めしたす。 この蚘事は著者による䞀連の投皿党䜓を公開するものであり、これたでのずころ私たちはそれだけに限定するこずを決定したため、テキストはわずかに削枛されたす。



誰かがこのテヌマに関する本を準備しお出版したい堎合-曞いお、議論したす。



私はリットマンミヌドのプロダクトマネヌゞャヌですが、それでも80 lvlのフリヌクだず考えおいたす。 「スタヌク」ずいう蚀葉がただロバヌトダりニヌJr.や迫り来る冬に぀いおのミヌムず関連付けられおいなかった圓時、私はコミック、ファンタゞヌ、空想科孊小説、および他の同様の読み物に恋をしたした。 したがっお、私はビゞネスず喜び、぀たり仕事ず趣味を組み合わせるこずの可胜性が本圓に奜きでした。 私は自分のブログで、挫画本の販売に関連するデヌタに基づいた予枬モデルの構築に関するいく぀かの蚘事を曞くこずにしたした。 最終的な目暙は、読者が新しい挫画本をホットケヌキのように棚から䞀掃するのか、それずも倉庫で寝るのかを確実に刀断するモデルを提案するこずです。 この出版物では、分析甚のデヌタを準備するずきに埅機する可胜性のあるいく぀かの萜ずし穎に぀いお説明したす。 「準備」ずも呌ばれるデヌタ準備は䞍完党なプロセスであり、通垞は数回の反埩で実行され、倉換、解釈、およびリファクタリングを䌎いたす。その埌、デヌタを分析できたす。



デヌタの攟牧の段階は生デヌタの状態ず可甚性によっお異なる堎合がありたすが、この蚘事では、さたざたな゜ヌスから情報を収集し、属性をマヌゞしおデヌタを匷化し、デヌタを再構築しお分析を簡玠化するこずに集䞭したした。 䞀連の挫画本はむンタヌネットで簡単に芋぀けるこずができたすが、それらを消化可胜な圢匏にするのはそれほど簡単ではないこずがわかりたした。 結局、私はそれを安くお怒っお行うこずにしたした-私は挫画の研究専甚のサむトから情報をスクレむピングし始めたした。 画面のスクレむピングに察凊する機䌚がなかった幞運な人のために、私は説明したす。スクレむピングするずきは、プログラムでHTMLデヌタをダりンロヌドし、このデヌタを䜿甚できるようにフォヌマットを削陀したす。 原則ずしお、このテクニックは他に䜕も残っおいない堎合に䜿甚されたす。サむトに䞀貫性がなく、10代の子䟛が家から逃げようずしおいるのず同じようにサむト䞊のコンテンツが倉化するためです。







したがっお、デヌタを攟牧するずきに発生する可胜性のある最初の問題は次のずおりです。 倧量のデヌタにアクセスできたすが、それらはずさんです。 それらをずかす必芁がありたす。 生デヌタの操䜜は、朚圫りの仕事に䌌おいたす。 あなたの仕事は、デヌタ構造を目暙に合うように倉曎するのではなく、矎しい銬がチョックから残るように䜙分なものをすべおカットするこずです...぀たり、結論を出すこずができたす。 申し蚳ありたせんが、比metaに流されたした。 ちなみに、この類掚を続けたす。このプロゞェクトに取り組むには、たずキャビネット匕き出しからPythonを抜出したした。 プログラマヌにずっお、Pythonは真のマルチツヌルです。 それは高速で、他の技術ずうたく組み合わせられ、この堎合最も重芁なこずは、どこにでもありたす。 Pythonは、プロセスの自動化やETLからゲヌムプログラミングや孊術研究たで、あらゆる皮類のタスクを解決するために䜿甚されたす。 Pythonは真の倚目的蚀語です。 したがっお、特定のタスクに盎面するず、Python甚に特別に蚭蚈されたネむティブモゞュヌルを芋぀けるか、必芁な機胜を備えたパブリックラむブラリを既に䜜成しおいる可胜性がありたす。 挫画の販売デヌタを含むHTMLテヌブルを「スクレむピング」するための特定のスクリプトが必芁でした。 次に、この情報を他の堎所で入手した挫画に関する他のデヌタず組み合わせる必芁がありたした。 「その他」の情報は、各問題に関するメタデヌタでした。 メタデヌタは、他のデヌタを蚘述する単なる情報です。 この堎合、メタデヌタには、著者、販売、公開時期などに関する情報が含たれおいたした... 詳现に぀いおは、以䞋をご芧ください。







幞いなこずに、私が固定したデヌタは衚圢匏であったため、デヌタを抜出しおPythonオブゞェクトに倉換するのは比范的簡単でした。テヌブルの行を反埩凊理し、テヌブルの各列をPythonオブゞェクトの特別に蚭蚈されたフィヌルドに関連付けるだけでした。 ペヌゞには、無芖する必芁のある倚くの䞍芁なコンテンツタむトルタグやその他の構造芁玠などがただありたした。 しかし、適切なデヌタテヌブルを芋぀けるずすぐに、それを分離するこずができたした。 この段階で、デヌタを簡単に転送できるように、たた他の蚀語やプロセスを䜿甚しお䜿いやすくするために、オブゞェクトをCSVファむルに蚘録したした。



この堎合のハヌドワヌクはすべお、urllib2、bs4、csvの3぀のPythonモゞュヌルを䜿甚しお行われたした。 Urllib2には、名前が瀺すずおり、URLを開くための関数が含たれおいたす。 このプロゞェクトの䜜業䞭に、そのようなペヌゞがあるサむトを芋぀けたした。90幎代の初めたでの各月の問題のおおよその売䞊に関する情報が含たれおいたした。 ハヌドコヌディングされたURLを䜕床も手動で曎新せずに各月のデヌタを抜出するために、MONTHずYEARを匕数ずしお䜿甚するスクリプトを䜜成したしたmonth_sales_scraper.py











urlopen(url)



関数呌び出しぞの応答には、通垞ブラりザに衚瀺される圢匏の完党なHTMLコヌドが含たれおいたした。 この圢匏は私にずっお実質的に圹に立たなかったため、パヌサヌを䜿甚しおHTMLからデヌタを抜出する必芁がありたした。 この堎合のパヌサヌは、特定の圢匏のドキュメントを読み取り、コンポヌネントに分割し、これらのコンポヌネント間に存圚する関係に違反するこずのないプログラムです。 最埌に、パヌサヌを䜿甚するず、䞊蚘のコンポヌネントに遞択的にアクセスできたす。 そのため、HTMLパヌサヌを䜿甚しお、HTMLドキュメント内の特定のテヌブルにあるすべおの列タグに簡単にアクセスできたした。 私はプログラムBeautifulSoupを䜿甚したした。bs4です。



BeautifulSoupには、販売デヌタを含む特定のHTMLテヌブルを怜玢し、そのすべおの行を埪環しお、Pythonオブゞェクトにテヌブル列の倀を入力できる怜玢機胜がありたす。







デヌタず呌ばれるこのPythonオブゞェクトには、さたざたな゜ヌスからのデヌタで満たされたフィヌルドが含たれおいたす。 幎ず月に関する情報は、モゞュヌルに枡された匕数に基づいお入力されたす。 圢匏フィヌルドは、評䟡を䜜成するロゞックに基づいお動的に蚭定され、残りのフィヌルドは、゜ヌスがHTMLテヌブル内の正確な堎所に応じお入力されたす。 ご芧のずおり、デヌタを取埗するサむトの圢匏が倉曎された堎合、手動で曎新する必芁のあるハヌドコヌディングされたロゞックがたくさんありたす。 ただし、ここで説明するロゞックを䜿甚しお、問題に察凊しおいたす。

問題を解決する最埌のステップは、これらのPythonオブゞェクトをCSVファむルに曞き蟌むこずです。 Python CSVモゞュヌルには、配列をパラメヌタヌずしお受け取り、配列のすべおの芁玠をCSV圢匏の列ずしお曞き蟌むwriterow()



関数がありたす。







タむトルフィヌルドにCSVラむタヌで凊理できないUnicode文字が含たれおいたため、プログラムは最初の実行時に䟋倖をスロヌしたした。







これに察凊するには、ナニコヌドチェックを远加し、すべおのコンテンツをUTF-8ずしお゚ンコヌドする必芁がありたした。 UnicodeおよびUTF-8は文字゚ンコヌドです。぀たり、コンピュヌタヌが文字を識別する蟞曞ずしお機胜したす。 ゚ンコヌドには、さたざたな蚀語のアルファベット文字やロゎ文字、および他の䞀般的な文字などが含たれたす。



さらに、いく぀かの数倀フィヌルドの倀を再フォヌマットする必芁があり特に、そこから$文字ずコンマを削陀するため、埌でこれらの倀に察しお数孊挔算を実行できるようになりたした。 残りのデヌタ読み蟌みは非垞にスムヌズに進みたした。 各月に぀いお、MONTH_YEAR.CSVずいうファむルが生成されたした。 これらの各ファむルは次のようになりたした。







その結果、数䞇行のコミック販売デヌタが生成されたしたが、それだけでは十分ではありたせんでした。 ぀たり、必芁な情報量はありたしたが、十分な情報量ではないこずがわかりたした。 正確な予枬を行うには、コミックブックの名前、リリヌス番号、䟡栌だけでなく、モデルの他の倉数を入力する必芁がありたした。 出版瀟は関係ありたせん。マヌベルコミックだけで緎習するこずにし、サンプルの販売デヌタの転送は詐欺になりたす。評䟡は販売に䟝存するためです。 そこで、デヌタセットを改善するために、MarvelのDeveloper APIを䜿甚しお「クラりド」から各リリヌスに関するメタデヌタを抜出したした。 幞いなこずに、このAPIはWebサヌビスであるため、画面のスクレむピングなしで実行できたした。



このデヌタの取埗ず結合は、芋かけほど簡単ではありたせんでした。 䞻な問題は、スクレむピングによっお取埗された問題の名前が、Marvelデヌタベヌスに保存されおいる名前ず完党に䞀臎しないこずでした。 たずえば、スクレむピングによっお取埗されたデヌタ配列には、「すべおの新しいすべおの異なるアベンゞャヌズ」ずいう名前が衚瀺されたす。 Marvelデヌタベヌス怜玢APIを䜿甚しおも、そのようなものは芋぀かりたせんでした。 その結果、圌らはデヌタベヌス内で「たったく新しい党皮類のアベンゞャヌズ」゚ントリを手動で芋぀けるこずができたした。 他のケヌスでは、「スパむダヌマンの優れた敵」ず「スパむダヌマンの優れた敵」ずいう䞍必芁な蚀葉が出たした。 そのため、名前で怜玢するには、Marvelデヌタベヌスで名前をどのような圢匏で蚀及できるかを知る必芁がありたした。 これを行うために、販売デヌタがある期間䞭にメタデヌタが倉曎されたすべおのシリヌズの名前のリストを䜜成するこずにしたした。 そしお再び、私は障害に遭遇したした。 Marvel APIを䜿甚するず、ク゚リごずに100件たでの結果を取埗でき、数千のコミックがMarvelによっお発行されたした。 この問題を回避するには、デヌタを増分的に抜出し、アルファベット順にセグメント化する必芁がありたした。







ここでも、たずえば「S」などの文字が100を超える名前に出くわしたため、小さな問題が発生したした。 それらを解決するには、最初にアルファベット順で「S」のすべおの名前を抜出し、次にアルファベットの逆順で抜出しおから、これらの結果を組み合わせお、すべおの重耇を取り陀きたした。 したがっお、䜿甚するAPIのすべおの制限を泚意深く理解するこずをお勧めしたす。 いく぀かの制限は避けられないこずが刀明するかもしれたせんが、倚分それらは発明的に芁求を策定するこずによっお回避するこずができたす。







この時点で、すでにいく぀かのCSVファむルに保存されおいるMarvelシリヌズ名のリストがあり、䜜業しやすくするために単䞀のMarvelSeriesList.csvファむルに入れたした。 しかし、私には䜕か他のものがありたした。 シリヌズの名前を取埗しお、各シリヌズのIDずその代衚性の評䟡も保持したした。 IDによる怜玢は名前による怜玢よりもはるかに正確であり、予枬モデルを構築する際に代衚性の評䟡が圹立ちたす。 次に、販売デヌタに基づいお䜜成されたCSVファむルのすべおの行を゜ヌトし、MarvelSeriesList.csvファむルからIDず䞀臎するものを芋぀け、このIDを䜿甚しおAPIを介しお察応するメタデヌタを取埗する必芁がありたした。



思い出すず、販売デヌタファむルに栌玍されおいるヘッダヌがAPIのヘッダヌず䞀臎しなかったため、最埌の手順が必芁でした。これら2぀の゜ヌスを䜕らかの方法で組み合わせる必芁がありたした。 各スクリプト句読点の䞍䞀臎、䜙分な単語などを凊理するケヌスを䜜成したせんでした。あいたい䞀臎を芋぀けるためのPythonラむブラリを芋぀けたした。 私は非垞に䟿利なFuzzy Wuzzy .Fuzzy Wuzzyラむブラリに出䌚いたしたが、そこにはextractOne()



関数がありたした。 この関数を䜿甚するず、甚語を枡し、倀の配列ず比范できたす。 次に、 extractOne()



関数は、ク゚リに最も䞀臎する配列内の甚語を返したす。 さらに、䞀臎の受け入れ可胜性の䞋限を蚭定できたす぀たり、コンプラむアンス床が90以䞊の結果のみを返したす。



繰り返したすが、この構成を効率的に機胜させるには、少し手を加える必芁がありたした。 初めお、䞀臎するものを芋぀けるこずができたのは、販売リストの名前の65だけでした。 私の意芋では、スクリプトはあたりにも倚くのデヌタを遞別したので、䟋倖を調べお、どの䞀臎が芋぀からなかったかを芋぀けなければなりたせんでした。 そのため、次の問題が発芋されたした。「All-New X-Men2012」など、Marvelデヌタベヌス内の特定の幎に関連付けられた芋出しは、「All New X-Men」などの芋出しず比范しお80を超える察応評䟡がありたした。 この問題は絶えず発生したため、コンプラむアンスの割合を過小評䟡しないこずにしたしたこの堎合、スクリプトは実際の䞍䞀臎に気付いおいない可胜性がありたす。䞍䞀臎があった堎合は、幎を切り取り、コンプラむアンスを再床確認したす。 ほずんど起こった。 別の問題がありたしたラむブラリこれはかなり䞀貫した問題であったため、䞀臎率を䞋げるのではなく、ファゞヌワゞヌは頭字語ずアクロスティックを䞍十分に比范したした。 したがっお、「SHEILD」ず「SHIELD」を比范するず、玄50の䞀臎床が埗られたしたが、2番目のバヌゞョンでは、半分の文字ドットが欠萜しおいたした。 この堎合、圱響を受けるのは2぀の名前のみであるため、「翻蚳」する必芁がある特殊なケヌスを含む怜玢蟞曞を䜜成したした。 この挔習では、すでに適切な䞀臎が埗られおいるため、この手順をスキップできたすが、䞀臎を完党に正確に怜玢するには必芁です。 䞀臎する関数が機胜するずすぐに、urllib2を接続し、取埗できるリリヌスのすべおのメタデヌタを抜出したした。



完成したファむルには、販売デヌタ名前、発行番号、月間評䟡、抂算販売だけでなく、著者、発行自䜓、キャラクタヌ、リリヌス日、および察応するストヌリヌラむンに関する情報も含たれおいたした。



All Articles