Gợi ý mã cho tệp chưa hoàn chỉnh

Một phần của tài liệu (LUẬN văn THẠC sĩ) ứng dụng mô hình ngôn ngữ ngữ nghĩa thống kê trong gợi ý mã cho ngôn ngữ c (Trang 34 - 61)

Giả sử đầu vào của chúng ta là một tệp chưa đầy đủ như trong hình 3.9. Thông tin chưa đầy đủ được xác định tại dòng 17 là “int d = b +”. Biểu diễn nghĩa vị của toàn bộ tệp này là khá dài, nên duy nhất chuỗi nghĩa vị của dòng 16 và 17 sẽ được liệt kê như sau:

TYPE(short) -- 1

VAR(short int, var) -- 2 OP(ass_equal) -- 3 LIT(int) -- 4 TYPE(int) -- 5 VAR(int, var) -- 6 OP(ass_equal) -- 7 VAR(int, var) -- 8 OP(ari_add) -- 9

Cho rằng các nghĩa vị của hai dòng 16 và 17 được đánh số thứ tự từ 1 đến 9 (Tất cả các nghĩa vị được đánh số thứ tự từ 1 đến phần tử cuối cùng). Xét một chuỗi 6- gram từ vị trí thứ 4 đến vị trí thứ 9 là [4, 5, 6, 7, 8, 9]. Vị trí tiếp theo (sau 9) sẽ là từ tố cần được gợi ý. Việc mở rộng từ tố liên quan gồm hai bước. Bước một là trích xuất các tập con (tập liên quan) của chuỗi này, mỗi tập liên quan được trích xuất bởi sử dụng một vòng lặp for có biến đếm tăng một đơn vị sau mỗi vòng lặp và duyệt từ trái sang phải để lấy ra tập con từ vị trí đếm đến vị trí kết thúc của chuỗi. Theo như đó, xét chuỗi 6-gram ở trên ta thu được các tập liên quan như sau: [4, 5, 6, 7, 8, 9], [5, 6, 7, 8, 9], [6, 7, 8, 9], [7, 8, 9], [8, 9], [9]. Bước hai là duyệt từng tập liên quan vừa thu được và kiểm tra sự tồn tại của các tập này trong cây tiền tố (cây tiền tố này chứa tất cả các

n-gram của các tệp mã nguồn đã được huấn luyện và lưu trữ các thông tin cần thiết khác), nếu tồn tại chúng ta lấy ra tất cả các tập con có thể được sinh ra từ tập này và tính trọng số cho từng tập con. Trọng số của từng tập con được tính bằng cách lấy số lần xuất hiện của tập này chia cho tổng số lần xuất hiện các tập con của tập liên quan. Ví dụ, tập liên quan [7, 8, 9] thuộc cây tiền tố, và có các tập con là [7, 8, 9, 11] xuất hiện 2 lần, [7, 8, 9, 1] xuất hiện 1 lần, và [7, 8, 9, 15] xuất hiện 3 lần. Như vậy, tổng số tập con của tập liên quan [7, 8, 9] là 6 và vì thế ta tính được trọng số (weight) của các tập con như sau:

weight[7, 8, 9, 11] = 2/6 weight[7, 8, 9, 1] = 1/6 weight[7, 8, 9, 15] = 3/6

Tương tự ta sẽ tính được trọng số cho tất cả các tập con của các tập liên quan. Nút có chỉ số là 11 được coi là nút có thể được mở rộng. Như trên chúng ta đã tính trọng số của nút có chỉ số 11 trong tập [7, 8, 9, 11], nhưng cũng có trường hợp nút có chỉ số 11 sẽ thuộc một tập con của một tập liên quan khác. Ví dụ, tập liên quan [8, 9] có tập con là [8, 9, 11] và trọng số weight[8, 9, 11] = 3/6. Để thu được một danh sách các tập hợp mà có các nút mở rộng là duy nhất, cùng với trọng số là lớn nhất chúng ta sẽ loại tập con weight[7, 8, 9, 11] vì trọng số của tập con này là 2/6 nhỏ hơn 3/6 của

tập [8, 9, 11]. Tập con [8, 9, 11] với trọng số 3/6 và nút mở rộng 11 được lưu trữ lại. Theo như đó tất cả các trường hợp khác cũng được xét tương tự.

Qua quá trình mở rộng từ tố liên quan, chúng ta đã thu được một danh sách các từ tố có thể mở rộng cùng trọng số tương ứng. Tiếp theo, chúng ta xét các cặp giá trị (sự kết hợp của từ tố có chỉ số 9 với một từ tố khác) có thể xuất hiện cùng nhau (mục 2.2.3), ta cũng tính được các trọng số (trọng số của một cặp giá trị chính xác là lấy tỷ lệ của số lần xuất hiện cặp giá trị này so với tổng số lần xuất hiện của tất cả các cặp giá trị có chứa từ tố có chỉ số 9) và lưu trữ vào một danh sách.

Cuối cùng, kiểm tra sự kết hợp của chuỗi 6-gram ban đầu với từng phần tử trong danh sách các từ tố có thể mở rộng (ta được chuỗi 7-gram) liệu có tồn tại trong bảng từ điển n-gram (bảng từ điển n-gram thu được sau quá trình huấn luyện) hay không. Nếu sự kết hợp nào không tồn tại sẽ được gán trọng số bằng 0. Ngược lại, sự kết hợp tồn tại sẽ được tính trọng số bởi công thức 3.1:

weight = 𝑇𝑜𝑝𝑖𝑐𝐷𝑜𝑐𝑠_𝑅𝑎𝑡𝑖𝑜(𝑝𝑟𝑒𝑑𝑖𝑐𝑡)

𝑇𝑜𝑐𝑝𝑖𝑐𝐷𝑜𝑐𝑠_𝑅𝑎𝑡𝑖𝑜(𝑞𝑢𝑒𝑟𝑦) (3.1)

Trong đó, query là chuỗi 6-gram ban đầu, predict là chuỗi 7-gram được tạo ra bởi sự kết hợp chuỗi 6-gram ban đầu và một phần tử trong danh sách các từ tố có thể mở rộng. TopicDocs_Ratio là một danh sách lưu trữ tỷ lệ của n-gram cụ thể mang topic k so với tổng số n-gram mang topic k. Ví dụ, ta có n-gram g, thì Topicdocs_Ratio(g) được tính theo công thức 3.2.

TopicDocs_Ratio(g) = 𝑆ố 𝑙ầ𝑛 𝑥𝑢ấ𝑡 ℎ𝑖ệ𝑛 𝑐ủ𝑎 𝑛−𝑔𝑟𝑎𝑚 𝑔 𝑚𝑎𝑛𝑔 𝑡𝑜𝑝𝑖𝑐 𝑘

𝑇ổ𝑛𝑔 𝑠ố 𝑛−𝑔𝑟𝑎𝑚 𝑚𝑎𝑛𝑔 𝑡𝑜𝑝𝑖𝑐 𝑘 (3.2)

Tiếp theo, chúng ta tính điểm liên quan sử dụng phương pháp tính tổng trọng số theo công thức 2.10. Danh sách nhận được sau cùng lưu trữ các tổng trọng số đã qua kết hợp các yếu tố và các tiền tố có thể mở rộng. Sắp xếp lại danh sách này với trọng số giảm dần và lấy ra 20 phần tử đầu tiên có trọng số cao nhất. Xét từng phần tử, nếu là biến và phù hợp ngữ cảnh cũng như phạm vi thì chuyển đổi thành từ vựng lưu trữ trong danh sách gợi ý. Cuối cùng, danh sách gợi ý thu được nếu khác rỗng sẽ được hiển thị.

3.3 Sơ đồ thuật toán

Trong mục này luận văn sẽ trình bày một số sơ đồ thuật toán chính để xây dựng

chương trình áp dụng SLAMC trong gợi ý mã cho ngôn ngữ C. Danh sách các sơ đồ

như sau:

 Sơ đồ thuật toán ở mức tổng quan

 Sơ đồ thuật toán duyệt cây cú pháp trừu tượng

 Các sơ đồ thuật toán huấn luyện

o Sơ đồ thuật toán huấn luyện n-gram

o Sơ đồ thuật toán huấn luyện mô hình n-gram chủ đề o Sơ đồ thuật toán huấn luyện cặp giá trị

o Sơ đồ thuật toán mở rộng từ tố liên quan o Sơ đồ thuật toán tính điểm liên quan

o Sơ đồ thuật toán kiểm tra sự phù hợp ngữ cảnh

o Sơ đồ thuật toán biến đổi từ dạng ngữ nghĩa sang từ vựng

3.3.1 Sơ đồ thuật toán ở mức tổng quan

Bắt đầu

Các file nguồn

Chuyển đổi sang cây cú pháp trừu tượng và

duyệt cây Trích xuất và lưu trữ

danh sách các

n-gram

- Huấn luyện n-gram chủ đề

- Huấn luyện cặp giá trị

Gợi ý mã

Kết thúc

Hình 3. 10. Sơ đồ thuật toán áp dụng SLAMC trong gợi ý mã cho ngôn ngữ C [8]

Hình 3.10 biểu diễn thuật toán áp dụng SLAMC trong gợi ý mã cho ngôn ngữ C. Đầu vào của chương trình là danh sách các tệp mã nguồn. Sau đó, chương trình sử dụng thư viện Eclipse CDT parser để chuyển đổi mã nguồn từ các tệp mã nguồn sang cây cú pháp trừu tượng và duyệt cây. Tiếp theo, chương trình trích xuất và lưu trữ

danh sách các n-gram. Sau khi đã có danh sách n-gram, chương trình thực hiện huấn luyện theo chủ đề và kết xuất các cặp giá trị có tần suất xuất hiện lớn. Cuối cùng, chương trình thực hiện tiến trình gợi ý mã nhằm đưa ra các từ tố phù hợp nhất với ngữ cảnh và phạm vi.

3.3.2 Sơ đồ thuật toán duyệt cây cú pháp trừu tượng

Bắt đầu

Cây cú pháp trừu tượng

Duyệt từng nút trên cây

Kết thúc Nút có vấn đề

Duyệt từng từ tố được lưu trữ bởi nút này. Kiểm tra loại của từ tố (kiểu dữ liệu, biến, …) để lưu trữ

Đúng

Trích xuất và lưu trữ các thông tin cần thiết như: kiểu

dữ liệu, tên biến, giá trị, ... Sai

Kiểm tra đã duyệt hết các nút hay chưa

Đúng Sai

Hình 3. 11. Sơ đồ thuật toán duyệt cây cú pháp trừu tượng

Hình 3.11 mô tả thuật toán duyệt cây cú pháp trừu tượng. Đầu vào của thuật toán là một cây cú pháp trừu tượng. Chương trình duyệt từng nút của cây theo thứ tự từ nút cha đến nút con. Đầu ra của thuật toán là tất cả các thông tin cần thiết như kiểu

dữ liệu, tên biến, … được sử dụng cho các tính toán tiếp theo (ví dụ: huấn luyện mô hình n-gram chủ đề, gợi ý mã, …).

3.3.3 Các sơ đồ thuật toán huấn luyện

3.3.3.1 Sơ đồ thuật toán huấn luyện n-gram

Bắt đầu - Tỷ lệ huấn luyện - Điểm bắt đầu - Danh sách tệp và các từ tố tương ứng - Danh sách tuần tự các từ tố - Giá trị tối đa n

- Tính và lưu trữ các file được huấn luyện - Lưu trữ các file sử dụng để kiểm thử Tính và lưu trữ danh sách các n-gram Kết thúc

Hình 3. 12. Sơ đồ thuật toán huấn luyện n-gram [8]

Hình 3.12 trình bày sơ đồ thuật toán huấn luyện n-gram. Đầu vào của thuật toán gồm có tỷ lệ huấn luyện, điểm bắt đầu huấn luyện, danh sách các tệp và từ tố tương ứng, danh sách tuần tự các từ tố, và giá trị tối đa n. Đầu tiên thuật toán tính và lưu trữ các tệp được sử dụng cho việc huấn luyện dựa vào tỷ lệ và điểm bắt đầu huấn luyện. Theo như đó, các tệp không nằm trong danh sách được huấn luyện sẽ thuộc danh sách tệp sử dụng cho việc kiểm thử. Sau đó, thuật toán tính và lưu trữ danh sách các n-gram tương ứng theo từng tệp. Các n-gram có kích cỡ tối đa là n.

3.3.3.2 Sơ đồ thuật toán huấn luyện n-gram chủ đề Bắt đầu Bắt đầu - Tập từ vựng n-gram - Các tham số làm mịn α, β - Số chủ đề K - Số vòng lặp Nt Tính và lưu trữ phân phối từ tố Tính và lưu trữ tỷ lệ chủ đề Kết thúc Kiểm tra đã lặp hết Nt lần hay chưa Đúng Sai

Hình 3. 13. Sơ đồ thuật toán huấn luyện n-gram chủ đề [8]

Hình 3.13 chỉ ra sơ đồ thuật toán huấn luyện n-gram chủ đề. Đầu vào của thuật toán gồm có tập từ vựng n-gram được thu thập từ các tệp mã nguồn, các tham số làm mịn α, β, số chủ đề K và số vòng lặp Nt. Qua quá trình tính toán, danh sách phân phối từ tố và tỷ lệ chủ đề được lưu trữ.

3.3.3.3 Sơ đồ thuật toán huấn luyện cặp giá trị Bắt đầu Bắt đầu Danh sách tuần tự các từ tố theo từng tệp mã nguồn Trích xuất và lưu trữ tất cả các cặp giá trị cũng

như số lần xuất hiện tương ứng với từng cặp

Loại bỏ những cặp giá trị có số lần xuất hiện thấp

Kết thúc

Hình 3. 14. Sơ đồ thuật toán huấn luyện cặp giá trị [8]

Hình 3.14 biểu diễn thuật toán huấn luyện cặp giá trị từ tất cả các tệp mã nguồn. Danh sách tuần tự các từ tố của từng tệp mã nguồn sẽ là thông tin đầu vào của thuật toán. Chương trình sẽ trích xuất và lưu trữ tất cả các cặp giá trị trong thân hàm và số lần xuất hiện tương ứng với từng cặp. Sau đó, để tránh cho việc lưu trữ quá nhiều cặp giá trị không có ý nghĩa, việc loại bỏ những cặp giá trị có số lần xuất hiện thấp là điều cần thiết. Danh sách thu được sau cùng là hữu ích cho việc gợi ý mã.

3.3.4 Sơ đồ thuật toán gợi ý mã

Bắt đầu

- Danh sách các nghĩa vị

- Các thông tin được lưu trữ trong mô hình n-gram chủ đề

- Danh sách các cặp giá trị - Bảng từ điển n-gram - Cây tiền tố

- Mở rộng từ tố liên quan - Tính toán điểm liên quan - Kiểm tra sự phù hợp ngữ cảnh

Biến đổi từ dạng ngữ nghĩa sang từ vựng và in ra màn

hình

Kết thúc

Hình 3. 15. Sơ đồ thuật toán gợi ý mã [8]

Hình 3.15 mô tả thuật toán gợi ý mã. Thông tin đầu vào gồm có danh sách các nghĩa vị biểu diễn ngữ nghĩa của các từ tố được trích xuất từ các tệp mã nguồn, các thông tin được lưu trữ trong mô hình n-gram chủ đề (ví dụ: số chủ đề, tỷ lệ chủ đề, …), danh sách các cặp giá trị, bảng từ điển n-gram, và cây tiền tố. Chương trình thực hiện các bước tính toán như mở rộng từ tố liên quan, tính điểm liên quan, kiểm tra sự phù hợp ngữ cảnh, biến đổi từ dạng ngữ nghĩa sang từ vựng, và in ra màn hình.

3.3.4.1 Sơ đồ thuật toán mở rộng từ tố liên quan

Bắt đầu

- Chuỗi truy vấn - Cây tiền tố

Trích xuất các tập liên quan của chuỗi truy vấn

Duyệt từng tập liên quan

Kết thúc Tồn tại trong cây

tiền tố

Lấy ra tất cả các tập con của tập liên quan và tính

trọng số Đúng

Sai

Kiểm tra đã duyệt hết các tập liên quan hay chưa

Đúng Sai

Hình 3. 16. Sơ đồ thuật toán mở rộng từ tố liên quan [8]

Hình 3.16 biểu diễn thuật toán mở rộng từ tố liên quan. Đầu vào của thuật toán là chuỗi được sử dụng để truy vấn (chuỗi này được biểu diễn dưới dạng mảng, mỗi

phần tử của mảng tương ứng với một phần tử của chuỗi). Thuật toán gồm hai bước chính như sau:

 Bước 1: Trích xuất các tập liên quan của chuỗi truy vấn

 Bước 2: Duyệt từng tập liên quan đã thu được ở bước 1 và kiểm tra sự tồn tại

trên cây tiền tố. Nếu tập liên quan nào tồn tại trên cây tiền tố thì lấy ra tất cả các tập con của tập liên quan này và tính trọng số.

3.3.4.2 Sơ đồ thuật toán tính điểm liên quan

Bắt đầu

- Trọng số của các từ tố liên quan

- Trọng số của các cặp giá trị

- Trọng số dựa trên mô hình n-gram chủ đề

Tính tổng trọng số của các từ tố liên quan, các cặp giá trị và mô hình n-gram chủ đề

Kết thúc

Sắp xếp danh sách trọng số vừa thu được theo thứ tự giảm dần và lấy ra 20 phần tử đưa vào một danh sách

Hình 3. 17. Sơ đồ thuật toán tính điểm liên quan [8]

Hình 3.17 mô tả thuật toán tính điểm liên quan. Đầu vào của thuật toán gồm có trọng số của các từ tố liên quan, trọng số của các cặp giá trị và trọng số dựa trên mô hình n-gram chủ đề. Chương trình thực hiện tính tổng các trọng số và lưu trữ vào một danh sách. Sắp xếp lại các phần tử trong danh sách này theo thứ tự giảm dần của các tổng trọng số. Sau đó, lấy ra 20 phần tử đầu tiên trong danh sách sau khi được sắp xếp

đưa vào một danh sách mới. Danh sách mới này được gọi là danh sách được xếp hạng và là đầu vào cho thuật toán kiểm tra sự phù hợp ngữ cảnh.

3.3.4.3 Sơ đồ thuật toán kiểm tra sự phù hợp ngữ cảnh

Bắt đầu - Danh sách các phần tử được xếp hạng - Bảng từ điển n-gram Thực hiện duyệt từng phần tử trong danh sách các phần tử được xếp hạng Kết thúc Phần tử là biến Sai Đúng Kiểm tra ngữ cảnh

Lưu trữ vào một danh sách Đúng

Sai

Kiểm tra đã duyệt hết các phần tử trong

danh sách hay chưa

Đúng Sai

Hình 3.18 chỉ ra sơ đồ thuật toán kiểm tra sự phù hợp ngữ cảnh. Danh sách các phần tử được xếp hạng và bảng từ điển n-gram là đầu vào của thuật toán. Chương trình thực hiện duyệt từng phần tử trong danh sách các phần tử được xếp hạng và kiểm tra phần tử này có phải là biến hay không. Nếu không phải thì chuyển sang duyệt phần tử tiếp theo. Ngược lại, tiếp tục kiểm tra phần tử này có phù hợp với ngữ cảnh hay không. Nếu phù hợp ngữ cảnh thì phần tử đang xem xét sẽ được lưu trữ vào một danh sách và danh sách này sẽ là đầu vào cho thuật toán biến đổi từ dạng ngữ nghĩa sang từ vựng.

3.3.4.4 Sơ đồ thuật toán biến đổi từ dạng ngữ nghĩa sang từ vựng

Bắt đầu

- Danh sách các phần tử phù hợp ngữ cảnh

- Danh sách các biến với kiểu dữ liệu tương ứng của file đang được xem xét gợi ý mã

Duyệt từng phần tử trong danh sách các phần tử phù hợp ngữ cảnh và biến đổi

thành dạng từ vựng

Kết thúc

Lưu trữ vào danh sách gợi ý mã

Một phần của tài liệu (LUẬN văn THẠC sĩ) ứng dụng mô hình ngôn ngữ ngữ nghĩa thống kê trong gợi ý mã cho ngôn ngữ c (Trang 34 - 61)

Tải bản đầy đủ (PDF)

(61 trang)