Các thuộc tính cho tìm
url, part–of–url, 1–tokens: −2 . . . 2 → [w-2], [w-1], [w0], [w1], [w2]
address-word, 2–tokens: −2 . . . 2 → [w-2 w-1], [w-1 w0], [w0 w1], [w1
w2]
day–word, time–word, 3–tokens: −2 . . . 2 → [w-2 w-1 w0], [w-1 w0 w1], [w0 w1
w2] period–word, 4–tokens: −3 . . . 3 → [w-3 w-2 w-1 w0] . . . [w0 w1 w2 w3] app–name, street–name, 5–tokens: −4 . . . 4 → [w-4 w-3 w-2 w-1 w0] . . . [w0 w1 w2 w3 w4] organization–word, contact–word, 6–tokens: −5 . . . 5 → [ww2 w3 w4 w5] -5 w-4 w-3 w-2 w-1 w0] . . . [w0 w1 location–word, province–name 7–tokens: −6 . . . 6 → [ww1 w2 w3 w4 w5 w6] -6 w-5 w-4 w-3 w-2 w-1 w0] . . . [w0 Ví dụ tìm kiếm tên đường trong từ điển như sau: Trong câu “tìm đường đến ngã tư nguyễn trãi khuất duy tiến”.
Xét với câu trên với kích thước cửa sổ bằng 7, giả sử lấy vị trí 0 làm vị trí trung tâm là từ “trãi” trong câu để xét với các từ lân cận với vị trí hiện tại này ta thu được các mẫu ngữ cảnh cụ thể như sau:
Bảng 3.9: Ví dụ các mẫu ngữ cảnh khi tìm kiếm trong từ điển cho tên đƣờng phố
Các mẫu ngữ cảnh sinh ra khi quét với cửa sổ bằng 7
4w:-3:-2:-1:0:ngã:tư:nguyễn:trãi 3w:-2:-1:0:tư:nguyễn:trãi 2w:-1:0:nguyễn:trãi => -1:0:dict-strname 1w:0:trãi 2w:0:1:trãi:khuất 3w:0:1:2:trãi:khuất:duy 4w:0:1:2:3:trãi:khuất:duy:tiến
Bằng quan sát dễ thấy tại vị trí -1:0 chắc chắn sẽ xác định được đây là một tên đường hợp lệ khớp với dữ liệu trong từ điển về tên đường. Khi so sánh kết quả tại vị trí này với từ điển mà khớp ta sẽ gắn thêm vào tại đây một thuộc tính mới có tên “street- name” để chỉ ra đây là một thuộc tính quan trọng sẽ được xét đến trong lúc huấn luyện mô hình. Thêm một ví dụ nữa để chứng minh khi cần tìm trong từ điển cho dữ liệu thời gian trong câu “đặt lịch họp với bidv 2 giờ chiều thứ hai tuần tới” như sau:
Giả sử tại vị trí hiện tại là 0 là từ “thứ” trong câu làm vị trí trung tâm, sử dụng cửa sổ trượt kích thước bằng 7 chạy dọc theo câu, ta có các mẫu ngữ cảnh như sau:
Bảng 3.10: Ví dụ các mẫu ngữ cảnh khi tìm kiếm trong từ điển cho kiểu ngày
Các mẫu ngữ cảnh sinh ra khi quét với cửa sổ bằng 7
3w:-2:-1:0:giờ:chiều:thứ 2w:-1:0:chiều:thứ 1w:0:thứ 2w:0:1:thứ:hai 3w:0:1:2:thứ:hai:tuần 4w:0:1:2:3:thứ:hai:tuần:tới
Tại vị trí 0:1 ta sẽ tìm trong từ điển và sẽ xác định được đây là biểu thức chỉ ngày, do vậy tại vị trí 0:1 đấy tôi sẽ thêm thuộc tính cho mới cho kiểu ngày là “day-word”.
Ngoài ra, để làm phong phú các thuộc tính của mình và tạo ra các thuộc tính có mức phân biệt cao rõ rệt hơn tôi đã kết hợp cả từ điển và biểu thức chính quy để có thể bắt được các tình huống như: số đường + tên đường (như: ngõ 147 yên hòa), hay các từ về địa chỉ + tên đường (như: đường xuân thủy), hay kết hợp cả hai loại trên (như số 8 phố duy tân). Dưới đây tôi sẽ trình bày cụ thể các mẫu văn bản được kết hợp giữa biểu thức chính quy và từ điển ở bảng 3.11.
Bảng 3.11: Các thuộc tính sử dụng kết hợp giữa biểu thức chính quy và từ điển Danh sách các thuộc tính khi kết hợp từ điển với biểu thức chính quy Danh sách các thuộc tính khi kết hợp từ điển với biểu thức chính quy
street number (reg. expression) + street name (dict.) address word (dict.) + street name (dict.)
street number (reg. expression) + address word (dict.) + street name (dict.)
Ví dụ: trong câu “tìm đường tới số 144 đường xuân thủy” với câu này tôi sẽ sử dụng kết hợp biểu thức chính quy và từ điển như sau. Giả sử tại vị trí 0 là từ “144” trong câu làm trung tâm, sử dụng cửa sổ có kích thước bằng 7 ta có các mẫu ngữ cảnh như sau:
Bảng 3.12: Ví dụ các mẫu ngữ cảnh khi kết hợp sử dụng cả biểu thức chính quy và từ điển
Mẫu ngữ cảnh khi sử dụng kết hợp cả biểu thức chính quy và từ điển
4w:-3:-2:-1:0:đường:tới:số:144 3w:-2:-1:0:tới:số:144 2w:-1:0:số:144 1w:0:144 2w:0:1:144:đường 3w:0:1:2:144:đường:xuân 4w:0:1:2:3:144:đƣờng:xuân:thủy:num-strname
Bằng trực quan ta dễ thấy cụm từ “xuân thủy” sẽ là một tên đường hợp lệ sau khi tìm kiếm trong từ điển tên đường phố. Tại đây tôi sẽ kiểm tra xem vị trí ngay phía trước cụm từ xuân thủy có từ nào không, nếu có thì tôi sẽ kiểm tra hai trường hợp:
Nếu từ đứng trước cụm từ xuân thủy là một biểu thức số hợp lệ (theo biểu thức chính quy số của tên đường) thì ngay tại đây tôi sẽ có thêm một thuộc tính mới là num- strname được thêm vào các mẫu ngữ cảnh.
Nếu từ đứng trước cụm từ xuân thủy là một từ mà không phải kiểu số thì tôi sẽ kiểm tra thêm một bước nữa bằng cách tìm kiếm từ đó xem có thuộc vào từ điển
addword-streetname không. Nếu kết quả trả về là có (ở đây là từ đường) thì xác định được đây là một từ thuộc vào từ điển hợp lệ của tên đường. Để đảm bảo trường hợp có thể trước từ đường có tồn tại số của tên đường không. Tôi sẽ xét thêm một từ trước đó xem nó có phải là số của tên đường không.
Trong trường hợp này, ta thấy ví dụ trên đã lấy đúng ví dụ cho việc xác định số của tên đường mà từ đứng trước cụm từ xuân thủy là từ “đường” thuộc trong từ điển
addword-streetname. Trước từ đường là từ “144” cũng hợp lệ. Do vậy theo ví dụ ở bảng trên tại vị trí 0:1:2:3 ta xác định được một thuộc tính quan trọng là số của tên đường.
Trong luận văn của mình tôi sử dụng một số lượng biểu thức chính quy cho các kiểu dữ liệu quan trọng. Dưới đây tôi liệt kê các biểu thức chính quy mà tôi đã sử dụng giúp bắt được được dữ liệu tốt và nhanh hơn trong quá trình huấn luyện mô hình:
Bảng 3.13: Danh sách các mẫu biểu thức chính quy
Biểu thức chính quy Ví dụ Ý nghĩa
(1[0-9]|2[0-4]|[0-9])((\\s(giờ))(\\ském)?(\\s[1-5]?[0- 9](\\sphút)?)?|g30) 14 giờ 20 phút time (thứ)\\s(7|hai|ba|bốn|tư|năm|sáu|tám) thứ 2 day ((ngày|mùng|ngày mùng)\\s)(1[0-9]|2[0-9]|3[0- 1]|[1-9]) ngày mùng 9 date (ngày\\s)(1[0-9]|2[0-9]|3[0-1]|[1- 9])\\s(tháng\\s)(1[0-2]|[1-9])(\\snăm\\s201\\d)? ngày 10 tháng 10 năm 2001 full date (([1-9]|1[0-9]|2[0-9]|3[0-1])\\s)?(tháng)\\s(1[0- 2]|[1-9]|này|tư|giêng|chạp) tháng 6 month
(năm)\\s(201\\d) năm 2010 year
[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9- ]+(\\.[A-Za-z0-9-]+)*(\\.[A-Za-z]{2,})
trphuongnam@g mail.com
([0-9]+)(\\s(phần trăm
|kilômét|mét|nghìn|ngàn|triệu|lần))
10 phần trăm number
(tuần)\\s(này|sau|tới)? tuần này week
([\\s\\d]){10,} 0912152965 phone
(\\d+\\w?) 2, 4, 6 street
number
3.4. Huấn luyện mô hình
3.4.1. Quá trình huấn luyện mô hình nhận dạng thực thể tên
Đầu vào là một tập dữ liệu đã được chú thích dưới dạng XML cho các thực thể tên. Bước đầu tiên sẽ xử lý các chuỗi đầu vào này bằng cách gán nhãn cho các thực thể tên đã được chú thích ở dạng XML theo định dạng IOB2 (một trong cách trình bày dữ liệu cho bài toán phân đoạn dữ liệu chuỗi). Bước tiếp theo sẽ dùng các chiến lược trích chọn thuộc tính sử dụng n-grams và kết hợp cả biểu thức chính quy và từ điển. Tại bước này tôi sẽ sử dụng tới 7-grams và kích thước cửa sổ tùy ý gồm 5, 7, 9, 11, 13 để quét các câu dữ liệu đầu vào. Cuối cùng tôi được các thuộc tính cùng với nhãn sẽ được đưa vào quá trình phân lớp sử dụng MaxEnt để tạo ra được mô hình nhận dạng thực thể tên.
Hình 3.5: Quá trình huấn luyện tạo ra mô hình nhận dạng thực thể tên Tập dữ liệu mẫu Tập dữ liệu mẫu
Gán nhãn dữ liệu theo IOB2
Từ điển Biểu thức chính quy Trích chọn các thuộc tính Phân lớp Mô hình
3.4.2. Các tham số huấn luyện khi sử dụng mô hình MaxEnt
Một số tùy chọn trong quá trình huấn luyện mô hình bằng MaxEnt
Bảng 3.14: Các tham số trong quá trình huấn luyện bằng MaxEnt Tham số Giá trị Ý nghĩa Tham số Giá trị Ý nghĩa
cpRareThreshold 0 Chỉ có các mẫu vị từ ngữ cảnh có tần số xuất hiện lớn hơn giá trị này mới được tích hợp vào mô hình MaxEnt
fRareThreshold 0 Chỉ có các thuộc tính có tần số xuất hiện lớn hơn giá trị này thì mới được tích hợp vào mô hình MaxEnt
numIterations 200 Số bước lặp huấn luyện
evaluateDuringTraining true Vừa huấn luyện mô hình vừa kiểm thử mô hình song song
saveBestModel true Lưu lại mô hình tốt nhất trong quá trình huấn luyện
3.4.3. Các tham số huấn luyện khi sử dụng mô hình CRFs
Một số tùy chọn trong quá trình huấn luyện mô hình bằng CRFs
Bảng 3.15: Các tham số trong quá trình huấn luyện bằng CRFs Tham số Giá trị Ý nghĩa Tham số Giá trị Ý nghĩa
cp_rare_threshold 0 Chỉ có các mẫu vị từ ngữ cảnh có tần số xuất hiện lớn hơn giá trị này mới được tích hợp vào mô hình CRFs
f_rare_threshold 0 Chỉ có các thuộc tính có tần số xuất hiện lớn hơn giá trị này thì mới được tích hợp vào mô hình CRFs
num_iterations 200 Số bước lặp huấn luyện
evaluate_during_training 1 Vừa huấn luyện mô hình vừa kiểm thử mô hình song song chunk_evaluate_during_training 1 Đánh giá theo chunk trong quá
trình huấn luyện
order 1
init_lambda_val 0.05 Giá trị khởi tạo cho các tham số trong mô hình
chunktype IOB2 Đánh giá theo chunk dạng IOB2
chunk b-datetime:i-
datetime:datetime Đánh giá chunk kiểu ngày tháng
chunk b-location:i-
location:location
chunk b-aname:i-
aname:aname Đánh giá chunk kiểu tên ứng dụng
chunk b-email:i-
email:email Đánh giá chunk kiểu địa chỉ email
chunk b-number:i-
number:number
Đánh giá chunk kiểu biểu thức số học
chunk b-cname:i-
cname:cname Đánh giá chunk kiểu tên liên lạc trong danh bạ
chunk b-cnumber:i-
cnumber:cnumber
Đánh giá chunk kiểu số liên lạc chunk b-url:i-url:url Đánh giá chunk kiểu tên địa chỉ
website
Chƣơng 4. Thực nghiệm và đánh giá mô hình nhận dạng thực thể tên cho ngôn ngữ nói tiếng Việt
4.1. Dữ liệu thực nghiệm và cài đặt
Để đánh giá mô hình của mình xây dựng tôi đã tạo ra một tập dữ liệu có kích thước trung bình, gồm 4409 câu văn nói tiếng Việt có nội dung giao tiếp giữa người dùng và ĐTTM cho tất cả 16 tính năng tương tác với điện thoại. Trong tập dữ liệu này được sử dụng gán nhãn dữ liệu theo 8 kiểu thực thể tên như tôi đã định nghĩa ở bảng 3.2. Tất cả các câu dữ liệu đầu vào khi có thực thể tên thì được chú thích theo định dạng của XML. Những câu dữ liệu này được tôi sử dụng Google Now để thực hiện ra lệnh (các câu ví dụ đã được biểu diễn ở bảng 3.2) cho ĐTTM để có được văn bản các câu lệnh đầu ra từ dịch vụ nhận dạng tiếng nói tự động - ASR này. Sau khi có các câu dữ liệu mẫu đầu ra này, được tôi chỉnh sửa lại cho chuẩn với văn nói tiếng Việt. Bước tiếp theo tôi sử dụng hai phương pháp gồm: MaxEnt để thực thi, đây cũng là một thành phần được viết bằng Java và sử dụng trong công cụ xử lý văn bản (Text Processing Toolkit - JtextPro17) và CRFs được viết bằng C/C++ có tên FlexCRFs18, đây là một công cụ phân đoạn và gán nhãn dữ liệu chuỗi được viết dựa trên lý thuyết của Conditional Random Fields (do Lafferty cùng các cộng sự giới thiệu lần đầu tiên vào năm 2001) để huấn luyện và thử nghiệm. Sử dụng kỹ thuật đánh giá chéo, tôi chia dữ liệu thành 4 tệp tin (4 folds) để kiểm tra đánh giá và huấn luyện được 4 mô hình
17 JTextPro: http://jtextpro.sourceforge.net 18 FlexCRFs: http://flexcrfs.sourceforge.net/
MaxEnt, với mỗi lần đánh giá tôi sử dụng 200 lần lặp L–BFGS [14] để tìm ra lần có kết quả tốt nhất và lưu lại làm kết quả mô hình nhận dạng thực thể tên.
4.2. Kết quả thực nghiệm và phân tích 4.2.1 Kết quả thực nghiệm sử dụng MaxEnt 4.2.1 Kết quả thực nghiệm sử dụng MaxEnt
Ở bảng 4.1 dưới đây biểu diễn kết quả của 4 tệp tin (4 folds). Trong đó cột Human thể hiện nội dung là số lượng thực thể tên mà do tôi đã chú thích thực tế trên tập dữ liệu thử nghiệm. Cột Model số lượng thực thể tên được dự đoán mới mô hình MaxEnt. Cột Match là số lượng thực thể tên được nhận đúng bởi mô hình MaxEnt. Ba cột còn lại lần lượt thể hiện độ chính xác, độ hồi tưởng và giá trị độ đo F1 dựa trên các giá trị của các cột Human, Model và Match. Với 4 lần thực nghiệm đánh giá chéo thì tôi nhận được lần thực nghiệm tốt nhất có kết quả trung bình của từng kiểu thực thể tên có độ đo F1 là 96.45, và giá trị trung bình của tổng các kiểu thực thể tên có độ đo F1 là 95.80. Đây là kết quả cao đáng kể bởi vì trong mô hình của tôi không sử dụng tách từ và bất kỳ thông tin về dấu câu, chữ hoa, ranh giới từ, hay các thông tin từ loại ngữ pháp (part-of-speech) trong văn bản ngôn ngữ nói.
Bảng 4.2 là kết quả của 4 lần đánh giá chéo thực nghiệm. Kết quả thấp nhất và cao nhất của độ đo trung bình F1 lần lượt là 93.51 và 95.80. Từ đó có kết quả trung bình của độ đo F1 của 4 tệp tin (4 folds) đánh giá chéo thu được là 94.63.
Bảng 4.1: Đánh giá theo Chunk của fold cho kết quả tốt nhất bằng MaxEnt Kiểu thực Kiểu thực
thể tên Human Model Match Precision Recall F1-score
aname 343 350 336 96.00 97.96 96.97 datetime 177 179 175 97.77 98.87 98.31 cname 107 103 93 90.29 86.92 88.57 cnumber 62 62 61 100.00 98.39 99.19 location 320 324 302 93.21 94.38 93.79 url 66 67 63 94.03 94.45 94.74 email 28 28 28 100.00 100.00 100.00 number 70 70 70 100.00 100.00 100.00 Averagemacro 96.41 96.50 96.45 Averagemicro 1173 1182 1128 95.43 96.16 95.80
Bảng 4.2: Kết quả đánh giá chéo của cả 4 lần thực nghiệm bằng MaxEnt Folds Human Model Match Pre.micro Rec.micro F1-scoremicro Folds Human Model Match Pre.micro Rec.micro F1-scoremicro
Fold 1 1178 1196 1121 93.73 95.16 94.44 Fold 2 1173 1182 1128 95.43 96.16 95.80 Fold 3 1191 1207 1136 94.12 95.38 94.75 Fold 4 1179 1193 1109 92.96 94.06 93.51
Để có một cách nhìn tổng quan hơn, hình 4.1 dưới đây thể hiện phân tích sâu sắc và chi tiết về hiệu suất của mỗi kiểu thực thể. Bằng cách tính trung bình các kết quả của độ chính xác, độ hồi tưởng và độ đo F1 của 4 tệp tin (4 folds).
Mô hình có được kết quả nhận dạng chính xác cho 3 kiểu thực thể: cnumber, email,
number với lần lượt kết quả của độ đo F1 là: 99.48, 100.00 và 99.35. Ba kiểu thực thể này cho kết quả cao bởi dữ liệu của 3 kiểu này được định dạng tốt và dễ dành bắt được ngay nhờ sử dụng biểu thức chính quy.
Với kiểu thực thể aname mô hình của tôi cũng nhận được kết quả của độ đo F1 rất cao với 96.10, kết quả này cao là nhờ việc tìm kiếm trong từ điển các tên ứng dụng phổ biến thường được cài trên điện thoại thông minh như: calendar, skype, facebook, clash of clan…
Đôi lúc mô hình cũng bị nhầm lẫn do không phân biệt được tên ứng dụng hay địa chỉ website. Ví dụ như một người dùng có thể đưa ra một câu lệnh như: mở vnexpress
thì có thể hiểu là mở ứng dụng vnexpress hay mở trình duyệt để vào website có tên là
vnexpress.net. Như đã nói ở phần đầu của luận văn, việc nhận dạng tiếng nói tự động bởi ASR nhận ra các đỉa chỉ website khá dài và thành các từ rời rạc, không tuân theo mẫu chuẩn như: dantri.com.vn có thể thành dân trí chấm com chấm vn. Với việc dữ liệu đa dạng và bất thường như vậy cho nên dẫn tới kết quả trung bình độ đo F1 của kiểu thực thể url chỉ đạt được 92.82.
Một kiểu thực thể nữa được cho là vô cùng khó khăn để nhận dạng đúng đó là kiểu thực thể datetime với kết quả trùng bình của độ đo F1 là 93.73. Các biểu thức về thời gian trong văn bản nói sau khi được ASR nhận dạng thường là một cụm từ rất dài như:
8 giờ 30 sáng thứ 4 tuần sau. Đôi khi ASR còn nhận dạng kiểu chữ số thành chữ cái như: 8:25’ thành 8 giờ hai mươi lăm phút. Do vậy không thể dùng nguyên biểu thức chính quy thông thường để bắt được dữ liệu kiểu này mà tôi phải sử dụng một số thuộc tính nội bộ để bắt toàn bộ khối dữ liệu datetime này.
Hình 4.1: Kết quả trung bình của độ chính xác, độ hồi tƣởng, độ đo F1 của 4 lần kiểm tra đánh giá chéo các kết quả thực nghiệm dùng MaxEnt
Kiểu thực thể cname trong danh sách danh bạ điện thoại là có nhiều nhập nhằng và