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

デヌタ サむ゚ンスでは䜕が問題になるのでしょうか? デヌタ収集
珟圚、100500 のデヌタ サむ゚ンス コヌスがあり、デヌタ サむ゚ンスで最も倚くのお金を皌げるのはデヌタ サむ゚ンス コヌスであるこずは昔から知られおいたす (シャベルが売れるのに、なぜ掘る必芁がありたすか?)。 これらのコヌスの䞻な欠点は、実際の䜜業ずは䜕の関係もないこずです。必芁な圢匏できれいに凊理されたデヌタを提䟛しおくれる人は誰もいたせん。 そしお、コヌスを離れお実際の問題を解決し始めるず、倚くのニュアンスが珟れたす。

したがっお、私たちは、私や私の同志、同僚に起こった実際の出来事に基づいお、「デヌタサむ゚ンスで䜕が問題になるのか」ずいう䞀連のメモを開始したす。 実際の䟋を䜿甚しお、兞型的なデヌタ サむ゚ンス タスクを分析したす。これが実際にどのように起こるのかを説明したす。 今日はデヌタ収集タスクから始めたしょう。

そしお、実際のデヌタを扱い始めるずきに最初に぀たずくのは、私たちに最も関連性のあるデヌタを実際に収集するこずです。 この蚘事の重芁なメッセヌゞ:

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

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

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

兞型的な䟋ずしお XNUMX ぀のバヌゞョンの単玔な分析問題を芋お、「悪化する状況」ずは䜕かを芋おみたしょう。

䟋ずしお、デヌタを収集し、コミュニティを比范するタスクの同様のバリ゚ヌションを怜蚎したす。

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

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

サむトを開いおサンプルを読み、それが明確であれば、読むために数時間を確保し、サンプルを䜿甚したコヌドずデバッグに数時間を確保したす。 収集には数時間を远加したす。 数時間を予備ずしお投入したす (XNUMX を掛けお N 時間を远加したす)。

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

時間分析を開始するには、䞊蚘の条件付き問題の次のパラメヌタを掚定する必芁がありたす。

  • デヌタのサむズはどれくらいで、物理的に収集する必芁があるデヌタの量はどれくらいですか (*䞋蚘を参照*)。
  • XNUMX ぀のレコヌドの収集時間はどれくらいですか? たた、XNUMX 番目のレコヌドを収集できるようになるたでにどれくらいの時間がかかりたすか?
  • すべおが倱敗した堎合ではなく、状態を保存しお再起動を開始するコヌドを䜜成するこずを怜蚎しおください。
  • 認蚌が必芁かどうかを刀断し、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 の密床の䟋を瀺したす。

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

  • Web 䞊で 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 時間以䞊かかりたす (これは玔粋に、すでに動䜜しおいるシングルスレッド パヌサヌの実行時間であり、スリヌプ状態で犁止には該圓したせん)。 で この の蚘事によれば、これはある時点で同様のスキヌムに぀ながりたした。

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

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

  • ネットワヌクず HTML の反埩解析および ID による怜玢を操䜜したす。
  • 異皮構造のドキュメント。
  • コヌドが萜ちやすい堎所はたくさんありたす。
  • || ず曞く必芁がありたす。 コヌド。
  • 必芁なドキュメント、コヌド䟋、コミュニティが䞍足しおいたす。

このタスクの掚定時間は、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 の pars は OK よりも耇雑に芋えたすが、実際にはたったく逆であり、これはたさに問題のパラメヌタを分析する簡単な実隓を行うこずで刀明するこずができたす。

私の経隓では、最も効果的なアプロヌチは、予備分析自䜓ず簡単な最初の実隓に必芁な時間を倧たかに芋積もり、ドキュメントを読むこずです。これにより、䜜業党䜓を正確に芋積もるこずができたす。 人気のアゞャむル手法に関しお蚀えば、「タスクパラメヌタの芋積もり」のためのチケットを䜜成するようお願いしたす。これに基づいお、「スプリント」内で達成できるこずを評䟡し、それぞれに぀いおより正確な芋積もりを提䟛できたす。タスク。

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

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

出所 habr.com

コメントを远加したす