Huấn luyện mô hình n-gram chủ đề và kết hợp cặp giá trị

Một phần của tài liệu Ứ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 33)

Chương trình mô phỏng thực hiện huấn luyện mô hình n-gram chủ đề cho ngôn

ngữ C theo thuật toán như trong hình 2.1. Từ những thông tin đã được trích xuất sau khi duyệt cây cú pháp như các hàm, các toán tử, các kiểu dữ liệu, các biến, … chương trình sẽ thực hiện khởi tạo ngẫu nhiên các biến tiềm ẩn như tỷ lệ chủ đề θ và các bài tập chủ đề zi, sau đó việc tính phân phối từ tố cũng như tính lại tỷ lệ chủ đề được tiến hành. Qua quá trình huấn luyện n-gram chủ đề, chúng ta thu được một tập từ vựng V,

phân phối từ tố φk,l , tỷ lệ chủ đề θ, và mỗi tệp mã nguồn sẽ được biểu diễn tương ứng bởi một chuỗi s.

Tiếp theo, việc huấn luyện sự kết hợp của các cặp giá trị được thực hiện. Trong chương trình mô phỏng này chỉ xét các cặp giá trị trong phạm vi của cùng một hàm. Sau đó, lưu trữ tất cả các cặp giá trị, số lần xuất hiện và xác suất xuất hiện tương ứng với các cặp giá trị nhằm sử dụng cho các tính toán về sau.

3.2.4Gợi ý mã

Trong mục này luận văn sẽ trình bày cách thức đưa ra danh sách các từ tố có thể được gợi ý. Đầu vào của chương trình là một tệp mã nguồn C chưa hoàn chỉnh. Chương trình sẽ xác định vị trí gặp nút có vấn đề là nút hiện thời và thực hiện một số bước để có thể đưa ra danh sách các từ tố được gợi ý phù hợp hoặc cũng có thể không có gợi ý nào được đưa ra. Các bước lần lượt là:

 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ới các biểu mẫu từ vựng

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <iostream> #include <stdio.h> struct Books { char title[50]; char author[50]; char subject[100]; int book_id; } book; int a = 11; void suggest(){ int b = 6; short c = 4; int d = b + }

Hình 3. 9. Gợi ý mã cho tệp chưa hoàn chỉnh

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ị.

Một phần của tài liệu Ứ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 33)