大量データのための2次パーソナルコネクションマイニングアルゴリズム(Hadoop実装)

大量データのための2次パーソナルコネクションマイニングアルゴリズム(Hadoop実装)

私は最近、Sina Weibo の「あなたに興味があるかもしれない人々」の間接的なフォローアップ推奨のように、2 次接続の関係をいくつか見つけ出す必要のあるプロジェクトに取り組みました。簡単な説明は次のとおりです。フォローしている N 人の人が XXX もフォローしています。

プログラムの実装で実際に探しているのは、User1 が 10 人のユーザー {User3、User4、User5、...、User12} をフォローしていて、セット UF1 として記録されている場合、UF1 のこれらのユーザーもフォロー セットを持ち、UF3 (User3 がフォローしているユーザー)、UF4、UF5、...、UF12 として記録されます。また、これらのセットの間には共通部分があり、ほとんどのセットの共通部分によって生成される共通部分こそが、探しているもの、つまり関心のある人々です。

2 次接続アルゴリズムの実装に関する情報をオンラインで検索しました。そのほとんどは、幅検索アルゴリズムを検索するだけで、ためらいの深さは 2 以内であると判断されています。このアルゴリズムは実際には非常に簡単です。最初のステップは、フォローしている人を見つけることです。2 番目のステップは、これらの人がフォローしている人を見つけることです。最後に、2 番目のステップの結果で最も頻繁に表示される 1 人以上の人を見つければ完了です。

しかし、他のユーザーがいる場合、計算中にこれらのユーザーのフォロー関係が必ずメモリに格納され、計算中に順番に検索されます。まず、明確な診断比較がなく、その効果はHadoopに基づくものほど良くないことを説明する必要があります。私はHadoopを使用して実装したいだけで、最近も学習しています。不備があれば、指摘してください。

まず、初期データはファイルであり、各行は ida+'\t'+idb という関係に従います。つまり、ida は idb に従います。次に、2 つの Map/Reduce タスクが使用されました。

Map/Reduce 1:任意のユーザーのフォロー セットとフォロー セットを検索します。図に示すように:

コードは次のとおりです。

マップタスク: 出力キー: 間接アクターAのID、値: フォロワーまたはフォローされている人のID

  1. 公共  void map(テキストキー、IntWritable値、コンテキストコンテキスト)IOException、InterruptedExceptionをスローします{
  2.         戻り値:
  3.          // 2つのユーザーIDを分割する 
  4. 文字列[] _key = Separator.CONNECTORS_Pattern.split(key.toString());
  5.          _key.length == 2 の場合{
  6.              // 「f」プレフィックスはフォローを意味し、「b」プレフィックスはフォローを意味します 
  7. context.write(新しいテキスト(_key[ 0 ])、新しいテキスト( "f" + _key[ 1 ]));
  8. context.write(新しいテキスト(_key[ 1 ])、新しいテキスト( "b" + _key[ 0 ]));
  9.               
  10.               
  11. }
  12. }

削減タスク: 出力キー: 間接アクター A の ID、値は 2 つの文字列で、最初の文字列はフォローしているすべての人々 (区切り文字で区切られています)、2 番目の文字列はフォローしている人々 (これも区切られています)

  1. &nbsp;&nbsp;&nbsp;&nbsp;保護されています  void Reduce(テキストキー、Iterable<TextPair> ペア、コンテキストコンテキスト)
  2.       IOException、InterruptedExceptionをスローします{
  3. StringBuilder の first_follow =新しいStringBuilder();
  4. StringBuilderのsecond_befollow =新しいStringBuilder();
  5.           
  6.          ( TextPair ペア: ペア){
  7. 文字列 id = pair.getFirst().toString();
  8. 文字列値 = pair.getSecond().toString();
  9.              id.startsWith( "f" )の場合{
  10. first_follow.append(id.substring( 1 )).append(Separator.TABLE_String);
  11. }それ以外  id.startsWith( "b" )の場合
  12. second_befollow.append(id.substring( 1 )).append(Separator.TABLE_String);
  13. }
  14. }
  15.           
  16. context.write(キー、新しいTextPair(first_follow.toString()、second_befollow.toString()));
  17. &nbsp;&nbsp;&nbsp;&nbsp;}

Separator.TABLE_String はカスタムセパレーターです。TextPair はカスタムの Writable クラスであり、キーを 2 つの値に対応させ、2 つの値を区別できるようにします。

Map/Reduce 2:前のステップで、B が A に続き、A が T に続く場合、T は B の 2 次接続であり、間接的な人物は A であると結論付けることができるので、同じ 2 次接続の異なる間接的な人物を見つけます。図に示すように:

コードは次のとおりです。

マップタスク: 出力時に、キーは2つの文字列レコードのIDで表される2次関係であり、値はこの2次関係によって生成された間接的な人物のIDです。

  1. 公共  void map(テキストキー、テキストペア値、コンテキストコンテキスト)はIOException、InterruptedExceptionをスローします{
  2. Map<String, String> first_follow = new HashMap<String, String>();
  3. Map<String, String> second_befollow = new HashMap<String, String>();
  4. 文字列 _key = key.toString();
  5. String[] follow = values.getFirst().toString().split(Separator.TABLE_String);
  6.           
  7. 文字列[] 秒 = values.getSecond().toString().split(Separator.TABLE_String);
  8.           
  9.          for (文字列 sf : follow){
  10.               
  11. first_follow.put(sf、_key);
  12.               
  13. }
  14.           
  15.          (文字列 ss : 秒){
  16.               
  17. second_befollow.put(ss, _key);
  18.               
  19. }
  20.           
  21.          ( Entry <String, String> f : first_follow.entrySet()){
  22.              ( Entry<String, String> b : second_befollow.entrySet()){
  23. context.write(新しいTextPair(f.getKey() 、b.getKey())、新しいText(key));
  24. }
  25. }
  26. &nbsp;&nbsp;&nbsp;&nbsp;}

削減タスク: 出力時、キーは引き続き 2 次関係であり、値はカンマで区切られたすべての間接的な人の ID です。

  1. 保護された  void Reduce(TextPair キー、Iterable<Text> 値、Context コンテキスト)
  2.      IOException、InterruptedExceptionをスローします{
  3.       
  4. StringBuilder 結果 = new StringBuilder();
  5.      for (テキストテキスト:値){
  6. 結果.append(text.toString()).append( "," );
  7. }
  8.       
  9. context.write(キー、新しいテキスト(resutl.toString()));
  10. }

この時点で、基本的に2次接続は発見されており、その後の処理は非常に簡単です。もちろん、2次接続に基づいて3次、4次も発見されます:)

オリジナルリンク: http://my.oschina.net/BreathL/blog/75112

<<:  アリの採餌とインターネットアルゴリズム

>>:  App Store 中国、検索アルゴリズムを最適化:名前による検索を復活

ブログ    

推薦する

Microsoft の 6 ページの論文が話題に: Ternary LLM、とてもクール!

これはマイクロソフトと中国科学院大学による新たな研究の結論です。すべての LLM は 1.58 ビッ...

...

機械学習を利用してデータベースの運用と保守の問題を解決します

著者についてPing An Technology のデータベース チームの運用保守開発エンジニアであ...

AIが製造業に力を与え、PowerLeader Serverは製品、サービス、生産に焦点を当てる

ビッグデータ、モノのインターネット、人工知能に代表される新世代の情報技術は大きな進歩を遂げ、産業化を...

ホーキング博士は、人工知能が AI の世界的な商業的発展を止めることはできないと警告しています。これは祝福でしょうか、それとも呪いでしょうか?

水曜日の早朝、著名な物理学者スティーブン・ホーキング教授の家族は声明を発表し、ホーキング教授がイギリ...

Meta はヘッドマウントディスプレイを使用して全身のモーショントラッキングを実現します。脚の情報なしで正確な姿勢推定

ヘッドセットにより、Meta は新たな命を吹き込まれます! SIGGRAPH 2023 カンファレン...

2021年の人工知能と機械学習の5つのトレンド

人工知能と機械学習は長い間私たちの世界を変えてきましたが、2020年のコロナウイルスのパンデミックは...

AI プロジェクトの 85% が失敗します。何が悪かったのでしょうか?

[[441161]]最近のガートナー社の 2 つのレポートによると、AI および機械学習プロジェク...

人工知能は医療と健康分野に破壊的な革命をもたらすだろう

ヘルスケア分野への人工知能 (AI) の導入は、今日の国際医療における最も先進的な取り組みの 1 つ...

音声認識データベースが人工知能の中核となる

音声認識データベースと音声合成データベースは、人工知能の重要な技術です。機械が人間のように聞き、話し...

彼女に転送してください!文系女子でもわかるAIガイドライン

マッキンゼーのデータによれば、人工知能は今後10年間で米国に約13兆ドルの新たなGDPを生み出すだろ...

...

新浪微博廖博:WAICリアルタイムストリームコンピューティングプラットフォームの成長と発展

[51CTO.com からのオリジナル記事] 7 年間の努力と見事な変貌。 2012年以降、6年連続...

人工知能関連のキャリアと給与に関する 7 つの統計

現在、人手不足で高収入の AI 職種は何でしょうか? 需要が高い職種はどれでしょうか? AI はどれ...