「これは彼らの書斎のコンピューターからエクスポートされたデータです。まずは手がかりが見つかるかどうかを確認してください。それから私は何人かの人を探しに行き、質問します。」
チーム ワンUSBフラッシュドライブを私に投げると、彼は弁当箱を手に取り、そこにご飯を数口詰め、帽子を拾って足早にオフィスから出て行った。
今夜、情報に基づいて、私たちは逮捕作戦を実行するためにMLMの巣窟に行き、十数人を連れ戻しました。
しかし、現場では重要な証拠は発見されず、逮捕された数名は黙秘を続けており、彼らが他に巣窟を持っているかどうかを知る方法はなく、情報提供者が誰でどこにいるのかも分かりません。 . しばらく行き詰まりました。
今私の手にある文書が状況打開の鍵となるかもしれない。
私は、この人のリストを観察し始めました。invitation_id フィールドは繰り返されておらず、その人の名前と 1 対 1 の関係があるはずです。一方、invited_id は繰り返されています。たくさんあり、基本的にはinvitation_idに現れたデータです。
したがって、これは基本的に、MLM 組織のアップラインとダウンラインの関係を記録したリストであると推測できます。これが大規模な犯罪組織であることを示すデータが数百件あります。
1 時間も経たないうちに、王チームが戻ってきました。
「だめです、私はまだ口下手です。」王大尉は椅子に座り、時刻をちらっと見た、もうすぐ12時だった。 「そのデータをどのように調べていますか? 何か手がかりは見つかりましたか?」
「これは非常に大きな組織で、メンバーは合計で数百人います。私たちは今氷山の一角を捉えているだけかもしれません。」
「あなたの言う通りですが、このような状況のため、今すぐ急ぐ必要があります。」チーム・ワンは私のワークステーションに歩いて行きました、「私たちの現在の任務は、まず彼らの上層部を見つけて泥棒を捕まえることです。まず王を捕まえることです。」 「しかし、今夜捕らえられた人々は誰も何も見つけられません。彼らの身元は特定できますが、当分の間、彼らの間の関係は特定できません。」
「彼らの間の関係は何ですか?」突然、少し前に見たnetworkx Pythonライブラリを思い出したので、今回役立つかもしれません。 「任せてください。5 分ほどお待ちください。」
まず、パンダを使用してファイル内のデータをインポートし、必要な部分をフィルターで除外します。
df = pd.read_excel('./doc/1_evidence.xls') df = df.loc[:, ['id','name','invite_id','invited_id']] df.columns = ['id','title','to', 'from']
次に、networkx ライブラリを呼び出して、階層関係図をエクスポートしてエクスポートします:
G = nx.from_pandas_edgelist(df, 'from', 'to', create_using=nx.DiGraph()) nt = net.Network('960px', '1280px', directed=True) nt.from_nx(G) nt.show('1_evidence.html')
このようにして、この文書に対応する階層関係図を取得します。上の行と下の行の関係がすぐにわかります:
王チームの顔は一瞬にして喜びに満ち溢れましたが、すぐに真剣な表情に戻りました。「これはちょっと派手ではないでしょうか? 感覚的にはわかりますが、この組織のトップが誰かわかりますか?」 ?"
これは確かに私にとっては問題ではありません。最上位はグラフ内のネットワークのルート ノードです。それを指す他の点があってはなりません。そのため、すべてのノードをたどって次のノードを見つけるだけで済みます。入次数が 0 の点。
# 找到根节点 top_node = [] for node, degrees in G.in_degree(): if degrees == 0: top_node.append(node) print('Big Boss:', top_node)
「Big Boss: [100000]」 この出力が画面に表示されます。 「表には 100000 という番号に対応する人物がいませんが、100000 の下には 162385 という番号を持つオフラインの人物が 1 人だけいます。彼がこの組織のリーダーであるはずです。」
「はい、これが何ですか「欲しいです! 取りに行きます。他の同僚がこの人物に関する情報を探している場合、あなたはデータの研究を続けて、この人物に近い人をすべて見つけ出すことになります!」
これは禁止されています。ルート ノードが見つかったので、すべてのノードが配置されているレイヤーの数を取得できます。
# 设置所有节点级别 l = nx.shortest_path_length(G, 100000) nx.set_node_attributes(G, l, 'level') # 计算每级人员数目 data = {} for node, level in l.items(): if level in data.keys(): data[level].append(node) else: data[level] = [node] for level, nodes in data.items(): print(level, len(nodes))
この組織は 36 レベルにまで発展しました。それを考えると本当に汗がかきます。幸運なことに、同僚が時間内にそれを発見しました。
次に、観察しやすいようにレベルに応じてノードに色を付けます。
# 添加颜色 for node in G.nodes: G.nodes[node]['title'] = str(node) level = G.nodes[node]['level'] if level == 0: G.nodes[node]['color'] = 'red' elif level == 1: G.nodes[node]['color'] = 'orange' elif level == 2: G.nodes[node]['color'] = 'yellow'
番号 162385 の人はオフラインが 2 つだけで、それぞれがオフラインであることがわかります。これら 2 つのダウンラインにより、さらに数十のダウンラインが開発されました。これについて考えると非常に興味深いです。
「見つかった!」 王チームはオフィスのドアを開けました。 「その人は見つかりました。今夜逮捕された人々の中に、彼の部下2人も中にいました。彼らもまた、全員がそれを認めました」このリストのおかげで、実際の状況は私の推測と完全に一致しているようです。
「今夜はよく頑張りました!」王大尉がやって来て私の肩をたたきました。 「しかし、それはまだ終わっていません。彼らの自白によれば、ファイルには彼らの組織のすべての人事情報が含まれています。これで、彼らが最も育成した人材を私に見つけることができます。そして、私たちはその情報に基づいて即座に標的を絞った逮捕を手配します。」
これは前のものと似ていますが、今回はすべてのノードの出次数を走査し、それらを逆順に並べ替えて、最初の数個だけを取得する必要があります。
# 给下线前十的目标添加颜色 degrees = G.out_degree() top_nodes = sorted(degrees, key=lambda x: x[1], reverse=True)[:10] print(top_nodes) for node in top_nodes: G.nodes[node[0]]['color'] = 'green'
然后给目标节点加上颜色,方便观察,最终得到了这样的关系图:
“干得不错,只要再把这几个人抓到,就相当于切断了这个组织的大动脉,后面的慢慢收尾就可以了。”王队把文件合上,笑着对我说。“没想到你还有这本事,真是后生可畏啊!”
“今天抓到的那三条大鱼,现在审出什么结果了?”相对于其他,我还是对案情本身更感兴趣。
“别提了,都快笑死我了。这仨人看见证据直接慌了神,开始互相推卸责任,老大说同伙全是另外两个人拉来的他都没参与,另外俩人说骗局全是老大策划的他们就是手下打工的,现在估计还吵着呢...”
以上がこのPythonライブラリを学んだおかげで、ねずみ講を一晩で撲滅できました…。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。