デヌタ サむ゚ンスでは䜕が問題になるのでしょうか? デヌタ収集

デヌタ サむ゚ンスでは䜕が問題になるのでしょうか? デヌタ収集
珟圚、デヌタサむ゚ンスに関するコヌスは100500侇XNUMX件存圚し、デヌタサむ゚ンス分野で最も収益を䞊げられるのはデヌタサむ゚ンス関連のコヌスであるこずは以前から知られおいたすシャベルが売れるのに、わざわざ掘る必芁はありたせんよね。こうしたコヌスの䞻な欠点は、実際の仕事ずは党く関係がないこずです。適切な圢匏で、クリヌンで凊理枈みのデヌタを提䟛しおくれる人は誰もいたせん。そしお、コヌスを修了し、実際の問題の解決に取り組むず、倚くのニュアンスが浮かび䞊がっおきたす。

そこで、私や友人、同僚に実際に起こった出来事をもずに、「デヌタサむ゚ンスで䜕がうたくいかないのか」ずいうシリヌズを始めたす。デヌタサむ゚ンスの兞型的なタスクを、実際の䟋を甚いお分析し、実際にどのように行われおいるのかを明らかにしたす。今日はデヌタ収集のタスクから始めたしょう。

実際のデヌタに取り組み始めるず、たず最初に぀たずくのは、たさに自分たちにずっお関連性のあるデヌタを収集しおいるずいうこずです。この蚘事のキヌメッセヌゞは次のずおりです。

私たちは、デヌタの収集、クリヌンアップ、準備に必芁な時間、リ゜ヌス、劎力を䜓系的に過小評䟡しおいたす。

そしお最も重芁なこずは、これを防ぐために䜕をすべきかを話し合うこずです。

さたざたな掚定によるず、クリヌニング、倉換、デヌタ凊理、特城゚ンゞニアリングなどが時間の 80  90%、分析が 10  20% を占めおいたすが、ほずんどすべおの教育資料は分析のみに焊点を圓おおいたす。

単玔な分析問題の兞型的な䟋を 3 ぀のバヌゞョンで芋お、「悪化させる状況」がどのようなものなのかを芋おみたしょう。

たた、䟋えば、次のようなデヌタの収集ずコミュニティの比范ずいうタスクの同様のバリ゚ヌションを怜蚎したす。

  1. 2぀のRedditサブレディット
  2. ハブの2぀のセクション
  3. オドノクラスニキの2぀のグルヌプ

理論䞊の条件付きアプロヌチ

サむトを開いおサンプルを読んでみおください。内容が明確であれば、読解に数時間、サンプルのコヌドずデバッグに数時間を確保しおください。さらに、アセンブリに数時間远加しおください。さらに予備ずしお数時間2倍しおN時間を加えおください。

重芁なポむント: 時間の芋積りは、かかる時間に぀いおの仮定ず掚枬に基づいおいたす。

時間分析は、䞊蚘の条件付きタスクの次のパラメヌタの評䟡から始める必芁がありたす。

  • デヌタのサむズはどれくらいですか。たた、物理的に収集する必芁があるデヌタはどのくらいありたすか*䞋蚘参照*。
  • 1 ぀のレコヌドの収集時間はどれくらいですか。たた、2 番目のレコヌドを収集するたでにどれくらい埅たなければなりたせんか。
  • すべおがクラッシュした堎合 (クラッシュするはずではない)、状態を保存しお再起動を開始するコヌドを蚘述したす。
  • 承認が必芁かどうかを刀断し、API アクセスを取埗するのにかかる時間を蚈画したす。
  • デヌタの耇雑さの関数ずしお゚ラヌの数を含め、特定のタスク構造、倉換の数、抜出察象ず方法を評䟡したす。
  • ネットワヌク ゚ラヌや非暙準のプロゞェクト動䜜に関する問題が含たれたす。
  • 必芁な機胜がドキュメントに蚘茉されおいるかどうかを評䟡したす。蚘茉されおいない堎合は、回避策に必芁な方法ず量を評䟡したす。

最も重芁なのは、時間を芋積もるこずです。「実戊偵察」には実際に時間ず劎力を費やす必芁がありたす。そうしお初めお、蚈画は適切なものになりたす。したがっお、「デヌタ収集にどれくらいの時間が必芁か」ずどれだけ蚀われおも、予備分析のための時間を自分で確保し、タスクの実際のパラメヌタによっおどれくらいの時間がかかるのかを議論しおください。

それでは、このようなパラメヌタが倉化する具䜓的な䟋を瀺したす。

重芁なポむント: 評䟡は、䜜業の量ず耇雑さに圱響を䞎える䞻芁な芁因の分析に基づいおいたす。

掚枬に基づく掚定は、機胜芁玠が十分に小さく、タスク構造に倧きな圱響を䞎える芁因がそれほど倚くない堎合には適切なアプロヌチです。しかし、䞀郚のデヌタサむ゚ンスタスクでは、そのような芁因が非垞に倚くなり、このアプロヌチは適切ではなくなりたす。

Redditコミュニティの比范

たずは最も単玔なケヌスから始めたしょう埌ほど詳しく説明したす。正盎なずころ、これはほが理想的なケヌスです。耇雑さのチェックリストを確認しおみたしょう。

  • きちんず敎理され、明確で、文曞化された API がありたす。
  • 非垞に簡単で、最も重芁なのは、トヌクンが自動的に取埗されるこずです。
  • あり Pythonラッパヌ - たくさんの䟋を挙げお。
  • Reddit でデヌタマむニングずデヌタ収集を行うコミュニティ (Python ラッパヌの䜿い方を説明する YouTube ビデオも含む) ここに䟋がありたす.
  • 必芁なメ゜ッドはAPIに存圚する可胜性が高いです。さらに、コヌドはコンパクトで簡朔に芋えたす。以䞋は、投皿ぞのコメントを収集する関数の䟋です。

def get_comments(submission_id):
    reddit = Reddit(check_for_updates=False, user_agent=AGENT)
    submission = reddit.submission(id=submission_id)
    more_comments = submission.comments.replace_more()
    if more_comments:
        skipped_comments = sum(x.count for x in more_comments)
        logger.debug('Skipped %d MoreComments (%d comments)',
                     len(more_comments), skipped_comments)
    return submission.comments.list()

から取られた この ラッピングに䟿利なナヌティリティのコレクション。

これは最良のシナリオですが、考慮すべき重芁な珟実的芁因がただいく぀かありたす。

  • API の制限 - デヌタをバッチで取埗する必芁がありたす (リク゚スト間のスリヌプなど)。
  • 収集時間 - 完党な分析ず比范を行うには、スパむダヌがサブレディットを巡回するのにかなりの時間を確保する必芁がありたす。
  • ボットはサヌバヌ䞊で動䜜させる必芁がありたす。ノヌトパ゜コンで動䜜させおバックパックに入れお、そのたた仕事に取り掛かるわけにはいきたせん。そのため、私はすべおをVPSで動䜜させおいたす。プロモヌションコヌド「habrahabr10」をご利甚いただくず、さらに10%割匕になりたす。
  • 䞀郚のデヌタは物理的にアクセスできない (管理者には衚瀺されるか、収集が困難すぎる) ずいう点を考慮する必芁がありたす。すべおのデヌタを劥圓な時間内に収集できるわけではありたせん。
  • ネットワヌク ゚ラヌ: ネットワヌクは面倒です。
  • これは珟実の生きたデヌタであり、決しおクリヌンなものではありたせん。

もちろん、開発には特定のニュアンスを含める必芁がありたす。具䜓的な時間数日数は開発経隓や類䌌タスクの経隓によっお異なりたすが、ここでは玔粋に゚ンゞニアリング的なタスクであり、゜リュヌションのために远加の身䜓動䜜を必芁ずしないこずがわかりたす。぀たり、すべおを適切に芋積もり、蚘述し、実行できるずいうこずです。

Habrセクションの比范

Habr のストリヌムやセクションを比范する、より興味深く、簡単ではないケヌスに移りたしょう。

耇雑さのチェックリストを確認したしょう。ここでは、各ポむントを理解するために、タスク自䜓を少し調べお実隓する必芁がありたす。

  • 最初はAPIがあるず思うかもしれたせんが、実際にはありたせん。確かにHabrにはAPIがありたすが、ナヌザヌが利甚するこずはできたせんあるいは、そもそも機胜しないかもしれたせん。
  • 次に、HTML の解析を開始したす - 「むンポヌト芁求」、䜕が問題になるでしょうか?
  • 䞀䜓どのように解析するのでしょうか。最も単玔で䞀般的に䜿甚される方法は、ID で反埩凊理するこずです。ただし、これは最も効率的ではなく、さたざたなケヌスを凊理する必芁があるこずに泚意しおください。以䞋は、既存のすべおの ID のうち実際の ID の密床の䟋です。

    デヌタ サむ゚ンスでは䜕が問題になるのでしょうか? デヌタ収集
    から取られた この 蚘事。

  • りェブ䞊でHTMLで囲たれた生デヌタを扱うのは面倒です。䟋えば、蚘事の評䟡を収集しお保存したいずしたす。HTMLからスコアを抜出し、埌続凊理のために数倀ずしお保存するこずにしたす。 

    1) int(score) で゚ラヌが発生したす。Habr では、たずえば行 "-5" のようなマむナスは短いダッシュであり、マむナス蚘号ではありたせん (予想倖ですよね?)。そのため、ある時点で、このようなひどい修正を加えおパヌサヌを埩掻させなければなりたせんでした。

    try:
          score_txt = post.find(class_="score").text.replace(u"–","-").replace(u"+","+")
          score = int(score_txt)
          if check_date(date):
            post_score += score
    

    日付、プラス、マむナスがたったく存圚しない堎合がありたす (䞊蚘の check_date 関数ではこれが圓おはたりたした)。

    2) 保護されおいない特殊文字 - 必ず出珟するので、備える必芁がありたす。

    3) ポストの皮類によっお構造が異なりたす。

    4) 叀い投皿は**奇劙な構造**になっおいる堎合がありたす。

  • 本質的には、゚ラヌ凊理ず、䜕が起こるか起こらないかを凊理する必芁があり、䜕がうたくいかないか、構造は他にどのようなものか、どこで䜕が萜ちるかを確実に予枬するこずは䞍可胜です。パヌサヌがスロヌする゚ラヌを考慮しおみる必芁がありたす。
  • 次に、耇数のスレッドで解析する必芁があるこずがわかりたす。そうしないず、30 ぀のスレッドで解析するず XNUMX 時間以䞊かかりたす (これは、スリヌプ状態であり、犁止されおいない、既に動䜜しおいるシングル スレッド パヌサヌの実行時間のみです)。 この この蚘事は、ある時点で次のような蚈画に぀ながりたした。

デヌタ サむ゚ンスでは䜕が問題になるのでしょうか? デヌタ収集

耇雑さ別の合蚈チェックリスト:

  • ID による反埩ず列挙を䜿甚しお、ネットワヌクず HTML 解析を操䜜したす。
  • 異皮構造の文曞。
  • コヌドが簡単に抜け萜ちおしたう堎所はたくさんありたす。
  • || コヌドを曞く必芁がありたす。
  • 適切なドキュメント、コヌド サンプル、コミュニティが䞍足しおいたす。

このタスクにかかる掚定時間は、Reddit からデヌタを収集する堎合の 3  5 倍になりたす。

オドノクラスニキグルヌプの比范

では、これたで説明した事䟋の䞭で最も技術的に興味深い事䟋に移りたしょう。私にずっおこの事䟋が興味深いのは、䞀芋するず些现なこずに思えるのですが、棒で突いおみるず、党く些现なこずではないこずがすぐに分かるからです。

難易床チェックリストから始めたしょう。それらの倚くは、最初に芋えるよりもはるかに難しいこずに泚意しおください。

  • APIはありたすが、必芁な機胜がほずんど欠けおいたす。
  • 䞀郚の機胜には電子メヌルによるアクセスが必芁であり、アクセスはすぐには蚱可されたせん。
  • ドキュメントがひどく䞍十分ですたず、ロシア語ず英語の甚語があらゆるずころで混圚し、完党に䞀貫性がありたせん。時には、どこかで䜕が求められおいるのかを掚枬する必芁があるだけです。さらに、蚭蚈䞊、デヌタの取埗には適しおいたせん。たずえば、 必芁な機胜.
  • ドキュメントではセッションが必芁ですが、実際には䜿甚されたせん。たた、いろいろ調べお䜕かが機胜するこずを期埅する以倖に、API モヌドの耇雑な郚分をすべお理解する方法はありたせん。
  • 䟋やコミュニティはなく、情報収集の唯䞀のサポヌトポむントは小さな ラッパヌ Python で (䜿甚䟋はあたりありたせん)。
  • 必芁なデヌタの倚くがロックされおいるため、Selenium が最も効率的なオプションであるず思われたす。
    1) ぀たり、架空のナヌザヌ手動登録を通じお認蚌が行われたす。

    2) ただし、Selenium では、正確か぀繰り返し可胜な操䜜が保蚌されたせん (少なくずも ok.ru の堎合は確実です)。

    3) Ok.ru Web サむトには JavaScript ゚ラヌが含たれおおり、動䜜が䞍芏則になったり、䞀貫性がなくなったりするこずがありたす。

    4) ペヌゞネヌションや芁玠の読み蟌みなどを凊理する必芁がありたす。

    5) ラッパヌによっお返される API ゚ラヌは、次のようなハッキヌな方法で凊理する必芁がありたす (実隓的なコヌドの䞀郚)。

    def get_comments(args, context, discussions):
        pause = 1
        if args.extract_comments:
            all_comments = set()
    #makes sense to keep track of already processed discussions
            for discussion in tqdm(discussions): 
                try:
                    comments = get_comments_from_discussion_via_api(context, discussion)
                except odnoklassniki.api.OdnoklassnikiError as e:
                    if "NOT_FOUND" in str(e):
                        comments = set()
                    else:
                        print(e)
                        bp()
                        pass
                all_comments |= comments
                time.sleep(pause)
            return all_comments
    

    私のお気に入りの間違いは次のずおりです:

    OdnoklassnikiError("Error(code: 'None', description: 'HTTP error', method: 'discussions.getComments', params: 
)”)

    6) 最終的には、Selenium + API オプションが最も合理的なオプションのように芋えたす。

  • 状態を保存しおシステムを再起動し、サむトの䞀貫性のない動䜜を含む倚くの゚ラヌを凊理する必芁がありたすが、これらの゚ラヌは想像するのが非垞に困難です (もちろん、プロのパヌサヌ䜜成者でない限り)。

このタスクの条件付き掚定時間は、Habrからのデヌタ収集よりも35倍長くなりたす。Habrの堎合はHTML解析を甚いた総圓たり方匏を採甚し、OKの堎合は重芁な箇所でAPIを䜿甚できるにもかかわらずです。

所芋

倧芏暡なデヌタ凊理パむプラむン モゞュヌルの期限を「その堎で」芋積もる必芁がある堎合でも (今日は蚈画がありたす!)、タスク パラメヌタを分析せずに実行時間を定性的に芋積もるこずはほずんど䞍可胜です。

もう少し哲孊的に蚀えば、アゞャむル芋積もり戊略ぱンゞニアリングのタスクにはうたく機胜したすが、ここで説明した䟋のように、より実隓的で、ある意味では「創造的」で探玢的なタスク、぀たり予枬しにくいタスクでは問題が発生したす。

もちろん、デヌタ収集は単なる分かりやすい䟋に過ぎたせん。通垞、この䜜業は信じられないほど単玔で技術的にも耇雑ではないように芋えたすが、実際には现郚にこそ萜ずし穎が朜んでいるこずが倚いのです。そしお、この䜜業こそが、䜕が問題になる可胜性があるのか​​、そしお䜜業にどれくらいの時間がかかるのか、あらゆる可胜性を瀺すこずができるのです。

远加の実隓をせずにタスクの特性だけをざっず芋るず、RedditずOKは䌌おいるように芋えたす。APIやPythonラッパヌはありたすが、本質的には倧きな違いがありたす。これらのパラメヌタだけを芋るず、Habrの解析はOKよりも耇雑に芋えたすが、実際には党く逆であり、タスクのパラメヌタを分析するための簡単な実隓を行うこずで、たさにそのこずがわかりたす。

私の経隓では、最も効果的なアプロヌチは、ドキュメントを読み、予備分析自䜓ず簡単な最初の実隓に必芁な時間を倧たかに芋積もるこずです。ドキュメントを読むこずで、䜜業党䜓の正確な芋積もりを出すこずができたす。䞀般的なアゞャむル手法に圓おはめるず、「タスクパラメヌタの芋積もり」のチケットを䜜成しおもらうように䟝頌したす。これに基づいお、「スプリント」内で完了可胜な䜜業を芋積もり、各タスクのより正確な芋積もりを出すこずができたす。

したがっお、最も効果的な議論は、「非技術者」の専門家に、ただ評䟡されおいないパラメヌタに応じお時間ずリ゜ヌスがどの皋床倉化するかを瀺す議論であるず思われたす。

デヌタ サむ゚ンスでは䜕が問題になるのでしょうか? デヌタ収集

出所 habr.com

DDoS 保護機胜を備えた信頌性の高いサむト甚ホスティング、VPS VDS サヌバヌを賌入する 🔥 DDoS攻撃察策付きの信頌性の高いりェブサむトホスティング、VPS/VDSサヌバヌを賌入したしょう | ProHoster