9/24/2022

Xử lý ngôn ngữ tự nhiên | Tài liệu, chuyên ngành


Xử lý ngôn ngữ tự nhiên là môn học kỹ sư mà các bạn theo bên Hệ thống thông tin (HTTT) hay Công nghệ phần mềm (CNPM) đều phải học. Thoạt nghe thì chúng ta chắc ai cũng nghỉ tới những công nghệ AI gì đó cao siêu, nhưng môn học này không dạy như vậy, môn học này dạy đúng bản chất thực sự gọi là xử lý ngôn ngữ tự nhiên. Các bạn sẽ được học về các bài toán cụ thể của xử lý ngôn ngữ tự nhiên và các phương pháp để giải quyết các bài toán này và thường là các phương pháp giải quyết bằng xác suất. Các bài toán cụ thể mà môn học đề cập tới như là: Tách từ tiếng Việt, gán nhãn từ loại, phân tích cú pháp, phân tích vai nghĩa, nghĩa từ vựng và phân giải nhập nhằng.

Nếu các bạn chưa biết thì chúng ta có một thư viện cũng khá nổi tiếng trong bài toán tách từ tiếng việt của thầy Trần Việt Trung là thư viện Pyvi, có thể nhiều bạn chưa biết hoặc cũng có thể nhiều bạn đã dùng nhưng chưa biết nó là của thầy Trung. Github của thư viện trên github của thầy Trung tại https://github.com/trungtv/pyvi.

Môn học này thường sẽ thi tự luận và thường tập chung vào các dạng bài: 

  • Tính xác suất bigram (ở chương 2, mô hình ngôn ngữ)
  • Thuật toán CKY (ở chương 5a, phân tích cú pháp)
  • Thuật toán Early (ở chương 5a, phân tích cú pháp)
  • Vẽ cây cú pháp (ở chương 5a, phân tích cú pháp)
  • Tính xác suất cây cú pháp (ơ chương 5b, phân tích xác suất)
  • ...

Tài liệu môn học: 

Về bài tập lớn, bài tập lớn các bạn sẽ phải làm về xử lý ngôn ngữ tự nhiên. Nếu đề tài mà nhóm bạn chọn bạn không chắc chắn nó là một đề tài của xử lý ngôn ngữ tự nhiên hãy hỏi lại cô giáo để tránh làm lệch đề. Các bạn có thể tham khảo danh sách đề tài của cô Lê Thanh Hương TẠI ĐÂY.

Các bạn có thể xem qua trang web về môn học Xử lý ngôn ngữ tự nhiên (NLP) của cô Lê Thanh Hương tại website cá nhân của cô Hương: https://users.soict.hust.edu.vn/huonglt/NLP/

8/27/2022

Cơ sở dữ liệu điện tử thư viện Tạ Quang Bửu | Sharing


Lâu rồi, hôm nay mình mới quay lại đăng bài trên website, hôm nay không phải là một bài viết về môn học hay gì đó liên quan tới lập trình, bài viết này được Hỗ trợ Sinh viên Bách khoa đăng trên fanpage về các nguồn cơ sở dữ liệu điện tử của thư viện Tạ Quang Bửu. Khi đọc dược bài viết của fanpage Hỗ trợ sinh viên Bách Khoa rất nhiều bạn rất tiếc là không được biết tới sớm hơn, cũng một phần vì do fanpage của thư viện Tạ Quang Bửu ít được mọi người chú ý mà khi Hỗ trợ Sinh viên Bách Khoa đăng lại mọi người mới biết tới nhiều hơn. Mình thấy đây là một nguồn dữ liệu cực kì hữu ích cho mỗi bạn sinh viên mà lại ít người biết tới nên muốn chia sẻ lại để lưu lại cũng như nhiều bạn sinh viên biết tới hơn.

Thư viện Tạ Quang Bửu đang có cơ sở dữ liệu sau:

Lưu ý: mỗi cơ sở dữ liệu này đều chỉ có thể sử dụng trong thời gian bạn là sinh viên, vì vậy nếu có ý định nghiên cứu, tìm hiểu thì hãy sử dụng nó ngay đi, thời gian trôi qua sẽ là không thể lấy lại.

Fanpage chính thức của thư viện Tạ Quang Bửu - đại học Bách Khoa Hà Nội: fb.com/TQB.library

6/10/2022

Pull down refresh và Pull up loading | Phát triển ứng dụng đa nền tảng - Sharing



Pull down refresh

Kiểu kéo để làm mới (hoặc vuốt để làm mới - pull down refresh) cho phép người dùng kéo xuống danh sách dữ liệu bằng cách sử dụng thao tác chạm để truy xuất thêm dữ liệu. Cử chỉ “Kéo để làm mới” được Loren Brichter giới thiệu lần đầu tiên trong ứng dụng Tweetie và nhanh chóng nó trở nên phổ biến đến mức vô số ứng dụng đã áp dụng cử chỉ này. Ngày nay, tính năng "kéo để làm mới" là một phần tự nhiên của nhiều ứng dụng phổ biến, bao gồm Twitter, Gmail, Tweetbot và những ứng dụng khác. 

Cách hoạt động: một chỉ báo làm mới ( mũi tên vòng tròn) xuất hiện để báo hiệu cho người dùng hành động kéo xuống này sẽ làm mới lại màn hiện tại. 

Pull down refresh hoạt động tốt cho danh sách, danh sách dạng lưới hoặc bộ sưu tập được sắp xếp theo nội dung gần đây nhất, vì thế thao tác pull down refresh thích hợp trong các trường hợp như là bảng tin Facebook hay Twitter, Inbox messenger,… 

Các trường hợp không thích hợp sử dụng:  

+ Bản đồ: vì bản đồ không có hướng xác định 

+ Danh sách không có thứ tự: vì việc danh sách không có thứ tự thì làm mới sẽ không mang lại được tác dụng gì 

+ Các ứng dụng hoặc màn hình mà có tỉ lệ cập nhật thông tin thấp hoặc không thường xuyên 

+ Dữ liệu sắp xếp theo thứ tự thời gian: nên có nút làm mới vì khi sắp xếp theo thứ tự thời gian người dùng sẽ kéo từ trên xuống để xem và khi đó việc kéo lên cùng để làm mới là khó khăn 

+ Một số dạng nội dung đặc biệt khác 

Pull up loading

Pull up loading hay là lazy loading là một cách tốt để cải thiện trải nghiệm người dùng, lazy loading trì hoãn tải hoặc khởi tạo tài nguyên hoặc đối tượng cho đến khi chúng thực sự cần thiết. Ví dụ: nếu một trang web có hình ảnh mà người dùng phải cuộn xuống để xem, chúng ta có thể hiển thị trình giữ chỗ và chỉ tải hình ảnh đầy đủ một cách chậm rãi khi người dùng đến vị trí của trang đó. Hoặc là bảng tin facebook, facebook chỉ tải 1 số status và khi người dùng kéo xuống mới tiếp tục tải những status khác. 

Lợi ích của pull up loading: giảm thời gian tải ban đầu, bảo toàn băng thông, bảo tồn tài nguyên hệ thống 

Pull up loading sử dụng trong các trường hợp mà ứng dụng có nhiều thông tin mà việc tải ngay ban đầu có thể gây mất thời gian hoặc quá tải, sử dụng trong các trường hợp danh sách mà các phần tử cũ hơn ít được xem xét đến, hoặc là trường hợp mà nội dung thay đổi như là bảng tin facebook, twitter. 

Pull up loading là rất tốt để giảm băng thông tuy nhiên không lên quá lạm dụng, trong các ứng dụng có ít thông tin hoặc các ứng dụng mà nội dung ít thay đổi. 

Trong React Native 

Pull down refresh: Chức năng Kéo để Làm mới được triển khai bằng cách sử dụng thành phần RefreshControl trong React Native. RefreshControl được sử dụng bên trong ScrollView hoặc ListView để thêm kéo để làm mới chức năng. Khi ScrollView ở scrollY: 0, vuốt xuống sẽ kích hoạt sự kiện onRefresh. 

Pull up loading: Đặt vị trí ban đầu của Hình ảnh trong ScrollView, Theo dõi vị trí hiện tại của page offset, Thay đổi trạng thái khi page offset đến gần  

Trong Flutter

Pull down refresh: Đặt ListView, GridView… bên trong Widget RefreshIndicator, thuộc tính onRefresh: mô tả cách thức chương trình refresh dữ liệu. 

Pull up loading: Sử dụng ListView.builder, GridView.builder… thuộc tính controller của của ListView.builder… sẽ thực hiện việc load các dữ liệu khi người dùng thực hiện thao thác cuộn màn hình. 

6/01/2022

Phát triển ứng dụng đa nền tảng | Tài liệu, chuyên ngành


Phát triển ứng dụng đa nền tảng trình bày khái niệm cơ bản, quy trình, công cụ và các thư viện, framework hỗ trợ để xây dựng ứng dụng đa nền tảng và chủ yếu chính là React Native và Flutter (Cross platform). 

Nếu ai học KHMT thì ở module 1 các bạn cũng đã được học môn học "Phát triển ứng dụng cho thiết bị di động", môn học này giới thiệu về phát triển các ứng dụng trên mobile với các công cụ phát triển gốc trên Android (Native platform) bằng ngôn ngữ lập trình Java. Nếu bạn muốn biết thêm về ưu nhược điểm của Native platform và cross platform thì có thể xem qua bài viết trước đó trên website của mình: Native với Cross Platform: ưu và nhược điểm


Các bạn sẽ học được gì ở môn học này? Như bao môn khác, không thể nào qua 1 môn học mà các bạn có thể trở thành một nhà phát triển ứng dụng đa nền tảng được, môn học chỉ cung cấp cho bạn những thứ cơ bản nhất để nếu bạn nào có theo hướng này thì cũng sẽ cần tự mình nghiên cứu thêm rất nhiều hay là đi thực tập tại các công ty để có thể học hỏi thêm từ các doanh nghiệp.

Trong phát triển ứng dụng đa nền tảng các bạn sẽ được dạy tập chung chủ yếu vào các phần chính: 

  • Tổng quan và kiến trúc của thiết bị di động (kiến trúc android, kiến trúc iOS, kiến trúc đa nền tảng)
  • Dart và Flutter
  • Javascript và React native

(Tham khảo bài viết: Các điểm nhấn trong cú pháp của ES6)

Với bài tập lớn các bạn có thể tùy ý lựa chọn xây dựng ứng dụng đa nền tảng dựa trên Flutter hoặc React Native tùy ý. Các bạn đã được cung cấp sẵn backend khi làm bài tập lớn và công việc của mỗi nhóm chỉ là xây dựng ứng dụng frontend cho thiết bị di động với công nghệ đa nền tảng. Dĩ nhiên là các bạn được phép thêm các chức năng, chỉnh sửa để có một ứng dụng ưng ý hơn, thậm chí đây còn là điều bắt buộc khi trong kỳ mình học bản backend thầy đưa cho là một bản backend bị thiếu một số chức năng và thầy giáo không tìm được bản đầy đủ. Hoặc các bạn cũng có thể xây dựng một con backend mới hoàn toàn nếu có thời gian, nhưng nhớ là con backend các bạn xây dựng mới nên có các chức năng cũng phải giống với con backend mà thầy giáo cung cấp.

Môn học này có 1 số thầy giáo phụ trách như là thầy Nguyễn Mạnh TuấnNguyễn Tiến Thành,... Các bạn học thầy Tuấn thì có vẻ điểm sẽ cao hơn, học thầy Thành thì sẽ được làm các đề thi thử trước khi các bạn thi cuối kì.

Một số tài liệu dành cho môn học: 

Môn học này sẽ có 1 số kiến thức xung quanh môn học được thầy giáo hay hỏi trong quá trình học tập, mình sẽ viết thành các bài viết riêng đăng sau bài viết này vì chúng cũng là những vấn đề không nhỏ.

5/08/2022

Các điểm nhấn trong cú pháp của ES6 | Phát triển ứng dụng đa nền tảng - Sharing


Trong phát triển ứng dụng đa nền tảng các bạn sẽ được đề cập tới 2 framework đa nền tảng mobile nổi tiếng nhất hiện nay đó là React NativeFlutter. Với React Native việc nắm vững Javascript và những cú pháp mới trong ES6 là điều rất cần thiết. Trong bài viết này mình muốn viết về những điểm nhấn trong cú pháp của ES6, bài viết được tham khảo trong chương 4, phần 1.2 của slide bài giảng phát triển ứng dụng đa nền tảng sẽ được chia sẻ ở những bài viết sau trên blog của mình và đã được bổ sung và sửa đổi một số kiến thức cho đầy đủ hơn.

Từ khóa let và const

Trong ES5, chúng ta định nghĩa 1 biến sử dụng từ khóa var, phạm vi của biến khi sử dung var để khai báo sẽ chỉ có 2 trường hợp là global hoặc local. Khi chúng ta định nghĩa biến ngoài một hàm thì nó là biến global, còn khi chúng ta định nghĩa biến ở bên trong hàm thì nó là một biến local.

Trong ES6 giới thiệu cho chúng ta một từ khóa let giúp cho việc khai báo biến chạy trong một block (block ở đây được hiểu như là giới hạn trong 2 dấu "{}")

Ví dụ: 

let x = 10;
if (x == 10) {
    let x = 20;
    console.log(x); // 20:  reference x inside the block
}
console.log(x); // 10: reference at the begining of the script

Chúng ta có thể thấy biến x được khai báo mới trong block if hoàn toàn được khai báo mới chứ không hề liên quan gì tới biến đã được khai báo ở ngoài. Việc này cũng giúp chúng ta tránh nhầm lẫn trong việc sử dụng tên biến hơn và cũng giúp Javascript gần hơn với các ngôn ngữ khác.

ES6 cũng cung cấp một cách định nghĩa hằng số sử dụng const. const keyword dùng để định nghĩa các biến chỉ đọc và tham chiếu tới một giá trị.

Các biến được khai báo bởi từ khóa let là mutable (có thể thay đổi), còn các biến khai báo bởi từ khóa const là immutable (không thể thay đổi).

Vòng lặp for...of

Cú pháp mới for...of giúp lặp một cách dễ dàng hơn trên các đối tượng có thể lặp lại như là: mảng, string, map, set,...

Ví dụ: 

let scores = [80, 90, 70];

for (let score of scores) {
    score = score + 5;
    console.log(score);
}

Template literals

Trước ES6, chúng ta sử dụng dấu ngoặc đơn (') và ngoặc kép (") để biểu thị cho string javascript, và string bị giới hạn rất nhiều chức năng. 

Với template literals chúng ta có thể làm nhiều hơn với một string như là: 

- Khai báo và sử dụng string có thể kéo dài trên nhiều dòng

- Thực hiện nội suy cho phép nhúng các biến hoặc biểu thức vào chuỗi 

- An toàn khi chèn vào các mã HTML

Template literals được đặt trong 2 dấu (``), ví dụ: 

let str = `Template literal in ES6`;

console.log(str);// Template literal in ES6
console.log(str.length); // 23
console.log(typeof str);// string

Arrow Function

Cú pháp mũi tên (=>), đây như là một cách viết gọn hàm lại. Ví dụ với một hàm bình thường như sau: 

let add = function (x, y) {
	return x + y;
};
console.log(add(10, 20)); // 30

Chúng ta có thể viết gọn lại với cú pháp của arrow function như sau: 

let add = (x, y) => x + y;
console.log(add(10, 20)); // 30;

Một số trường hợp chúng ta có thể viết gọn lại hơn nữa arrow function, khi danh sách tham số chỉ có 1, chúng ta có thể bỏ qua dấu ngoặc đơn: 

(singleParam) => { statements }
singleParam => { statements }

Tuy nhiên nếu hàm không có tham số thì cặp dấu ngoặc đơn là bắt buộc sử dụng: 

() => { statements }

Nếu chỉ có một biểu thức trong nội dung của arrow function thì chúng ta có thể bỏ qua dấu ngoặc nhọn: 

let square = x => x * x;

Giá trị mặc định cho tham số

Ví dụ: 

function say(message='Hi') {
    console.log(message);
}

say(); // 'Hi'
say('Hello') // 'Hello'

Xây dựng các Class

Trước ES6, Javascript không có khái niệm về class, mà để bắt chước một class thì chúng ta có thể sử dụng constructor/prototype pattern

Ở ES6, khái niệm class đã được giới thiệu và đây chắc chắn là những tin vui cho những ai fan của hướng đối tượng: 

class Person {
    constructor(name) {
        this.name = name;
    }
    getName() {
        return this.name;
    }
}

Module

- Mỗi module được biểu diễn bằng một thẻ .js riêng biệt 

- Lệnh import hoặc export trong một module để xuất hoặc nhập các biến, hàm, class hoặc bất cứ một thực thể nào đến từ một module hoặc tệp khác

Ví dụ, tạo một file message.js có nội dung như sau: 

export let message = 'ES6 Modules';

Để sử dụng biến message trong một file khác, chúng ta có thể sử dụng cú pháp import như sau: 

import { message } from './message.js'

Rest Parameters

- Truyền vào lượng tham số tùy ý cho hàm dưới dạng mảng

- Thêm vào phía trước tham số toán từ ... (dấu ba chấm)

function sortNumbers(...numbers) {
    return numbers.sort();
}
console.log(sortNumbers(3, 5, 7));
console.log(sortNumbers(3, 5, 7, 1, 0));

Toán tử Spread

Toán tử spread (tức là chia nhỏ) một mảng và chuyển các giá trị vào hàm được chỉ định.

const odd = [1,3,5];
const combined = [2,4,6, ...odd];
console.log(combined);

// => output: [ 2, 4, 6, 1, 3, 5 ]

function f(a, b, ...args) {
	console.log(args);
}

f(1, 2, 3, 4, 5);

// => output: [ 3, 4, 5 ]

Phép gán hủy cấu trúc

Biểu thức giúp dễ dàng trích xuất các giá trị từ mảng hoặc thuộc tính từ các đối tượng, thành các biến riêng biệt bằng cách cung cấp một cú pháp ngắn gọn.

let colors = ["Xanh", "Đỏ"];
let [a, b] = colors;

Tham khảo: https://www.javascripttutorial.net/es6/

4/17/2022

Thuật toán pagerank xếp hạng đồ thị | Ôn tập khai phá web


Pagerank là thuật toán xếp hạng đồ thị dựa trên cấu trúc tổng quát, chúng ta có cách để tính được chính xác thứ hạng của từng đỉnh, tuy nhiên khi số đỉnh càng lớn, việc tính toán chính xác là điều gây mất thời gian và không cần thiết. Trong bài viết này mình sẽ hướng dẫn 3 cách để xếp hạng các đỉnh cho đồ thị (mình gọi nhanh là 3 thuật toán pagerank). Về lý thuyết thì các bạn có thể xem slide bài giảng của các thầy/ cô TẠI ĐÂY.

Đề bài: Cho một đồ thị có 3 đỉnh và quan hệ giữa các đỉnh như hình dưới, với d = 1 (damping factor) hãy tính toán thứ hạng của từng đỉnh.



Trong bài viết này mình giải quyết với damping factor = 1, đây là trường hợp dễ nhất trong các trường hợp, với damping factor khác 1 mình sẽ có bài viết sau giới thiệu lại, vì damping factor khác 1 chúng ta cần lắm rõ lý thuyết và công thức một tí, tuy nhiên thì cơ bản vẫn sẽ tương tự.

1. Tính chính xác pagerank bằng hệ phương trình

Ta có hệ phương trình sau: 

$\begin{cases}r_a = r_c\\r_b = r_a / 2 \\r_c = r_a / 2 + r_b & (1)\\r_a + r_b + r_c = 1\end{cases}$

Mình giải thích qua tại sao lại có hệ phương trình này nha, đầu tiên là tổng thứ hạng của tất cả các đỉnh lúc nào cũng bằng 1 rồi, vậy ta luôn có được phương trình thứ 4 là $r_a + r_b + r_c = 1$.

Tiếp theo để giải được một hệ phương trình có 3 ẩn số thì ít nhất chúng ta phải cần thêm 2 phương trình nữa, ở đây chúng ta sẽ cứ tìm ra hết các phương trình có thể.

Với phương trình đầu $r_a = r_c$, nếu viết đầy đủ thì phải là $r_a = r_c / 1$, với CA là một cạnh của đồ thị và đỉnh C có 1 bậc ra. Với phương trình thứ 2 $r_b = r_a / 2$, với AB là một cạnh của đồ thị và đỉnh A có 2 bậc ra. Với phương trình thứ 3 $r_c = r_a / 2 + r_b$, với AC, BC là một cạnh của đồ thị và A, B lần lượt có 2 và 1 bậc ra.

Tiếp theo việc giải phương trình này thì dễ rồi, chúng ta thay thế xuống phương trình cuối sẽ có: 

$r_a + r_a / 2 + r_a / 2 + r_a / 2 = 1$

$=> r_a = 2 / 5, r_b = 1/5, r_c = 2 /5 $.

Chắc là cũng có nhiều bạn thắc mắc là giải dễ như vậy tại sao lại cần cách các xấp xỉ làm gì? Mình cũng sẽ giải thích luôn là đây chỉ là ví dụ với 3 đỉnh, trong các bài toán thực tế thì một đồ thị thường lên tới hàng triệu đỉnh thì việc giải HPT để tìm ra thứ hạng chính xác là điều cực kì khó khăn và không cần thiết.

2. Tính xấp xỉ pagerank bằng thuật toán lặp

Để bắt đầu cách này trước hết chúng ta vẫn phải tìm ra hệ phương trinh $(1)$ trước nha.

Sau đó bắt đầu chúng ta khởi tạo giá trị thứ hạng cho từng đỉnh: $r_a(0) = r_b(0) = r_c(0) = 1/3$, chúng ta có thể khởi tạo bất kì giá trị nào cũng được nha, nếu khởi tạo hơi lỗi thì chúng ta sẽ phải mất nhiều lần lặp hơn mới tìm ra được điểm hội tụ, còn nếu khởi tạo tốt thì có thể chỉ mất 1,2 vòng lặp. Kí hiệu $(0)$ đằng sau mỗi $r_a, r_b, r_c$ để thể hiện cho số vòng lặp, trong trường hợp khởi tạo thì số vòng đã lặp là 0.

+ Vòng 1: 

$r_a(1) = r_c(0) / 1 = 1 / 3$

$r_b(1) = r_a(0) / 2 = 1 / 6$

$r_c(1) = r_a(0) / 2 + r_b(0) / 1 = 1 / 2$

+ Vòng 2: 

$r_a(2) = r_c(1) / 1 = 1 /2$

$r_b(2) = r_a(1) / 2 = 1/ 6$

$r_c(2) = r_a(1) / 2 + r_b(1) / 1 = 1 /3$

+ Vòng 3: 

$r_a(3) = r_c(2) / 1 = 1 / 3$

$r_b(3) = r_a(2) / 1 = 1/ 4$

$r_c(3) = r_a(2) / 2 + r_b(2) / 1 = 5 / 12$

+ Vòng 4: 

$r_a(4) = r_c(3) / 1 = 5 / 12$

$r_b(4) = r_a(3) / 2 = 1 / 6$

$r_c(4) = r_a(3) / 2 + r_b(3) / 1 = 5 / 12$

+ Vòng ...

Lặp tới bao nhiêu vòng là tùy vào yêu cầu bài toán mà thầy/ cô giáo đưa ra, còn trên thực tế chúng ta sẽ lặp tới khi nào hội tụ, tức là khi mà vòng lặp sau kết quả không đổi so với kết quả trước hoặc là thay đổi nhỏ hơn một số denta rất nhỏ do chúng ta định nghĩa ra trước.

3. Tính xấp xỉ pagerank bằng thuật toán lặp với ma trận

Lặp bằng tay như cách 2 có thể khiến các bạn rơi vào trầm cảm, cách 3 này như là một cách tóm gọn lại của cách 2 bằng ma trận vậy.

Đầu tiên vẫn là khởi tạo giá trị ban đầu $r_a = r_b = r_c = 1 / 3$

Ta có ma trận: 

$\begin{bmatrix}0 & 1/2 & 1/2\\0 & 0 & 1\\1 & 0 & 0\end{bmatrix}$

Ma trận này có được bằng cách lấy 1 chia đều cho số cạnh ra, ví dụ đỉnh A có 2 cạnh ra là AB và AC thì tương ứng vị trí của ma trận là $\begin{bmatrix}0 & 1/2 & 1/2\end{bmatrix}$, tương tự với các đỉnh còn lại.

+ Lặp vòng 1: 

$\begin{bmatrix}1/3 \\ 1/3 \\ 1/3\end{bmatrix} * \begin{bmatrix}0 & 1/2 & 1/2\\0 & 0 & 1\\1 & 0 & 0\end{bmatrix} = \begin{bmatrix}1/3 \\ 1/6 \\ 1/2\end{bmatrix}$

+ Lặp vòng 2: 

$\begin{bmatrix}1/3 \\ 1/6 \\ 1/2\end{bmatrix} * \begin{bmatrix}0 & 1/2 & 1/2\\0 & 0 & 1\\1 & 0 & 0\end{bmatrix} = \begin{bmatrix}1/2 \\ 1/6 \\ 1/3\end{bmatrix}$

+ Lặp vòng 3: 

$\begin{bmatrix}1/2 \\ 1/6 \\ 1/3\end{bmatrix} * \begin{bmatrix}0 & 1/2 & 1/2\\0 & 0 & 1\\1 & 0 & 0\end{bmatrix} = \begin{bmatrix}1/3 \\ 1/4 \\ 5/12\end{bmatrix}$

+ Lặp vòng 4: 

$\begin{bmatrix}1/3 \\ 1/4 \\ 5/12\end{bmatrix} * \begin{bmatrix}0 & 1/2 & 1/2\\0 & 0 & 1\\1 & 0 & 0\end{bmatrix} = \begin{bmatrix}5/12 \\ 1/6 \\ 5/12\end{bmatrix}$

Chúng ta có thể thấy sau 4 lần lặp, kết quả ở cách 3 tương ứng với kết quả ở cách 2.

Để nắm vững kiến thức, các bạn nên đọc thêm slide, làm thêm các bài tập về pagerank, chúc mọi người học tập tốt!

4/10/2022

Sinh viên CNTT kiếm tiền như nào? | Sharing


Sinh viên CNTT thì kiếm tiền như nào? Chắc hẳn là nhiều người sẽ có câu hỏi như vậy khi bắt đầu bước lên đại học và trong các năm học sau đó. Nếu các bạn lên Google và tìm kiếm thì chắc chắn ra rất nhiều kết quả với những công việc khác nhau. Trong bài viết này mình muốn chia sẻ thực tế về những gì mà bản thân mình đã làm hoặc những bạn bè thân thiết của mình từng làm để kiếm thêm thu nhập trong khoảng thời gian là sinh viên.


1. Làm gia sư

Khi còn là sinh viên năm 1-2, kiến thức chuyên ngành bạn chưa có nhiều, trong khi đó bạn vừa phải học các môn đại cương trên trường và những kiến thức từ cấp 3 vẫn còn nắm vững thì làm gia sư là một công việc rất hợp lý.

Gia sư nói chung là một công việc không quá vất vả, nhưng cũng đem lại nguồn thu nhập cũng gọi là ổn định cho các bạn sinh viên. Tuy nhiên mình cũng xin lưu ý tới các bạn khi nhận các lớp, nếu nhận được lớp dạy từ người quen hay bạn bè thì tốt, còn không nếu nhận lớp từ trung tâm thì nên tìm hiểu xem trung tâm đó có uy tín hay không, xem những review về trung tâm trên facebook trước khi cọc tiền. Nói đi cũng phải nói lại, các bạn đi dạy học hãy có một thái độ tốt, chuẩn bị tốt trước khi đi dạy, báo cáo tình hình học tập thường xuyên của học sinh cho phụ huynh. Khi các bạn dạy tốt lúc đó các bạn sẽ được các phụ huynh giới thiệu cho nhau để tới kèm con/em họ, khi đó các bạn còn có thể có lớp dạy mà không cần mất phí tìm lớp qua trung tâm.

2. Giải bài tập thuê trên các ứng dụng online

Cái này thì hình thức nó gần giống gia sư nhưng tự chủ được thời gian hơn một tí, các bạn có thể làm lúc nào các bạn thích. Thu nhập thì chưa chắc đã ổn định tùy vào mức độ chăm chỉ giải bài của bạn.

Trên mạng thì có rất nhiều app kiểu này, mình và một số bạn mình đã từng làm qua một app cũng khá ổn các bạn có thể tham khảo: QUANDA.

3. Đi thực tập

Khi vào tầm cuối năm 2, hoặc là năm 3, 4 lúc đó các bạn có thể nghĩ tới việc đi thực tập tại các công ty. Việc thực tập vừa giúp bạn học hỏi thêm kiến thức, văn hóa ở các công ty cũng giúp bạn có thêm một phần thu nhập từ tiền trợ cấp/lương từ công ty đó. Hầu hết các công ty công nghệ đều sẵn sàng trả cho các thực tập một mức trợ cấp/lương tầm 1-2-3-4 triệu mặc dù đa số các bạn chỉ vào công ty để học hỏi mà chưa đóng góp được gì cho công ty.

Đi thực tập giúp bạn vừa học hỏi được nhiều kiến thức mà cũng giúp bạn có được một nguồn thu nhập ổn định.

4. Làm freelancer

Công việc này đòi hỏi bạn phải có kinh nghiệm, kỹ năng rồi nên mình cũng ghi chú ở đây là dành cho các sinh viên tầm năm 3,4,5 khi mà các bạn đã trang bị cho mình một lượng kiến thức cụ thể và một ít kinh nghiệm khi đi thực tập và làm bài tập lớn trên trường.

Freelancer đơn giản là người ta thuê gì thì mình làm lấy, nhưng mà tìm kiếm các công việc freelancer qua đâu, một số các trang web tìm việc freelancer nổi tiếng tại Việt Nam mà các bạn có thể tìm hiểu như là:

Trên tất cả các kênh này đều lưu lại hồ sơ làm việc của bạn, đây cũng có thể là một vũ khí mạnh mẽ thuyết phục các nhà tuyển dụng sau này khi bạn nộp đơn vào một công ty làm việc.

Ngoài ra, thì bạn có thể nhận các công việc được giới thiệu từ người quen, những người thuê làm đồ án, bài tập lớn trên các group Facebook.

4/06/2022

Khai phá web | Tài liệu, chuyên ngành


Khai phá web là một môn tự chọn được dạy trong học phần kỹ sư của khoa học máy tính và kỹ thuật thuật máy tính. Bởi vì là một môn tự chọn nên các bạn hoàn toàn có thể chọn một môn khác thay thế môn này.

Với khai phá web các bạn sẽ được nhắc lại các kiến thức về Machine learning, Deep learning, một số các phần mới như là tìm kiếm thông tin. Ngoài ra thì các bạn sẽ được đi vào và giới thiệu tới các bài toán cụ thể như là: phân tích liên kết, phân tích quan điểm, trích rút thông tin, khai phá truy vấn & quảng cáo trực tuyến. 

Khi học về những năm cuối, nhất là những bạn theo định hướng hệ thống thông tin thì các bạn sẽ thấy các môn học có sự giao nhau rất nhiều, ví dụ như môn nhập môn khoa học dữ liệu các bạn sẽ thấy có 1 ít về các kiến thức Machine Learning đã được học, 1 ít kiến thức về tìm kiếm thông tin bên khai phá web, 1 ít kiến thức về bigdata đã được học ở lưu trữ và xử lý dữ liệu lớn cộng với 1 phần kiến thức mới là trực quan hóa dữ liệu. Điều này thì cũng hợp lý thôi, các môn học hay các lĩnh vực trong CNTT nói chung và KHMT nói riêng thì có sự liên quan chặt chẽ với nhau chứ không thể nói là môn này, lĩnh vực này tách riêng biệt hoàn toàn với các khác được. Tuy nhiên thì mỗi môn sẽ tập chung vào một phần chính như khi các bạn học nhập môn AI, nhập môn ML các bạn sẽ được tập chung chính vào giới thiệu các thuật toán, cách làm, làm như nào, tối ưu như nào, tức là học sâu về phần mô hình, còn khi học khai phá web các bạn sẽ được giới thiệu sâu hơn về phần ứng dụng như là ứng dụng các mô hình này vào các bài toán thực tế, còn trong nhập môn khoa học dữ liệu các bạn sẽ được học sâu hơn về phần xử lý và trực quan hóa dữ liệu.

Về nhận xét của mình về môn học thì môn học là một môn cũng khá hay, các bạn có thể chọn nó làm 1 trong 3 môn tự chọn kỹ sư của mình.

Thầy dạy môn này có thầy Nguyễn Kiêm Hiếu, thầy thì giao khá nhiều bài tập trong tuần, cũng như các bạn có thể phải làm các bài quizz nhỏ từng tuần. Tuy nhiên thì thầy chấm điểm cũng khá thoáng, học thầy các bạn cũng sẽ được nghe các buổi seminar do sinh viên của thầy trình bày cũng khá hay và thú vị. Các bạn có thể theo dõi website cá nhân của thầy Hiếu tại đây: https://users.soict.hust.edu.vn/hieunk/

Tài liệu môn học

- Slide môn học khai phá web: TẢI VỀ SLIDE
- Đề thi tham khảo khai phá web: TẢI VỀ ĐỀ THI THAM KHẢO

2/20/2022

Sinh viên nên sở hữu cho mình một blog cá nhân? | Share


Sinh viên có nên sở hữu cho mình một blog cá nhân? Với ý kiến của mình thì là có. Nhiều bạn có suy nghĩ: "uồi, viết có ai đọc đâu mà viết", nhưng thế thực sự là sai lầm, viết blog đâu chỉ phải là dành cho mọi người đọc đâu, viết blog đầu tiên là phải viết cho bản thân mình trước.

Đa số chúng ta đều không phải những thiên tài hay là những siêu trí nhớ, vì thế các kiến thức mà chúng ta từng biết, từng được học có thể quên đi vào một ngày nào đó, vì thế bạn viết blog là để lưu lại những kiến thức này để cho sau này bất cứ khi nào cần cũng có thể mang ra tra cứu lại.

Nếu bạn có kiến thức sâu về một phần nào đó như là cấu trúc dữ liệu, blockchain, mạng máy tính, hay là về các ngôn ngữ lập trình như Java, C++, C#,... Việc bạn viết blog chia sẻ về những kiến thức này sẽ giúp bạn có thể hệ thống lại lượng kiến thức này. Khi viết blog bạn sẽ có trách nhiệm hơn về kiến thức của mình, mặc dù là viết cho chính mình đi nữa thì cũng không thể viết lằng nhằng được, khi đó các bạn sẽ tự mình phải Google lại, tìm hiểu lại, xác minh lại kiến thức này đúng và đủ chưa, từ đó cũng sẽ giúp bạn củng cố được kiến thức.

Việc viết ra, viết lại những kiến thức của bạn cũng chính là một lần được học lại.

Trên blog, bạn cũng có thể viết lại những câu chuyện nào đó của bạn ở thời sinh viên, để sau này khi 10-20 năm sau xem lại chúng ta cũng có những kỷ niệm thực sự khó quên.

Viết blog có thể kiếm tiền! Dĩ nhiên là nếu kiếm được tiền thì blog của bạn phải có nhiều lượt xem và chắc chắn rằng lúc đó blog của bạn phải vượt qua mức là viết cho bản thân mình, lúc đó thì mỗi bài viết bạn viết ra sẽ phải cẩn thận hơn, chỉn chu hơn, vì lúc đó mỗi bài viết trên blog của bạn không phải dành cho bạn nữa mà là dành cho mọi người.

Vậy viết blog ở đâu, hiện nay có rất nhiều nền tảng để một người có thể tạo được một blog cá nhân một cách dễ dàng, mình biết đa số các bạn theo dõi website này đều là những sinh viên CNTT, vì thế mình gợi ý tới mọi người một số nền tảng mà dân CNTT hay sử dụng để làm blog cá nhân: 

1. Wordpress

Wordpress là một CMS và wordpress cũng rất là nổi tiếng rồi, trên internet cũng có rất nhiều bài viết nói về wordpress rồi, mình chỉ có một lưu ý là nếu bạn quan tâm tới wordpress thì hãy để ý phân biệt https://wordpress.org/ và https://wordpress.com/. Trong bài viết này hay rất nhiều các bài viết khác trên internet, khi nhắc tới wordpress thì các bạn hiểu rằng là đang nói tới https://wordpress.org/

Với Wordpress bạn hoàn toàn miễn phí khi sử dụng, nhưng bạn sẽ phải mất chi phí thuê hosting và mua tên miền, chi phí cũng khá là đắt đỏ nếu bạn đang là sinh viên. 

2. Github page

Github có lẽ không gì xa lạ với sinh viên CNTT, vậy việc tận dụng github page làm website cá nhân thì phải gọi là nhất cử lưỡng tiện. Với github page thì bạn sẽ có một blog cá nhân với đuôi .github.io, nghe khá là ngầu phải không, dĩ nhiên là bạn có thể thay thế bằng tên miền tùy chỉnh của mình.

Để bắt đầu với github page, hãy xem qua Thiết lập trang GitHub Pages với JekyllJekyllrb là công cụ sinh ra website tĩnh (static website), nói một cách chính xác nhất thì nó là text transformation engine (cỗ máy chuyển đổi text).

Với Jekyll github page bạn có một kho template phong phú, free thao hồ chọn lựa: 

Github page có thể mang lại cho bạn một blog cá nhân đẹp và hoàn toàn free, tuy nhiên thì để sử dụng github page thì bạn cũng cần một số kiến thức để có để chỉnh sửa và quản lý blog của mình.

3. Blogger

Blogger thì dễ sử dụng như wordpress và hoàn toàn miễn phí từ A-Z như github page vậy, blogger như là việc dung hòa giữa 2 ưu điểm của wordpress và github page vậy. Tuy nhiên đây lại là 2 ưu điểm duy nhất mà blogger đem lại. Nhược điểm lớn nhất của blogger chính là blog của bạn nhưng lại không phải của bạn. Mình nói thế nghĩa là sao, khi bạn tạo blog trên blogger thì blog là của bạn nhưng dữ liệu của bạn đang do Google lắm giữ và Google hoàn toàn có thể xóa blog của bạn bất cứ lúc nào nếu bạn vi phạm nguyên tắc, vì thế trong mọi trường hợp nếu sử dụng blogger hãy thường xuyên sao lưu lại dữ liệu của bạn đề phòng trường hợp xấu nhất xảy ra.

4. Viblo

Viblo giống như mạng xã hội công nghệ thông tin vậy, bạn đăng kí tài khoản và viết những bài viết trên nền tảng mà viblo cung cấp. Viblo có sẵn lượng thành viên và lượt truy cập khổng lồ, vì thế khi viết blog trên viblo bạn có thể đem bài viết của bạn ngay tới hàng triệu người. Nhưng dĩ nhiên rồi, bạn viết bạn trên nền tảng của người khác thì ngoài viết bài và viết bài ra thì bạn không thể làm thêm được gì như là việc thay đổi giao diện,...

2/06/2022

Nhập môn học máy và khai phá dữ liệu | Tài liệu, sở sở ngành CNTT


Học máy là một lĩnh vực của trí tuệ nhân tạo liên quan tới việc nghiên cứu và xây dựng các kỹ thuật cho phép các hệ thống học tự động để giải quyết những vấn đề cụ thể. Nếu bạn đã học qua môn nhập môn trí tuệ nhân tạo thì ắt hẳn đã có một chương giới thiệu về học máy và 2 bài toán với 2 phương pháp kinh điển trong học máy đó là phân loại văn bản với Naive Bayes và phân cụm với KNN. Với môn học này, chúng ta sẽ được tìm hiểu kĩ hơn, sâu hơn, được giới thiệu nhiều phương pháp hơn, cách làm quen và sử dụng thư viện,...

Với các bạn học kỹ thuật máy tính thì môn này thuộc học phần kỹ sư và các bạn cũng không được học môn nhập môn trí tuệ nhân tạo nên có thể là một môn mới mẻ, còn đối với các bạn học khoa học máy tính, mặc dù có 2 bài nói về học máy thôi nhưng một số thầy/cô thường nói nhiều hơn về những gì được đề cập trong slide nên có thể những kiến thức trong môn học này có một số đã là kiến thức cũ mà các bạn đã từng được học qua. 

Môn này có một số thầy/cô dạy và các thầy/cô đều dạy rất hay, mỗi người đều có những nét đặc biệt riêng. Nếu bạn học thầy Nguyễn Nhật Quang thì bạn sẽ được học khá bài bản, tuy nhiên thì thầy chỉ dạy tập chung những gì trong slide, nếu bạn không có định hướng theo AI thì học thầy Quang là khá hợp lí, nếu bạn học thầy Ngô Văn Linh thì sẽ được nghe thêm rất nhiều kiến thức mà thầy nói thêm, các vấn đề nâng cao mà mình nghĩ bạn nào có định hướng theo AI thì nên học thầy Linh.

Thầy Khoát có một kênh youtube và các video bài giảng về học máy, các bạn muốn xem và học trước có thể xem tại: https://youtu.be/jc1wo_8VA1w

BÀI TẬP LỚN

Bài tập lớn thì sẽ xung quanh các vấn đề về học máy rồi, nếu các bạn học thầy Quang thì yêu cầu về bài tập lớn sẽ đơn giản hơn khi học thầy Linh, các chủ đề bài tập lớn xoay quanh các chủ đề kinh điển như là: 
- Các bài toán phân loại (phân loại văn bản, phân loại thư rác, phân loại hoa iris)
- Các bài toán nhận dạng (nhận dạng chữ viết, nhận dạng khuôn mặt, nhận dạng biển số xe,...)
- Các bài toán dự đoán (dự đoán giá nhà, dự đoán giá xe máy) 
- ...

TÀI LIỆU MÔN HỌC

- Tải về slide thầy Quang: TẢI VỀ SLIDE

- Tải về slide thầy Linh: TẢI VỀ SLIDE

THI CUỐI KÌ

Về đề thi cuối kì, do ảnh hưởng của dịch nên chúng ta cũng chưa thể biết trước là sẽ thi cuối kì dạng trắc nghiệm hay tự luận nên các bạn phải chú ý thông báo của thầy/cô giáo trong mail hoặc trên qldt. 

1/27/2022

Phân tích và thiết kế hệ thống | Tài liệu, cơ sở ngành CNTT


Nếu các bạn học môn công nghệ phần mềm trước thì có lẽ các bạn đã được giới thiệu và làm quen trước về một số các biểu đồ như biểu đồ use-case, biểu đồ luồng, biểu đồ hoạt động, biểu đồ lớp,... Với môn phân tích và thiết kế hệ thống thì chính xác là các bạn được học lại nhưng mà đi một cách kĩ càng hơn khi phân tích và vẽ các biểu đồ trên.

Ở OOP thì các bạn được làm quen với 2 biểu đồ là biểu đồ use-case và biểu đồ lớp, sang tới công nghệ phần mềm các bạn được giới thiệu và làm quen với nhiều các loại biểu đồ hơn và tới phân tích thiết kế hệ thống các bạn sẽ được làm quen với gần như tất cả các loại biểu đồ đó là: 

  • Biểu đồ lớp 
  • Biểu đồ đối tượng
  • Biểu đồ triển khai 
  • Biểu đồ gói 
  • Biểu đồ thành phần 
  • Biểu đồ cấu trúc đa hợp
  • Biểu đồ ca sử dụng (use-case)
  • Biểu đồ hoạt động 
  • Biểu đồ trình tự 
  • Biểu đồ giao tiếp 
  • Biểu đồ máy trạng thái
  • Biểu đồ thời gian
  • Biểu đồ tổng quan tương tác

Mỗi biểu đồ sẽ đặc trưng cho một giai đoạn, góc nhìn trong quy trình phát triển phần mềm của bạn. Theo mình được biết thì việc vẽ những biểu đồ này sẽ nằm trong phần công việc của một BA (Business Analyst), dĩ nhiên là một lập trình viên ít nhất cũng phải nhìn được hiểu các biểu đồ này.

Môn học này là môn đi học chỉ học biểu đồ và làm bài tập lớn hay đi thi thì cũng chỉ thi vẽ biểu đồ thôi. Nhìn chung thì bước phân tích và thiết kế là một bước rất quan trọng trong quy trình phát triển phần mềm, tuy nhiên đôi khi đi làm ở công ty hay là các bài tập lớn ở trường thì chúng ta thường bỏ qua bước này mà bước ngay vào bước viết mã nguồn cho phần mềm sau đó dùng các công cụ để gen lại các biểu đồ dí vào báo cáo cho có, nhưng đấy là các môn khác thôi với môn này các bạn làm bài tập lớn sẽ không cần code và chỉ phải phân tích và thiết kế. 

Môn này có một số thầy dạy, tuy nhiên mình thấy thầy dạy hay nhất là thầy Nguyễn Nhật Quang, thầy dạy rất tỉ mỉ, giải thích rõ từng phần một, điểm thì thầy cho cũng khá thoải mái, các bạn có thể xem qua website cá nhân của thầy Quang TẠI ĐÂY.

Một số tài liệu dành cho môn học: 

- Slide bài giảng - thầy Nguyễn Nhật Quang: TẢI VỀ SLIDE BÀI GIẢNG

- Một số đề thi cuối kì môn phân tích và thiết kế hệ thống: TẢI VỀ ĐỀ THI THAM KHẢO

Một số tài liệu tham khảo thêm: 

- Thực hành về xây dựng biểu đồ use-case: TẢI VỀ TÀI LIỆU

- Thực hành về xây dựng biểu đồ lớp, biểu đồ trạng thái: TẢI VỀ TÀI LIỆU

- Tham khảo biểu đồ use-case chi tiết: TẢI VỀ TÀI LIỆU

Tài liệu khác: 

- Tài liệu phân tích thiết kế hệ thống thông tin - PTIT: TẢI VỀ GIÁO TRÌNH

1/24/2022

Tổng hợp các câu hỏi về Apache Spark | Ôn tập cuối kì môn Lưu trữ và xử lý dữ liệu lớn


Xem phần trước: Tổng hợp các câu hỏi về Apache Hadoop | Ôn tập cuối kì môn Lưu trữ và xử lý dữ liệu lớn


Số thứ tự Câu hỏi Đáp án Câu Trả Lời
1 Spark được phát triển bằng ngôn ngữ nào A. Java
B. Scala
C. Python
D. R
B
2 Trong Spark Streaming dữ liệu có thể lấy từ những nguồn nào? A. Kafka
B. Flume
C. Kinesis
D. Tất cả
D
3 Apache Spark có API cho các ngôn ngữ: A. Java
B. Scala
C. Python
D. Tất cả
D
4 Đâu không phải là một thành phần trong hệ sinh thái Spark? A. Sqoop
B. GraphX
C. MLlib
D. BlinkDB
A
5 Cấu trúc dữ liệu cơ bản của Spark Streaming là gì? A. DStream
B. RDD
C. Shared Variable
D. Không có trong số đáp án trên
A
6 Thuật toán nào sau đây không có trong Spark MLlib A. Streaming Linear Regression
B. Streaming KMeans
C. Tanimoto distance
D. Không có trong các phương án trên
C
7 DStream là gì? A. Chuỗi các RDD liên tục
B. Chuỗi Dataframe liên tục
C. Chuỗi Dataset liên tục
D. Không có trong các phương án trên
A
8 Đâu không phải là một đặc điểm của Spark A. Hỗ trợ xử lý tính toán trên RAM
B. Tính chịu lỗi
C. Tiết kiệm chi phí
D. Tương thích với hệ thống lưu trữ tệp khác
C
9 Đâu không phải là một ouput operation của DStream A. SaveAsTextFiles
B. ForeachRDD
C. SaveAsHadoopFiles
D. ReduceByKeyAndWindow
D
10 Apache Spark có khả năng xử lý hàng loạt khi chạy trên RAM nhanh hơn bao nhiêu lần so với MapReduce A. 10
B. 20
C. 100
D. 200
C
11 Đâu là lý do khiến Spark nhanh hơn MapReduce A. Công cụ thực thi DAG và tính toán trên RAM
B. Hỗ trợ cho việc sử dụng nhiều ngôn ngữ khác nhau như Scala; Java; Python; R
C. RDD là bất biến và có khả năng chịu lỗi cao
D. Không có trong các phương án trên
A
12 Điều nào sau đây là đúng khi nói về RDD A. RDD là một mô hình lập trình
B. RDD là một tập hợp đối tượng bất biến
C. Là database
D. Không có trong các phương án trên
B
13 Khả năng chịu lỗi của RDD thể hiện qua đâu? A. Tính bất biến của RDD
B. DAG (Directed Acyclic Graph)
C. Lazy-evaluation
D. Không có trong các phương án trên
14 Đầu vào dữ liệu cho chương trình Spark có thể là: A. Local files
B. HDFS; NFS
C. Amazon S3; Elasticsearch
D. Cả 3 phương án trên
D
15 Đâu là lệnh lưu dữ liệu ra ngoài chương trình Spark? A. input.saveAsTextFile('file:///usr/zeppelin/notebook/dataset/new.txt')
B. input.saveAsTextFile('/usr/zeppelin/notebook/dataset/new.txt')
C. input.saveAs('file:///usr/zeppelin/notebook/dataset/new.txt')
D. input.saveAsTextFile:'file:///usr/zeppelin/notebook/dataset/new.txt'
A
16 Đâu là cách submit đúng một job lên Spark cluster hoặc chế độ local A. ./spark-submit wordcount.py README.md
B. ./spark-submit README.md wordcount.py
C. spark-submit wordcount.py README.md
D. Phương án A và C
A
17 Câu lệnh MapReduce trong Spark dưới đây chia mỗi dòng thành từ dựa vào delimiter nào: input.flatMap(lambda x: x.split('\t')).map(lambda x: (x;1)).reduceByKey(add) A. Tab
B. Dấu cách
C. Dấu hai chấm
D. Dấu phẩy
A

Tham khảo: https://data-flair.training/