例としてVK APIを使用したソーシャルネットワーク分析の概要



ソーシャルメディアデータは、研究とビジネスチャンスの尽きることのないソースです。 Vkontakte APIの例とPython言語を使用して、今日は学習に役立つ実用的な例をいくつか分析します。



免責事項:この記事は目新しさを装うものではありませんが、興味のある人が力を集めてアイデアを実践に移すのを助けることだけを目的としています。



(注目を集めるヘアボール)



そして、私たちはすぐに最初のタスクから始めます。友人のエゴセントリックなグラフを作成し、自分自身を排除します。



import requests import networkx import time import collections def get_friends_ids(user_id): friends_url = 'https://api.vk.com/method/friends.get?user_id={}' #     access_token  ,    OAuth 2.0 json_response = requests.get(friends_url.format(user_id)).json() if json_response.get('error'): print json_response.get('error') return list() return json_response[u'response'] graph = {} friend_ids = get_friends_ids(1405906) #  user id,       . for friend_id in friend_ids: print 'Processing id: ', friend_id graph[friend_id] = get_friends_ids(friend_id) g = networkx.Graph(directed=False) for i in graph: g.add_node(i) for j in graph[i]: if i != j and i in friend_ids and j in friend_ids: g.add_edge(i, j) pos=networkx.graphviz_layout(g,prog="neato") networkx.draw(g, pos, node_size=30, with_labels=False, width=0.2)
      
      





コードの結果はこのグラフでした:







私の場合、目はつながりの2つの大きな要素を区別できます。2つの異なる居住都市の友人です。



一部のユーザーは、この情報またはその情報を登録ユーザーまたは友人のみに公開できるため、一部の方法では承認(アクセストークンの転送)が必要になる場合があります。 このような場合、APIの制限という形で制限があります。 VKのドキュメントでは、クライアントアプリケーションの制限は3rpsであり、サーバーアプリケーションの場合、アプリケーションのインストール数(rps /インストール数)に応じてプログレッシブスケールが5 / <10000、8 / <100000、20 / <1,000,000であると記載されています。 35 /> 1,000,000。



また、ドキュメントには次の段落があります。

呼び出しの頻度の制限に加えて、同じメソッドの呼び出しには定量的な制限があります。 明らかな理由により、正確な制限に関する情報は提供していません。




したがって、たとえば、プロファイル検索メソッドusers.searchの呼び出し、または特定の制限を超えた(ただし、文書化された制限を超えない)ユーザーの壁wall.getを表示するメソッドは、空の結果を生成し始めます。 この状況ではエラーが発生する可能性があります。たとえば、ユーザーを検索する場合、この検索クエリの結果はないが、実際には見つからないことがあります。



以下は、ドキュメント化された制限(1秒あたり3リクエストなど)を検討するのに役立つコードのスニペットです。

 deq = collections.deque(maxlen=4) def trottling_request(url): deq.appendleft(time.time()) if len(deq) == 4: # 3   ,   -  time.sleep(max(1+deq[3]-deq[0], 0))
      
      





同じグラフで、Gephiプログラムの使用例を検討してください。 Gephiは、Javaで書かれたオープンソースのグラフ分析および視覚化プログラムで、元はフランスのコンピエーニュ工科大学の学生によって開発されました。 Gephiは、2009年、2010年、2011年、2012年、2013年にGoogleサマーコードに参加するように選ばれました[wiki]。



まず、グラフを.graphml形式(XMLベースのグラフ記述形式)で保存します。

 networkx.write_graphml(g, 'graph.graphml')
      
      





エクスポート後、Gephiにロードし、次のようなものを取得します。



Gephiには、さまざまなプラグインで拡張できる優れた機能があります。 以下は視覚化の例です。

中心性(PageRank中心性、次数中心性、偏心中心性)。 異なる色は異なる中心性の値を示します。



クラスタリング(モジュラリティクラスタリング、マルコフクラスタリング、チャイニーズウィスパークラスタリング)。 異なる色は、アルゴリズムによって選択された異なるクラスを示します。





最後のタスクは、New Professions Labのビッグデータスペシャリストコースの最初のセットのラボの1つに触発されています。 ソーシャルネットワークVkontakteの既知のグループリストに基づいて、グラフを作成する必要があります。



グループの例として、ニュース出版物のグループを検討します。必要に応じて、他のグループを試すことができます。



 %matplotlib inline import networkx import requests import json def getVKMembers(group_id, count=1000, offset=0): # http://vk.com/dev/groups.getMembers host = 'http://api.vk.com/method' if count > 1000: raise Exception('Bad params: max of count = 1000') response = requests.get('{host}/groups.getMembers?group_id={group_id}&count={count}&offset={offset}' .format(host=host, group_id=group_id, count=count, offset=offset)) if not response.ok: raise Exception('Bad response code') return response.json() def allCountOffset(func, func_id): set_members_id = set() count_members = -1 offset = 0 while count_members != len(set_members_id): # posible endless loop for real vk api response = func(func_id, offset=offset)['response'] if count_members != response['count']: count_members = response['count'] new_members_id = response['users'] offset += len(new_members_id) if set_members_id | set(new_members_id) == set_members_id != set(): # without new members print 'WARNING: break loop', count_members, len(set_members_id) break set_members_id = set_members_id.union(new_members_id) return set_members_id groups = ['http://vk.com/meduzaproject', 'http://vk.com/tj', 'http://vk.com/smmrussia', 'http://vk.com/vedomosti', 'http://vk.com/kommersant_ru', 'http://vk.com/kfm', 'http://vk.com/oldlentach', 'http://vk.com/lentaru', 'http://vk.com/lentasport', 'http://vk.com/fastslon', 'http://vk.com/tvrain', 'http://vk.com/sport.tvrain', 'http://vk.com/silverrain', 'http://vk.com/afishagorod', 'http://vk.com/afishavozduh', 'http://vk.com/afishavolna', 'http://vk.com/1tv', 'http://vk.com/russiatv', 'http://vk.com/vesti', 'http://vk.com/ntv', 'http://vk.com/lifenews_ru'] members = {} for g in groups: name = g.split('http://vk.com/')[1] print name members[name] = allCountOffset(getVKMembers, name) matrix = {} for i in members: for j in members: if i != j: matrix[i+j] = len(members[i] & members[j]) * 1.0/ min(len(members[i]), len(members[j])) max_matrix = max(matrix.values()) min_matrix = min(matrix.values()) for i in matrix: matrix[i] = (matrix[i] - min_matrix) / (max_matrix - min_matrix) g = networkx.Graph(directed=False) for i in members: for j in members: if i != j: g.add_edge(i, j, weight=matrix[i+j]) members_count = {x:len(members[x]) for x in members} max_value = max(members_count.values()) * 1.0 size = [] max_size = 900 min_size = 100 for node in g.nodes(): size.append(((members_count[node]/max_value)*max_size + min_size)*10) import matplotlib.pyplot as plt pos=networkx.spring_layout(g) plt.figure(figsize=(20,20)) networkx.draw_networkx(g, pos, node_size=size, width=0.5, font_size=8) plt.axis('off') plt.show()
      
      







結果は次のグラフになります。







もちろん、ここで紹介するタスクは、ソーシャルネットワークでの作業のシンプルさとアクセシビリティのみを示しています。 実際、より複雑な問題を解決する必要があります。 そのため、たとえば、ソーシャルプロフィールデータはDMPシステムのデータ(年齢、興味、ソーシャルグループ)を充実させることができます。主なタスクは、DMPシステムのユーザーを見つけてソーシャルプロフィールと照合することです。 履歴書を作成するためのソースとしてソーシャルネットワークを使用する多くのスタートアップもあります:amazinghiring、entelo、profiscope、gildなど。ここでの主なタスクは、異なるソーシャルネットワークでソーシャルネットワークから受信したデータに基づいて同じユーザーを見つけることです。ユーザーの履歴書を作成します。これは、おそらくlinkinを除くほとんどのソーシャルネットワークには、履歴書に適した十分な情報がないためです。



All Articles