CHƯƠNG 2 : CƠ SỞ LÝ THUYẾT
2.6. Ngôn ngữ lập trình Scala
2.6.1. Khái quát về ngôn ngữ Scala
Scala, viết tắt của Scalable Language, là một ngơn ngữ lập trình hàm lai. Nó được tạo ra bởi Martin Odersky. Scala tích hợp thơng suốt các tính năng của ngơn ngữ lập trình hướng đối tượng và hàm. Scala được biên dịch để chạy trên JVM (Java Virtual Machine). Nhiều công ty, phụ thuộc vào Java cho các ứng dụng kinh doanh quan trọng, đang chuyển sang Scala để tăng năng suất phát triển, khả năng mở rộng ứng dụng và độ tin cậy tổng thể. (M. Odersky, L. Spoon, B. Venners, 2007)
2.6.2. Các tính năng của ngơn ngữ Scala
Dưới đây là vài tính năng làm cho Scala trở thành sự lựa chọn đầu tiên của các nhà phát triển ứng dụng.
2.6.2.1. Scala là ngơn ngữ lập trình hướng đối tượng
Scala là một ngôn ngữ hướng đối tượng thuần tuý theo nghĩa là mỗi giá trị là một đối tượng. Kiểu và hành vi của các đối tượng được mô tả bởi lớp (classes) và đặc điểm (traits). Traits là khái niệm tương tự với interfaces trong Java 8.
Các lớp được mở rộng bằng cách tạo lớp con và một cơ chế kết hợp dựa trên sự pha trộn linh hoạt thay thế cho đa thừa kế.
2.6.2.2. Scala là ngơn ngữ lập trình hàm
Scala cũng là một ngơn ngữ lập trình hàm theo nghĩa là mỗi hàm là một giá trị và mỗi giá trị là một đối tượng để cuối cùng thì mọi hàm là một đối tượng.
Scala cung cấp một cú pháp đơn giản để định nghĩa hàm nặc danh. Nó hỗ trợ các hàm bậc cao, cho phép các hàm lồng vào nhau và hỗ trợ currying10.
2.6.2.3. Scala là ngôn ngữ lập trình có kiểu dữ liệu tĩnh
Scala, khơng giống như một số ngơn ngữ có kiểu dữ liệu tĩnh khác (C, Pascal, Rust...), khơng địi hỏi phải cung cấp thơng tin kiểu dư thừa. Người lập trình khơng phải
đặc tả kiểu dữ liệu trong hầu hết các trường hợp.
2.6.2.4. Scala chạy trên JVM
Scala được biên dịch thành Java Byte Code được thực thi bởi Java Virtual Machine (JVM). Điều này có nghĩa rằng Scala và Java có một nền tảng thực thi chung.
Bạn có thể dễ dàng chuyển từ Java sang Scala.
2.6.2.5. Scala có thể chạy mã Java
Scala cho phép sử dụng tất cả các lớp của Java SDK và các lớp Java do người sử dụng tự định nghĩa, hoặc các dự án mã nguồn mở Java cần thiết.
2.6.2.6. Scala có thể thực hiện đồng thời và đồng bộ hóa xử lý
Scala cho phép biểu diễn các mẫu lập trình tổng quát một cách hiệu quả. Nó thu giảm số lượng dịng lệnh và giúp lập trình một cách an tồn kiểu. Nó cho phép lập trình một cách khơng thay đổi để dễ dàng áp dụng tính đồng thời và song song.
10Currying: là kỹ thuật chuyển đổi một hàm nhiều tham số thành một chuỗi các hàm có một tham số.
2.7. Web MVC với Play Framework
2.7.1. Các nền tảng xây dựng ứng dụng web bằng Scala
Do ứng dụng web linh động và dễ triển khai trên nhiều hệ điều hành và thiết bị nên trong đề tài này tôi sẽ phát triển hệ thống CNE với giao diện web. Hiện có nhiều Web Framework hỗ trợ ngơn ngữ Scala như: Play, Scalatra, Lift, Finatra, Spray... Trong đề tài này tôi chọn phát triển hệ thống CNE bằng Play Framework do đặc tính nhẹ, mạnh, đơn giản, dễ mở rộng, hỗ trợ mơ hình MVC, ...
2.7.2. Play Framework
Play là một nền tảng xây dựng nhanh ứng dụng web bằng ngôn ngữ Java và Scala. Nó tích hợp nhiều thành phần (components) và API cần thiết để phát triển ứng dụng web hiện đại theo mơ hình MVC.
Play dựa trên kiến trúc nhẹ, khơng trạng thái, thân thiện web và các tính năng dự đoán và tiêu thụ tài nguyên tối thiểu (CPU, bộ nhớ, threads) cho các ứng dụng có khả năng mở rộng cao nhờ mơ hình phản ứng của nó dựa trên Akka Streams (playframework.com, 2017).
Akka Streams là một thư viện để xử lý và truyền một chuỗi các phần tử bằng cách sử dụng không gian bộ nhớ đệm được giới hạn (bounded buffer space). Thuộc tính giới hạn là tính năng xác định của Akka Streams. Nó có thể biểu diễn một chuỗi (hoặc các đồ thị) các thực thể xử lý, mỗi thực thể xử lý thực hiện độc lập (và có thể đồng thời) với những thực thể xử lý khác, trong khi đó chỉ lưu vào bộ nhớ đệm một số lượng giới hạn các phần tử ở bất kỳ thời điểm nào. Thuộc tính này của bộ nhớ đệm được giới hạn là một trong những điểm khác biệt so với mơ hình tác nhân (the actor model), trong đó mỗi tác nhân thường có một hộp thư khơng bị giới hạn, hoặc bị giới hạn, nhưng lấy ra được. Các thực thể xử lý của Akka Stream có "những hộp thư" bị giới hạn nhưng khơng lấy ra được (doc.akka.io, 2017).
Có thể xem thêm thơng tin đầy đủ về Play Framework, download chương trình cài đặt, tham khảo tài liệu, xem các ví dụ... tại https://www.playframework.com .
2.8. Biểu diễn trực quan đồ thị với VisJs
2.8.1. Khái quát về các thư viện biểu diễn trực quan đồ thị
Hiện tại có nhiều thư viện hỗ trợ biểu diễn trực quan đồ thị. Có thể chia thành hai nhóm:
- Nhóm 1: Thư viện hỗ trợ ngôn ngữ Scala/Java để biểu diễn trực quan đồ thị trên giao diện Desktop. Ví dụ: Lightning, GraphStream, Databricks, GraphViz, JGraph, Ubigraph, Jung...
- Nhóm 2: Thư viện hỗ trợ ngôn ngữ JavaScript để biểu diễn trực quan đồ thị trên giao diện Web. Ví dụ: VisJs, D3, Scala.js, Vega, SigmaJs, Cytoscape, ArborJs, Alchemy...
Trong đề tài này tơi chọn VisJs vì thư viện này thỏa mãn những tiêu chí như: đơn giản, linh hoạt, tài liệu rõ ràng phong phú và cung cấp nhiều tham số cho phép biểu diễn trực quan đồ thị trong trình duyệt đẹp mắt và chuyên nghiệp.
2.8.2. VisJs Framework
Một thư viện trực quan động dựa trên trình duyệt. Thư viện được thiết kế để dễ sử dụng, có thể xử lý số lượng lớn dữ liệu động và cho phép thao tác và tương tác với dữ liệu. Thư viện bao gồm các thành phần DataSet, Timeline, Mạng (Đồ thị), Graph2d và Graph3d.
Với mục tiêu dễ sử dụng nên VisJs được thiết kế với cú pháp đơn giản, rõ ràng, dễ hiểu nhưng đầy đủ. Tài liệu phong phú và trình bày có hệ thống nhằm giúp người đọc có thể sử dụng được. Ngồi ra VisJs cịn cung cấp một bộ sưu tập các ví dụ minh họa giúp người lập trình nhanh chóng làm quen với thư viện này.
Có thể xem thêm thơng tin đầy đủ về VisJs, download thư viện, tham khảo tài liệu, xem các ví dụ... ở http://visjs.org/ .
CHƯƠNG 3:
PHÂN TÍCH & THIẾT KẾ HỆ THƠNG
3.1. u cầu của hệ thống
Yêu cầu của hệ thống là xây dựng hệ thống Citation Network Explorer (CNE) để tìm tầm ảnh hưởng của bài báo khoa học trong mạng trích dẫn. Cụ thể, hệ thống CNE bao gồm các chức năng sau:
1. Tải cơ sở dữ liệu từ OrientDb vào Apache Spark. 2. Biểu diễn trực quan đồ thị.
3. Tính PageRank cho các đỉnh trên đồ thị. 4. Tìm tầm ảnh hưởng của một bài báo. 5. Tìm bài báo có tầm ảnh hưởng nhiều nhất. 6. Tìm thành phần liên thơng chứa một bài báo. 7. Xác định độ lan tỏa của một bài báo theo thời gian.
Để xây dựng hệ thống như trên ta cần thực hiện các công việc sau:
- Thiết kế sơ đồ kiến trúc.
- Thiết kế cơ sở dữ liệu.
- Thiết kế chức năng.
3.2. Sơ đồ kiến trúc hệ thống CNE
Sơ đồ kiến trúc hệ thống CNE, như trong Hình 3.1, gồm 4 tầng:
- Client: cung cấp giao diện để người sử dụng truy cập vào hệ thống. Tầng
này sử dụng thư viện VisJs để thực hiện việc biểu diễn trực quan đồ thị.
- Apache Spark Cluster xử lý, chuyển kết quả xử lý về Client. Tầng này sử
dụng Play Framework để thực hiện cơng việc của mình.
- Apache Spark Cluster: là nơi chủ yếu xử lý yêu cầu của hệ thống bằng
cách sử dụng nền tảng Apche Spark và GraphX API. Tầng này có thể bao gồm nhiều máy tính tham gia xử lý song song để gia tăng hiệu quả xử lý của hệ thống.
- OrientDb Server Cluster: là nơi lưu trữ cơ sở dữ liệu đồ thị. Tầng này có
thể bao gồm nhiều máy tính để thực hiện việc lưu trữ phân tán cơ sở dữ liệu để gia tăng hiệu quả truy cập dữ liệu và khả năng chịu lỗi của hệ thống.
-
-
- Hình 3.1 - Sơ đồ kiến trúc hệ thống CNE.
3.3. Thiết kế cơ sở dữ liệu
3.3.1. Thu thập dữ liệu
-Dữ liệu mạng trích dẫn “DBLP-Citation-network V8: 3,272,991 papers and
8,466,777 citation relationships (2016-07-14)” được download từ site
https://aminer.org/citation là dạng text file được trình bày như sau:
- S
TT
- Tiền
Tố - Ý Nghĩa
- 1 - #* - Tên bài báo
- 2 - #@ - Tên các tác giả
- 3 - #t - Năm công bố
- 4 - #c - Nơi công bố
- 5 - #ind
ex - Id của bài báo
- STT
Tiền Tố - Ý Nghĩa
- 6 #% - Id của bài báo được tham khảo. Có thể có nhiều id của bài
báo được tham khảo, mỗi id trên một dịng
- 7 #! - Tóm tắt bài báo
- Dưới đây là ví dụ về một bài báo được lưu trong text file:
-
- #*Information geometry of U-Boost and Bregman divergence
- #@Noboru Murata,Takashi Takenouchi,Takafumi Kanamori,Shinto Eguchi
#t2004 - #cNeural Computation - #index436405 - #%94584 - #%282290 - #%605546 - #%620759 - #%564877 - #%564235 - #%594837 - #%479177 - #%586607
- #!We aim at an extension of AdaBoost to U-Boost, in the paradigm to build a stronger
classification machine from a set of weak learning machines. A geometric understanding of the Bregman divergence defined by a generic convex function U leads to the U-Boost method in the framework of information geometry extended to the space of the finite measures over a label set. We propose two versions of U-Boost learning algorithms by taking account of whether the domain is restricted to the space of probability functions. In the sequential step, we observe that the two adjacent and the initial classifiers are associated with a right triangle in the scale via the Bregman divergence, called the Pythagorean relation. This leads to a mild convergence property of the U-Boost algorithm as seen in the expectation-maximization algorithm. Statistical discussions for
- consistency and robustness elucidate the properties of the U-Boost methods
based on
a stochastic assumption for training data.
3.3.2. Thiết kế cơ sở dữ liệu đồ thị trong OrientDB
-Từ dữ liệu thô ở trên, để tổ chức thành đồ thị trong OrientDB, tôi đã tạo hai lớp
Paper và Reference. Lớp Paper dùng để biểu diễn các bài báo, lớp Reference dùng để
biểu diễn mối quan hệ tham khảo giữa hai bài báo. Chi tiết các lớp như trong Bảng 3.1.
- Bảng 3.1 - Chi tiết các lớp Paper và Reference.
- Lớ p - Thuộc tính - Kiểu dữ liệu - Mô tả - Pa per
- - - Biểu diễn bài báo
- - id - OType.L
ONG
- Id của bài báo - Unique Index
Key
- - title - OType.S
TRING - Tên bài báo
- - authors - OType.S
TRING - Danh sách các tác giả
- - year - OType.S
HORT - Năm công bố
- - publicatio nVenue
- OType.S
TRING - Nơi công bố
- - index - OType.S
TRING
- Index của bài báo - Unique
Index Key
- - abstract - OType.S
TRING
- Tóm lược nội dung bài báo
- - references - OType.S
TRING
- Danh sách những index, được
phân tách bởi dấu chấm phẩy (;), của các bài báo được tham khảo
- Ref
erence
- - - Biểu diễn mối quan hệ
tham khảo
-
- src - OType.L
ONG
- Id của bài báo nguồn (bài báo
tham khảo)
- - dst - OType.L
ONG
- Id của bài báo đích (bài báo
được tham khảo)
3.3.3. Chương trình đọc text file và chuyển thành cơ sở dữ liệu đồ thị
-Do dữ liệu mạng trích dẫn thu thập được là một text file nên cần phải viết chương trình đọc text file và lưu vào cơ sở dữ liệu đồ thị. Chương trình này độc lập với hệ thống CNE và bao gồm những chức năng chính được liệt kê trong Bảng 3.2. Code Scala hiện thực các chức năng này được trình bày trong Phụ Lục 1.
- Bảng 3.2 - Danh mục các hàm của chương trình đọc text file.
- STT - Tên hàm - Chức năng - T rang - 1 - prepare
Graph() - Chuẩn bị cơ sở dữ liệu đồ thị. 1
-
2
- importN odes()
- Đọc text file và tạo các đỉnh trong cơ sở dữ liệu đồ thị. - 4 2 - 3 - createEd ges()
- Đọc thuộc tính references của mỗi đỉnh để tạo
các cạnh trong cơ sở dữ liệu đồ thị.
- 4 3
-
4
- main() - Gọi các hàm ở trên để tạo nội dung cho cơ sở
dữ liệu đồ thị.
- 4 3
-
-Sau đây là mô tả chi tiết về các hàm của chương trình đọc text file và lưu vào cơ sở dữ liệu đồ thị.
3.3.3.I. Hàm prepareGraph()
-Hàm prepareGraph() chuẩn bị cơ sở dữ liệu đồ thị trước khi đọc text file. Hàm này nhận một tham số là graph, là cơ sở dữ liệu đồ thị rỗng trong OrientDb Server, tạo lớp đỉnh Paper và lớp cạnh Reference trong đồ thị. Thuật tốn 3.1 mơ tả chi tiết các cơng việc của hàm prepareGraph().
- Thuật tốn 3.1 — Thuật toán của hàm prepareGraphộ.
-Hàm prepareGraph() chuẩn bị cơ sở dữ liệu đồ thị trước khi đọc text file. Tham khảo Code 1 để xem chi tiết hiện thực hàm prepareGraph().
- Input: graph là cơ sở dữ liệu đồ thị rỗng trong OrientDb server.
- Output: khơng có. 1. Bắt đầu.
3. Tạo các thuộc tính cho lớp Paper.
4. Tạo index cho thuộc tính index của lớp Paper. 5. Tạo lớp cạnh Reference.
6. Tạo các thuộc tính cho lớp Reference. 7. Kết thúc.
3.3.3.2. Hàm importNodes()
-Hàm importNodes() đọc text file và tạo các đỉnh trong cơ sở dữ liệu đồ thị. Hàm này nhận hai tham số. Tham số thứ nhất là graph, là cơ sở dữ liệu đồ thị trong OrientDb server. Cơ sở dữ liệu đồ thị này chỉ có định nghĩa hai lớp Paper và Reference chứ chưa có dữ liệu. Tham số thứ hai là íileName, đây là đường dẫn của text file chứa thông tin các bài báo của mạng trích dẫn. Hàm importNodes() đọc từng dịng của text file, phân tích và tạo các đỉnh trong cơ sở dữ liệu đồ thị. Thuật tốn 3.2 mơ tả chi tiết các cơng việc của hàm importNodes().
- Thuật tốn 3.2 - Thuật toán của hàm importNodes().
-Hàm importNodes() đọc textfile và tạo các đỉnh trong cơ sở dữ liệu đồ thị. Tham khảo Code 2 để xem chi tiết hiện thực hàm importNodes().
- Input: graph, fileName. Trong đó:
- + Graph: là cơ sở dữ liệu đồ thị trong OrientDb server.
- + fileName: là đường dẫn của text file chứa thông tin các bài báo của
mạng trích dẫn.
- Output: khơng có. 1. Bắt đầu.
2. Mở text file để đọc.
3. Lặp qua từng dòng của text file:
a. Nếu dịng đọc được bắt đầu bằng “#*” thì thêm đỉnh vào đồ thị. b. Ngược lại gán giá trị cho các thuộc tính của đỉnh.
4. Đóng text file. 5. Kết thúc.
3.3.3.3. Hàm createEdges()
-Hàm createEdges() đọc thuộc tính references của mỗi đỉnh để tạo các cạnh trong cơ sở dữ liệu đồ thị. Thuộc tính references chứa danh sách index, phân tách bởi dấu chấm phẩy (;), của những bài báo được một bài báo tham khảo. Hàm này nhận một tham số là graph, là cơ sở dữ liệu đồ thị trong OrientDb server. Đồ thị này đã có các đỉnh nhưng