Computer >> Máy Tính >  >> Kết nối mạng >> Kết nối mạng

Hình dung biểu đồ ảnh hưởng của ngôn ngữ lập trình

Hướng dẫn trực quan hóa mạng với Gephi và Sigma.js

Dưới đây là bản xem trước về những gì chúng ta sẽ làm hôm nay:biểu đồ ảnh hưởng của các ngôn ngữ lập trình. Hãy xem liên kết để khám phá mối quan hệ "ảnh hưởng của thiết kế" giữa hơn 250 ngôn ngữ lập trình trong quá khứ và hiện tại!

Đến lượt bạn!

Trong thế giới siêu kết nối ngày nay, mạng là một khía cạnh phổ biến của cuộc sống hiện đại.

Hãy bắt đầu ngày mới của tôi - Tôi đã sử dụng mạng lưới giao thông của Luân Đôn để đi du lịch vào thị trấn. Sau đó, tôi đã đi vào một chi nhánh của quán cà phê yêu thích của tôi và đã sử dụng Chromebook của tôi để kết nối với mạng Wi-Fi của họ . Tiếp theo, tôi đăng nhập vào nhiều mạng xã hội khác nhau các trang web tôi thường xuyên.

Không có gì bí mật khi một số công ty có ảnh hưởng nhất trong vài thập kỷ qua là nhờ thành công của họ nhờ sức mạnh của mạng lưới.

Facebook, Twitter, Instagram, LinkedIn và các nền tảng truyền thông xã hội khác dựa trên các thuộc tính thế giới nhỏ của mạng xã hội. Điều này cho phép họ kết nối người dùng của mình với nhau (và các nhà quảng cáo) một cách hiệu quả.

Google có được phần lớn thành công hiện tại nhờ sự thống trị ban đầu của họ trên thị trường công cụ tìm kiếm - được kích hoạt một phần nhờ khả năng trả về các kết quả có liên quan với sự trợ giúp của thuật toán mạng Xếp hạng Trang của họ.

Mạng lưới phân phối hiệu quả của Amazon cho phép họ giao hàng trong ngày ở một số thành phố lớn.

Mạng cũng cực kỳ quan trọng trong các lĩnh vực như Trí tuệ nhân tạo và Học máy. Mạng nơ-ron là một lĩnh vực nghiên cứu rất tích cực. Nhiều thuật toán phát hiện tính năng, rất cần thiết trong Thị giác máy tính, chủ yếu dựa vào việc sử dụng mạng để lập mô hình các phần khác nhau của hình ảnh.

Một loạt các hiện tượng khoa học cũng có thể được hiểu theo mô hình mạng. Điều này bao gồm cơ học lượng tử, các con đường sinh hóa và các hệ thống sinh thái và kinh tế xã hội.

Do đó, với tầm quan trọng không thể phủ nhận của chúng, làm thế nào chúng ta có thể hiểu rõ hơn về mạng và các thuộc tính của chúng?

Nghiên cứu toán học về mạng được gọi là "lý thuyết đồ thị", và là một trong những nhánh toán học dễ tiếp cận hơn. Bài viết này nhằm mục đích cung cấp phần giới thiệu, giả sử có ít kiến ​​thức hoặc kinh nghiệm trước đây.

Chúng tôi sẽ sử dụng Python 3.x và một số phần mềm mã nguồn mở tuyệt vời có tên Gephi để kết hợp một hình ảnh hóa mạng về cách một loạt các ngôn ngữ lập trình trong quá khứ và hiện tại được liên kết với nhau bằng ảnh hưởng.

Nhưng trước tiên…

Chính xác thì mạng là gì?

Các ví dụ được mô tả ở trên cho chúng ta một số manh mối. Mạng lưới giao thông được tạo thành từ điểm đến được kết nối bởi các tuyến đường . Mạng xã hội được tạo thành từ cá nhân , được kết nối thông qua mối quan hệ của họ với nhau. Các thuật toán công cụ tìm kiếm của Google đánh giá "xếp hạng" của các trang web khác nhau bằng cách xem trang nào liên kết cho những người khác.

Nói chung hơn, mạng là bất kỳ hệ thống nào có thể được mô tả dưới dạng nút các cạnh hoặc theo thuật ngữ thông tục, “dấu chấm và đường thẳng”.

Hình dung biểu đồ ảnh hưởng của ngôn ngữ lập trình
Một ví dụ về các nút (ngôn ngữ) được kết nối bằng các cạnh (ảnh hưởng của thiết kế)

Một số hệ thống dễ dàng được trừu tượng hóa theo cách này. Mạng xã hội có lẽ là ví dụ rõ ràng nhất. Hệ thống tệp máy tính là một hệ thống khác - các thư mục và tệp được liên kết bởi mối quan hệ "mẹ" và "con" của chúng.

Nhưng sức mạnh thực sự của mạng đến từ thực tế là rất nhiều hệ thống có thể được trừu tượng hóa và mô hình hóa theo các thuật ngữ mạng, ngay cả khi lúc đầu không biết rõ ràng là như thế nào.

Mạng đại diện

Chúng ta cần phải đi xa hơn một chút so với các bản phác thảo trên giấy và bút để phân tích và mô tả các mạng một cách toán học. Làm thế nào chúng ta có thể biến hình ảnh của các dấu chấm và đường thành những con số mà chúng ta có thể bẻ cong?

Một giải pháp là tạo ma trận kề đại diện cho mạng của chúng tôi.

Ma trận là một trong những khái niệm nghe có vẻ hơi đáng sợ nếu bạn không quen thuộc với chúng, nhưng đừng sợ. Hãy coi chúng như một lưới các số có thể được sử dụng để thực hiện nhiều phép tính cùng một lúc. Đây là một ví dụ bên dưới:

      Python Java Scala C#
Python     0    1     0  0
Java       0    0     0  1
Scala      0    1     0  0
C#         0    1     0  0

Trong ma trận này, giao điểm của mỗi hàng và cột là 0 hoặc 1, tùy thuộc vào việc các ngôn ngữ tương ứng có được liên kết hay không. Bạn có thể kiểm tra điều này với hình minh họa ở trên!

Đối với hầu hết các mục đích, ma trận kề là một cách tốt để biểu diễn mạng một cách toán học. Tuy nhiên, từ góc độ tính toán, đôi khi nó có thể hơi cồng kềnh.

Ví dụ:với số lượng nút thậm chí tương đối khiêm tốn (ví dụ 1000), sẽ có số lượng phần tử lớn hơn nhiều trong ma trận (ví dụ:1000² =1.000.000).

Nhiều hệ thống trong thế giới thực mang lại mạng thưa thớt . Trong các mạng này, hầu hết các nút chỉ kết nối với một tỷ lệ nhỏ so với tất cả các mạng khác.

Nếu chúng tôi biểu diễn một mạng thưa thớt 1000 nút trong bộ nhớ máy tính dưới dạng ma trận kề, chúng tôi sẽ có 1.000.000 byte dữ liệu được lưu trữ trong RAM. Hầu hết sẽ là số không. Phải có một cách hiệu quả hơn để giải quyết vấn đề này.

Một cách tiếp cận thay thế là làm việc với danh sách cạnh thay vì. Đây chính xác là những gì họ nói. Chúng chỉ đơn giản là danh sách các cặp nút liên kết với nhau.

Ví dụ, mạng ngôn ngữ lập trình ở trên có thể được biểu diễn như sau:

Java, Python
Java, Scala
Java, C#
C#, Java

Đối với các mạng lớn hơn, đây là một phương tiện tính toán hiệu quả hơn nhiều để biểu diễn chúng. Tất nhiên có thể tạo ma trận kề từ danh sách cạnh (và ngược lại). Không phải chúng ta phải chọn cái này hay cái kia.

Một phương tiện khác để đại diện cho các mạng là danh sách kề. Điều này liệt kê mọi nút theo sau là các nút mà nó liên kết đến. Ví dụ:

Java: Python, Scala, C#
C#: Java

Thu thập dữ liệu, tạo kết nối

Bất kỳ mô hình mạng và hình ảnh hóa nào sẽ chỉ tốt như dữ liệu được sử dụng để xây dựng nó. Điều này có nghĩa là, cũng như đảm bảo dữ liệu vừa chính xác vừa đầy đủ, chúng ta cũng cần biện minh cho phương tiện suy ra các cạnh giữa các nút.

Theo nhiều khía cạnh, đây là the Bước quan trọng. Bất kỳ phân tích và suy luận tiếp theo nào được thực hiện về mạng phụ thuộc vào việc có thể biện minh cho “tiêu chí liên kết”.

Ví dụ:trong phân tích mạng xã hội, bạn có thể liên kết mọi người dựa trên việc họ có theo dõi nhau trên mạng xã hội hay không. Trong sinh học phân tử, bạn có thể liên kết các gen dựa trên sự đồng biểu hiện của chúng.

Thông thường, phương pháp được sử dụng để liên kết các nút sẽ cho phép trọng số được gán cho các cạnh, đưa ra thước đo về “sức mạnh”.

Ví dụ:trong bối cảnh bán lẻ trực tuyến, bạn có thể liên kết các sản phẩm dựa trên tần suất chúng được mua cùng nhau. Các sản phẩm thường xuyên được mua cùng nhau sẽ được liên kết bằng cạnh có trọng số cao hơn so với các sản phẩm đôi khi chỉ được mua cùng nhau. Các sản phẩm được mua cùng nhau không thường xuyên hơn dự kiến ​​một cách ngẫu nhiên sẽ không được liên kết với nhau.

Như bạn có thể tưởng tượng, các phương pháp liên kết các nút với nhau có thể phức tạp như bạn muốn.

Tuy nhiên, đối với hướng dẫn này, chúng tôi sẽ sử dụng một phương tiện đơn giản hơn để kết nối các ngôn ngữ lập trình. Chúng tôi sẽ dựa vào tính chính xác của Wikipedia.

Đối với mục đích của chúng tôi, điều này sẽ ổn. Thành công của Wikipedia là minh chứng cho thấy rằng nó phải đang làm điều gì đó đúng đắn. Phương pháp cộng tác, mã nguồn mở mà các bài báo được viết phải đảm bảo tính khách quan ở một mức độ nào đó.

Ngoài ra, cấu trúc trang tương đối nhất quán của nó làm cho nó trở thành một sân chơi thuận tiện để thử các kỹ thuật tìm kiếm trang web.

Một phần thưởng khác là API Wikipedia mở rộng, được tài liệu hóa tốt, giúp việc truy xuất thông tin vẫn dễ dàng hơn. Hãy bắt đầu.

Bước 1 - Cài đặt Gephi

Gephi có sẵn trên Linux, Mac và Windows. Bạn có thể tải xuống tại đây.

Đối với dự án này, tôi đã sử dụng Lubuntu. Nếu bạn đang sử dụng Ubuntu / Debian, thì bạn có thể làm theo các bước bên dưới để thiết lập và chạy Gephi. Nếu không, quá trình cài đặt có thể sẽ giống với bất kỳ quá trình nào bạn đã quen thuộc.

Tải xuống phiên bản mới nhất (tại thời điểm viết bài này là v.0.9.1) của Gephi cho hệ thống của bạn. Khi nó sẵn sàng, bạn sẽ cần giải nén các tệp.

cd Downloads
tar -xvzf gephi-0.9.1-linux.tar.gz
cd gephi-0.9.1/bin./gephi

Bạn có thể cần kiểm tra phiên bản Java JRE của mình. Gephi yêu cầu phiên bản gần đây. Trong lần cài đặt Lubuntu tương đối mới của tôi, tôi chỉ cần cài đặt default-jre và mọi thứ hoạt động từ đó.

apt install default-jre
./gephi

Còn một bước nữa trước khi bạn sẵn sàng bắt đầu. Để xuất biểu đồ lên Web, bạn có thể sử dụng plugin Sigma.js cho Gephi.

Từ thanh menu của Gephi, hãy chọn tùy chọn “Công cụ” và chọn “Trình cắm”.

Nhấp vào tab “Plugin có sẵn” và chọn “SigmaExporter” (Tôi cũng đã cài đặt JSON Exporter, vì đó là một plugin hữu ích khác cần có).

Nhấn vào nút "Cài đặt" và bạn sẽ được thực hiện qua quá trình này. Bạn sẽ cần khởi động lại Gephi sau khi hoàn tất.

Bước 2 - Viết tập lệnh Python

Hướng dẫn này sẽ sử dụng Python 3.x, cộng với một số mô-đun để làm cho cuộc sống dễ dàng hơn. Sử dụng trình cài đặt mô-đun pip, hãy chạy lệnh sau:

pip3 install wikipedia

Bây giờ, trong một thư mục mới, hãy tạo một tệp có tên là script.py và mở nó trong trình soạn thảo mã / IDE yêu thích của bạn. Dưới đây là sơ lược về logic chính:

  1. Trước tiên, bạn sẽ cần một danh sách các ngôn ngữ lập trình để đưa vào.
  2. Tiếp theo, xem qua danh sách đó và truy xuất HTML của bài viết Wikipedia có liên quan.
  3. Từ đó, trích xuất danh sách các ngôn ngữ lập trình mà mỗi ngôn ngữ đã ảnh hưởng. Đây sẽ là tiêu chí liên kết sơ bộ và sẵn sàng.
  4. Khi bạn đang sử dụng, thật tuyệt nếu bạn có được một số siêu dữ liệu về từng ngôn ngữ.
  5. Cuối cùng, bạn sẽ muốn ghi tất cả dữ liệu bạn đã thu thập được vào tệp .csv

Toàn bộ tập lệnh có thể được tìm thấy trong ý chính này.

Nhập một số mô-đun

Trong script.py , hãy bắt đầu bằng cách nhập một vài mô-đun sẽ giúp mọi thứ dễ dàng hơn:

import csv
import wikipedia
import urllib.request
from bs4 import BeautifulSoup as BS
import re

OK - bắt đầu bằng cách lập danh sách các nút cần bao gồm. Đây là nơi mà mô-đun Wikipedia có ích. Nó giúp việc truy cập API Wikipedia trở nên cực kỳ dễ dàng.

Thêm mã sau:

pageTitle = "List of programming languages"
nodes = list(wikipedia.page(pageTitle).links)
print(nodes)

Nếu bạn lưu và chạy tập lệnh này, bạn sẽ thấy nó in ra tất cả các liên kết từ bài viết Wikipedia "Danh sách các ngôn ngữ lập trình". Tốt!

Tuy nhiên, luôn luôn hợp lý khi kiểm tra thủ công mọi dữ liệu được thu thập tự động. Nhìn lướt qua sẽ thấy rằng, cũng như nhiều ngôn ngữ lập trình thực tế, tập lệnh cũng có một vài liên kết bổ sung.

Ví dụ:bạn có thể thấy "Danh sách các ngôn ngữ đánh dấu", "So sánh các ngôn ngữ lập trình" và các ngôn ngữ khác trong đó.

Mặc dù Gephi cho phép bạn xóa các nút mà bạn không muốn đưa vào, nhưng sẽ không có hại gì nếu bạn "làm sạch" dữ liệu trước khi tiếp tục. Nếu có gì, điều này sẽ giúp tiết kiệm thời gian sau này.

removeList = [
    "List of",
    "Lists of",
    "Timeline",
    "Comparison of",
    "History of",
    "Esoteric programming language"
    ]

nodes = [i for i in nodes if not any(r in i for r in removeList)]

Các dòng này xác định danh sách các chuỗi con sẽ bị xóa khỏi dữ liệu. Sau đó, tập lệnh sẽ đi qua dữ liệu, loại bỏ bất kỳ phần tử nào chứa bất kỳ chuỗi con nào không mong muốn.

Trong Python, điều này chỉ yêu cầu một dòng mã!

Một số chức năng của trình trợ giúp

Bây giờ bạn có thể bắt đầu rà soát Wikipedia để tạo danh sách cạnh (và thu thập bất kỳ siêu dữ liệu nào). Để làm cho việc này dễ dàng hơn, trước tiên hãy xác định một vài hàm.

Lấy HTML

Chức năng đầu tiên sử dụng mô-đun BeautifulSoup để nắm giữ HTML cho trang Wikipedia của mỗi ngôn ngữ.

base = "https://en.wikipedia.org/wiki/"

def getSoup(n):
    try:
        with urllib.request.urlopen(base+n) as response:
            soup = BS(response.read(),'html.parser')
            table = soup.find_all("table",class_="infobox vevent")[0]                return table
     except:
         pass

Hàm này sử dụng mô-đun urllib.request để nắm giữ HTML cho trang tại “https://en.wikipedia.org/wiki/” + “programming language” .

Sau đó, nó được chuyển cho BeautifulSoup, nó sẽ đọc và phân tích cú pháp HTML thành một đối tượng mà chúng ta có thể sử dụng để tìm kiếm thông tin.

Tiếp theo, sử dụng find_all() để trích xuất phần tử HTML mà bạn quan tâm.

Ở đây, đây sẽ là bảng tóm tắt ở đầu mỗi bài viết về ngôn ngữ lập trình. Làm cách nào để xác định những điều này?

Cách dễ nhất là truy cập một trong các trang ngôn ngữ lập trình. Tại đây, bạn có thể chỉ cần sử dụng Công cụ dành cho nhà phát triển của trình duyệt để kiểm tra các yếu tố quan tâm.

Bảng tóm tắt có thẻ HTML <tab le> và CSS cl asses "in fobox " and "v sự kiện ", vì vậy bạn có thể sử dụng chúng để xác định bảng trong HTML.

Chỉ định điều này bằng các đối số:

  • "table"
  • class_="infobox vevent"

find_all() trả về danh sách tất cả các phần tử phù hợp với tiêu chí. Để thực sự chỉ định yếu tố bạn quan tâm, hãy thêm chỉ mục [0] . Nếu hàm thành công, nó sẽ trả về table sự vật. Nếu không, nó trả về None .

Hình dung biểu đồ ảnh hưởng của ngôn ngữ lập trình
Dữ liệu chúng tôi đang theo dõi nằm trong phần tử HTML này!

Với bất kỳ quy trình thu thập dữ liệu tự động nào, điều quan trọng là phải xử lý triệt để các trường hợp ngoại lệ. Nếu không, thì trong trường hợp tốt nhất, tập lệnh gặp sự cố và bạn cần phải bắt đầu lại.

Trong trường hợp xấu nhất, bạn sẽ nhận được một tập dữ liệu có nhiều lỗi và mâu thuẫn. Điều này sẽ làm cho nó trở thành một cơn ác mộng khi làm việc với dòng.

Truy xuất siêu dữ liệu

Hàm tiếp theo sử dụng table đối tượng để tìm kiếm một số siêu dữ liệu. Tại đây, nó tìm kiếm bảng cho năm ngôn ngữ xuất hiện lần đầu tiên.

def getYear(t):
    try:
        t = t.get_text()
        year = t[t.find("appear"):t.find("appear")+30]
        year = re.match(r'.*([1-3][0-9]{3})',year).group(1)
        return int(year)
    except:
        return "Could not determine"

Hàm ngắn này lấy table đối tượng làm đối số của nó và sử dụng get_text() của BeautifulSoup hàm tạo ra một chuỗi.

Bước tiếp theo là tạo một chuỗi con có tên là year . Điều này có 30 ký tự sau lần xuất hiện đầu tiên của từ "appear" . Chuỗi này phải chứa năm ngôn ngữ xuất hiện lần đầu tiên.

Để chỉ trích xuất năm, hãy sử dụng biểu thức chính quy (được sự cho phép của re mô-đun) để khớp với bất kỳ ký tự nào bắt đầu bằng một chữ số từ 1 đến 3 và theo sau là ba chữ số.

re.match(r'.*([1-3][0-9]{3})',year)

Nếu điều này thành công, hàm trả về year dưới dạng số nguyên. Nếu không, nó trả về "Không thể xác định" trông buồn. Bạn có thể muốn loại bỏ siêu dữ liệu khác - chẳng hạn như mô hình, nhà thiết kế hoặc kỷ luật đánh máy.

Một chức năng nữa dành cho bạn - lần này, bạn sẽ cấp dữ liệu trong table đối tượng cho một ngôn ngữ nhất định và hy vọng nhận được danh sách các ngôn ngữ lập trình khác.

def getLinks(t):
    try:
        table_rows = t.find_all("tr")
        for i in range(0,len(table_rows)-1):
            try:
                if table_rows[i].get_text() == "\nInfluenced\n":
                    out = []
                    for j in table_rows[i+1].find_all("a"):
                        try:
                            out.append(j['title'])
                        except:
                            continue
                    return out
            except:
                continue
        return
    except:
        return

Woah, hãy nhìn tất cả những cái lồng vào nhau ... Vậy thì điều gì đang thực sự xảy ra ở đây?

Hàm này sử dụng thực tế là table các đối tượng có cấu trúc nhất quán. Thông tin trong bảng được lưu trữ trong các hàng (thẻ HTML có liên quan là < tr>). Một trong những hàng này sẽ chứa `văn bản "\nInfluenced\n" . Phần đầu tiên của hàm tìm hàng này.

Khi hàng này đã được tìm thấy, bạn có thể chắc chắn rằng tiếp theo hàng chứa các liên kết đến từng ngôn ngữ lập trình bị ảnh hưởng bởi ngôn ngữ hiện tại. Tìm các liên kết này bằng find_all("a") - nơi đối số "a" tương ứng với thẻ HTML <a> .

Đối với mỗi liên kết j , nối ["title"] của nó thuộc tính cho danh sách có tên out . Lý do quan tâm đến ["title"] là vì điều này sẽ khớp với chính xác tên của ngôn ngữ được lưu trữ trong nodes .

Ví dụ:Java được lưu trữ trong nodes dưới dạng "Java (programming language)" , vì vậy bạn cần sử dụng tên chính xác này trong toàn bộ tập dữ liệu.

Nếu thành công, getLinks() trả về danh sách các ngôn ngữ lập trình. Phần còn lại của hàm giải quyết việc xử lý ngoại lệ, trong trường hợp có sự cố xảy ra ở bất kỳ giai đoạn nào.

Thu thập dữ liệu

Cuối cùng, bạn gần như đã sẵn sàng ngồi lại và để tập lệnh thực hiện công việc của nó. Nó sẽ thu thập dữ liệu và lưu trữ trong hai đối tượng danh sách.

edgeList = [["Source,Target"]]
meta = [["Id","Year"]]

Bây giờ, hãy viết một vòng lặp sẽ áp dụng các hàm được xác định trước đó cho mọi mục trong nodes và lưu trữ kết quả đầu ra trong edgeListmeta .

for n in nodes:
    try:
        temp = getSoup(n)
    except:
        continue
    try:
        influenced = getLinks(temp)
        for link in influenced:
            if link in nodes:
                edgeList.append([n+","+link])
                print([n+","+link])
    except:
        continue
    year = getYear(temp)
    meta.append([n,year])

Hàm này nhận từng ngôn ngữ trong nodes và cố gắng truy xuất bảng tóm tắt từ trang Wikipedia của nó.

Sau đó, nó truy xuất tất cả các ngôn ngữ mà bảng liệt kê là đã bị ảnh hưởng bởi ngôn ngữ được đề cập.

Đối với từng ngôn ngữ cũng xuất hiện trong nodes danh sách, nối một phần tử vào edgeList dưới dạng ["source,target"] . Bằng cách này, bạn sẽ xây dựng một danh sách cạnh để đưa vào Gephi.

Với mục đích gỡ lỗi, hãy in từng phần tử được thêm vào edgeList - chỉ để đảm bảo mọi thứ đang hoạt động như bình thường. Nếu bạn đã quá kỹ lưỡng, bạn có thể thêm các câu lệnh in vào except các mệnh đề cũng vậy.

Tiếp theo, lấy tên và năm của ngôn ngữ và nối chúng vào meta danh sách.

Ghi vào CSV

Khi vòng lặp đã chạy, bước cuối cùng là viết nội dung của edgeListmeta sang các tệp giá trị được phân tách bằng dấu phẩy (CSV). Điều này được thực hiện dễ dàng với csv đã nhập mô-đun trước đó.

with open("edge_list.csv","w") as f: 
    wr = csv.writer(f)
    for e in edgeList:
        wr.writerow(e)

with open("metadata.csv","w") as f2:
    wr = csv.writer(f2)
    for m in meta:
        wr.writerow(m)

Xong! Lưu tập lệnh và chạy từ đầu cuối:

$ python3 script.py

Bạn sẽ thấy tập lệnh in ra từng cặp nguồn-đích khi nó xây dựng danh sách cạnh. Đảm bảo kết nối internet của bạn ổn định và ngồi lại trong khi tập lệnh thực hiện điều kỳ diệu của nó.

Bước 3 - Xây dựng biểu đồ với Gephi

Hy vọng rằng bạn đã cài đặt và chạy Gephi sớm hơn. Bây giờ bạn có thể tạo một dự án mới và sử dụng dữ liệu bạn thu thập được để xây dựng một biểu đồ có hướng. Điều này sẽ cho thấy các ngôn ngữ lập trình khác nhau đã ảnh hưởng đến nhau như thế nào!

Bắt đầu bằng cách tạo một dự án mới trong Gephi và chuyển sang chế độ xem “Phòng thí nghiệm dữ liệu”. Điều này cung cấp một giao diện giống như bảng tính để xử lý dữ liệu trong Gephi. Điều đầu tiên cần làm là nhập danh sách cạnh.

  • Nhấp vào “Nhập bảng tính”.
  • Chọn edge_list.csv tệp được tạo bởi tập lệnh Python. Đảm bảo rằng Gephi biết sử dụng dấu phẩy làm dấu phân cách.
  • Chọn “Danh sách cạnh” từ loại Danh sách.
  • Nhấp vào “Tiếp theo” và kiểm tra xem bạn có đang nhập cả cột Nguồn và cột Đích dưới dạng chuỗi hay không.

Điều này sẽ cập nhật Phòng thí nghiệm dữ liệu với một danh sách các nút. Bây giờ, hãy nhập metadata.csv tập tin. Lần này, hãy đảm bảo chọn “Danh sách nút” từ loại Danh sách.

Chuyển sang tab “Xem trước” và xem mạng trông như thế nào.

Ah… Nó chỉ là một chút… đơn sắc. Và lộn xộn. Giống như một đĩa mì Ý. Hãy sửa lỗi này.

Làm cho nó đẹp

Có tất cả các cách bạn có thể thực hiện trên bản trình bày và đây là nơi một chút tự do sáng tạo xuất hiện. Với hình ảnh hóa mạng, về cơ bản có ba điều cần xem xét:

  1. Định vị Có một số thuật toán có thể tạo ra các mẫu bố cục cho một mạng. Một lựa chọn phổ biến là thuật toán Fruchterman-Reingold, có sẵn trong Gephi.
  2. Định cỡ Kích thước của các nút trong biểu đồ có thể được sử dụng để biểu diễn một số thuộc tính thú vị. Thông thường, đây là thước đo trọng tâm . Có nhiều cách để đo lường mức độ tập trung, nhưng tất cả đều phản ánh “tầm quan trọng” của một nút nhất định, xét về mức độ kết nối của nó với phần còn lại của mạng.
  3. Tô màu Cũng có thể sử dụng màu sắc để hiển thị một số thuộc tính của một nút. Thông thường, màu sắc được sử dụng để biểu thị cấu trúc cộng đồng . Điều này được định nghĩa rộng rãi là “một nhóm các nút được kết nối với nhau nhiều hơn so với phần còn lại của biểu đồ”. Trong mạng xã hội, điều này có thể tiết lộ tình bạn, gia đình hoặc các nhóm nghề nghiệp. Có một số thuật toán có thể phát hiện cấu trúc cộng đồng. Gephi đi kèm với phương pháp Louvain được tích hợp sẵn.

Để thực hiện những thay đổi này, bạn sẽ cần tính toán một số thống kê. Chuyển sang cửa sổ "Tổng quan". Ở đây bạn sẽ thấy một bảng điều khiển bên phải. Nó phải chứa một tab "Thống kê". Mở cái này và bạn sẽ thấy một loạt các tùy chọn.

Gephi đi kèm với nhiều khả năng thống kê sẵn có. Đối với mỗi người trong số họ, nhấp vào “Chạy” sẽ tạo ra một báo cáo tiết lộ thông tin chi tiết về mạng.

Một số điều hữu ích cần biết bao gồm:

  • Mức độ trung bình Ngôn ngữ trung bình được kết nối với khoảng bốn ngôn ngữ khác. Báo cáo cũng hiển thị một biểu đồ phân phối mức độ. Điều này cho thấy rằng hầu hết các ngôn ngữ có rất ít kết nối, trong khi một tỷ lệ nhỏ có rất nhiều. Điều này cho thấy rằng đây là một không có quy mô mạng . Nhiều nghiên cứu đã được thực hiện trên các mạng không có quy mô và các quy trình tạo ra chúng.
  • Đường kính Mạng này có đường kính là 12 - có nghĩa là đây là số lượng kết nối "rộng nhất" giữa hai ngôn ngữ bất kỳ. Độ dài đường dẫn trung bình chỉ dưới bốn. Điều này có nghĩa là, trung bình, hai ngôn ngữ bất kỳ cách nhau bốn cạnh. Những số liệu này cung cấp thước đo về “quy mô” của mạng.
  • Tính mô-đun Đây là điểm số cho thấy mạng được "phân chia theo từng ngăn" như thế nào. Ở đây, điểm mô đun là khoảng 0,53. Đây là mức tương đối cao, cho thấy có các mô-đun riêng biệt trong mạng này. Một lần nữa, điều này cho thấy điều gì đó thú vị về hệ thống cơ bản. Các ngôn ngữ có xu hướng rơi vào các “nhóm ảnh hưởng” riêng biệt.

Nhưng dù sao, để sửa đổi giao diện của mạng, hãy chuyển sang bảng điều khiển bên trái.

Trong tab “Bố cục”, bạn có thể chọn thuật toán bố cục để sử dụng. Nhấn “Chạy” và xem sự thay đổi của biểu đồ trong thời gian thực! Xem thuật toán bố cục nào bạn cho là hoạt động tốt nhất.

Phía trên tab Bố cục là tab "Giao diện". Tại đây, bạn có thể chơi với các cài đặt khác nhau cho màu sắc, kích thước và nhãn của nút và cạnh. Chúng có thể được định cấu hình dựa trên các thuộc tính (bao gồm cả số liệu thống kê mà Gephi tính toán).

Theo một gợi ý, bạn có thể:

  • Tô màu các nút theo thuộc tính Môđun của chúng. Điều này sẽ tô màu chúng tùy theo thành viên cộng đồng của chúng.
  • Kích thước các nút theo Mức độ của chúng. Các nút được kết nối tốt hơn sẽ xuất hiện lớn hơn các nút ít được kết nối hơn.

Tuy nhiên, bạn nên thử nghiệm và đưa ra bố cục mà bạn thích nhất.

Khi bạn hài lòng với sự xuất hiện của biểu đồ, đã đến lúc chuyển sang bước cuối cùng - xuất sang Web!

Bước 4 - Sigma.js

Bạn đã xây dựng một hình ảnh hóa mạng có thể khám phá trong Gephi. Bạn có thể chọn chụp ảnh màn hình hoặc lưu biểu đồ ở định dạng SVG, PDF hoặc PNG.

Tuy nhiên, nếu bạn đã cài đặt plugin Sigma.js trước đó, thì tại sao không xuất biểu đồ sang HTML? Điều này sẽ tạo ra một hình ảnh trực quan tương tác mà bạn có thể lưu trữ trực tuyến hoặc tải lên GitHub và chia sẻ với những người khác.

Để thực hiện việc này, hãy chọn “Xuất> Mẫu Sigma.js…” từ thanh menu của Gephi.

Điền vào các thông tin chi tiết theo yêu cầu. Đảm bảo chọn thư mục mà bạn xuất dự án. Bạn có thể thay đổi tiêu đề, chú thích, mô tả, hành vi di chuột và nhiều chi tiết khác. Khi bạn đã sẵn sàng, hãy nhấp vào “OK”.

Bây giờ, nếu bạn điều hướng đến thư mục bạn đã xuất dự án, bạn sẽ thấy một thư mục chứa tất cả các tệp được tạo bởi Sigma.js.

Mở index.html trong trình duyệt yêu thích của bạn. Ta-da! Có mạng của bạn! Nếu bạn biết một chút CSS và JavaScript, bạn có thể đi sâu vào các tệp được tạo khác nhau để điều chỉnh đầu ra theo ý muốn.

Và điều đó kết thúc hướng dẫn này!

Tóm tắt

  • Nhiều hệ thống có thể được mô hình hóa và hiển thị dưới dạng mạng. Lý thuyết đồ thị là một nhánh của toán học cung cấp các công cụ giúp hiểu cấu trúc và thuộc tính mạng.
  • Bạn đã sử dụng Python để thu thập dữ liệu từ Wikipedia nhằm xây dựng biểu đồ ảnh hưởng của ngôn ngữ lập trình. Tiêu chí liên kết là liệu một ngôn ngữ nhất định có được liệt kê là ảnh hưởng đến thiết kế của người khác hay không.
  • Gephi và Sigma.js là các công cụ mã nguồn mở cho phép bạn phân tích và trực quan hóa các mạng. Chúng cho phép bạn xuất mạng ở định dạng hình ảnh, PDF hoặc Web.

Cảm ơn bạn đã đọc - Tôi mong nhận được bất kỳ nhận xét hoặc thắc mắc nào của bạn! Để có một nguồn tài nguyên tuyệt vời để tìm hiểu thêm về lý thuyết đồ thị, hãy xem cuốn sách trực tuyến tương tác của Albert-László Barabási.

Mã đầy đủ cho hướng dẫn này có thể được tìm thấy tại đây.