파이썬을 통해 Qita 태그를 시각화하는 네트워크

미야치@_38ch입니다.
업무상 인터넷 분석이 필요하기 때문에 파이톤으로 그리면 어떤 프로그램 라이브러리를 사용하게 될까? 조사해 봤더니networkx가 많아서 스스로도 가볍게 써 보았다.
Qita에 이미 올라온 글을 참고하여 Qita의 라벨 네트워크(어떤 라벨과 어떤 라벨이 함께 사용되는지)를 가시화합니다.먼저 결과를 내놓으면 이런 걸 만들었지.

컨디션

  • Mac High Sierra 10.13.4
  • Python 3.5.0
  • Jupyter Notebook
  • 데이터 준비


    Qita 기사에서 얻은 API를 클릭하여 탭 데이터만 가져옵니다.
    import requests
    import json
    import collections
    import itertools
    import networkx as nx
    %matplotlib inline
    import matplotlib.pyplot as plt
    
    params = {"page":1, "per_page":100}
    for i in range(60):
        print("fetching... page " + str(i + 1))
        params["page"] = i + 1
        res = requests.get("https://qiita.com/api/v2/items", params=params)
        items.extend(json.loads(res.text))
    
    현재items에도 탭 이외의 데이터가 포함되어 있기 때문에 탭만 추출합니다.
    tags_list = []
    for item in items:
        tags = [tag["name"] for tag in item["tags"]]
        tags_list.append(tags)
    
    이렇게 하면 태그.list에는 모든 보도의 라벨 목록이 있습니다.
    tags_목록 내용
    [['cli', 'ESP32', 'M5stack'],
     ['Wiki.js'],
     ['PHP', 'laravel', 'Eloquent'],
     ['Python', '初心者', '機械学習', 'gensim', 'word2vec'],
     ['Git', 'GitHub', 'バージョン管理'],
     ['HTTPメソッド'],
     ['文字コード', 'バイナリ'],
     ['Node.js', 'npm', 'anyenv', 'ndenv'],
     ['RHEL', 'ext4'],
     ['R', 'Pandoc', 'RMarkdown']...
    ]
    
    모든 탭을 네트워크에 넣으면 혼란스러워질 수 있으니 자주 나오는 탭을 먼저 선택하십시오.이번에 TOP50을 달성하였다.
    tag_count = collections.Counter(itertools.chain.from_iterable(tags_list)).most_common(50)
    
    tag_컨텐트
    [('JavaScript', 39),
     ('Python', 39),
     ('PHP', 27),
     ('AWS', 24),
     ('python3', 18),
     ('Ruby', 17),
     ('laravel', 16),
     ('Rails', 15),
     ('MySQL', 15),
     ('docker', 14)...
    ]
    

    네트워크 다이어그램 만들기


    그러면 넷워크x를 사용하여 데이터의 시각화를 진행합니다.
    G = nx.Graph()
    G.add_nodes_from([(tag, {"count":count}) for tag, count in tag_count])
    
    이 때 노드만 생성됩니다(네트워크 그림의 동그라미).
    따라서 가장자리(원형과 원형을 연결하는 선)를 추가하자.
    for tags in tags_list:
        for tag0, tag1 in itertools.combinations(tags, 2):
            if not G.has_node(tag0) or not G.has_node(tag1):
                continue
            if G.has_edge(tag0, tag1):
                G[tag0][tag1]["weight"] += 1
            else:
                G.add_edge(tag0, tag1, weight=1)
    
    여기는 좀 복잡해요.list에서 목록을 가져와 모든 조합을 보십시오 (tag1).
    예를 들어, "['Git', 'GitHub', 'バージョン管理']"리스트가 있으면(Git, GitHub), (Git, バージョン管理), (Github, バージョン管理) 이 세 가지 모드가tag01에 들어갑니다.
    여기에 기릿과 기릿하이브의 노드 사이에 가장자리가 추가된 경우 weight(선의 굵기)를, 가장자리가 추가되지 않은 경우 가장자리를 추가한다.
    그럼 도표를 그리겠습니다.
    plt.figure(figsize=(15,15)) # グラフのサイズを定義
    pos = nx.spring_layout(G, k=1.5) # ノード間の反発力を定義。値が小さいほど密集する
    
    node_size = [ d['count']*50 for (n,d) in G.nodes(data=True)] # ノードの大きさを調整
    nx.draw_networkx_nodes(G, pos, node_color='b', alpha=0.2, node_size=node_size, font_weight="bold", font_family='VL Gothic') # ノードのスタイルを定義
    nx.draw_networkx_labels(G, pos, fontsize=14)
    
    edge_width = [ d['weight']*0.5 for (u,v,d) in G.edges(data=True)] # エッジの太さを調整
    nx.draw_networkx_edges(G, pos, alpha=0.4, edge_color='r', width=edge_width) # エッジのスタイルを定義
    
    plt.axis('off')
    
    결과는 다음과 같다.
    (일본어를 어떻게 말해야 할지 모르니 아는 사람에게 알려주세요...)

    고찰하다.

  • 비교적 강한 곳은 파이톤, 자바스크립트, PHP, AWS 정도죠.
  • 파이썬 바로 아래에 있는 건 머신러닝이죠?
  • Excel이 고립된 경우 위험합니다.
  • 참고 문장


    [Pythhon]NetworkX에서 Qiita의 태그 관계도를 그립니다

    선전하다.


    월리카처럼 복잡한 더치페이 지원 서비스를 개인적으로 제작하고 있으니 가능하면 사용해 보세요.

    좋은 웹페이지 즐겨찾기