Nhãn BIO và chấm theo span
Nhãn BIO và chấm theo span
Mô hình nhận dạng thực thể gán nhãn cho từng token, nhưng người ta chấm nó theo cả cụm. Hai cách đếm ấy có thể lệch nhau hơn ba mươi điểm phần trăm trên đúng một câu.
Bài toán nhận dạng thực thể có tên yêu cầu tìm ra những cụm từ như tên người, tên tổ chức, tên địa danh. Cách phổ biến để biến nó thành bài gán nhãn từng token là lược đồ BIO: nhãn B-PER đánh dấu token mở đầu một thực thể loại PER, nhãn I-PER đánh dấu token nằm trong thực thể đó, còn O là token không thuộc thực thể nào. Tiền tố B tồn tại chỉ vì một lý do: để hai thực thể cùng loại nằm sát nhau không dính thành một.
Chỗ dễ hiểu nhầm nằm ở bước sau. Mô hình xuất ra một nhãn cho mỗi token, nhưng cái người ta báo cáo trong bài báo lại là precision, recall, F1 theo span, tức theo từng thực thể trọn vẹn. Một span chỉ được tính là đúng khi trùng cả biên trái, biên phải và loại thực thể. Sim dưới đây cho bạn sửa cả hàng nhãn đúng lẫn hàng nhãn mô hình đoán, rồi hiển thị hai cách chấm cạnh nhau.
| Cách chấm span | TP | FP | FN | Precision | Recall | F1 |
|---|---|---|---|---|---|---|
| Khớp chính xác | 2 | 2 | 1 | 50.0% | 66.7% | 57.1% |
| Khớp một phần | 3 | 1 | 0 | 75.0% | 100.0% | 85.7% |
Lệch một token là mất trọn một span
Trạng thái mở đầu của sim là preset Lệch một token. Câu có 17 token, hàng đoán chỉ sai đúng một nhãn: token số 11, chữ Nẵng của tên trường, bị gọi là B-LOC thay vì I-ORG.
Chấm theo token thì con số gần như không nhúc nhích: 16 trên 17 token trùng nhãn, tức 94,1%. Chấm theo span thì tan hoang:
- Hàng nhãn đúng cho ba span:
PER[0,2],ORG[6,11],LOC[15,16]. - Hàng nhãn đoán cho bốn span:
PER[0,2],ORG[6,10],LOC[11,11],LOC[15,16]. - Trùng khít chỉ có hai, nên
TPbằng 2. Hai span thừa làFP, một span bị bỏ sót làFN. - Precision bằng
2/4tức 50,0%, recall bằng2/3tức 66,7%, F1 bằng4/7tức 57,1%.
Một token sai làm hai việc cùng lúc: nó cắt cụt span tổ chức thành ORG[6,10] nên span đúng ORG[6,11] coi như trượt, và nó đẻ thêm một span địa danh giả LOC[11,11]. Chấm theo token chỉ mất một ô trong mẫu số 17, chấm theo span mất một TP và lãnh thêm hai FP. Khoảng cách giữa hai con số ở trạng thái mở đầu là 37,0 điểm phần trăm.
Muốn tự tay dựng lại hiệu ứng đó, bấm Đoán hoàn hảo để mọi số về 100%, rồi bấm đúng một nhãn I bên trong một thực thể dài. Bấm vào token số 11, tức nhãn I-ORG cuối cùng của tên trường, thì chấm theo token tụt từ 100% xuống 94,1% còn F1 span tụt từ 100% xuống 57,1%, đúng bằng trạng thái mở đầu. Bấm vào một nhãn I-ORG nằm hẳn ở giữa, ví dụ token số 9, thì thực thể bị chẻ làm đôi và sinh thêm một span rác ở giữa, nên hàng đoán có tới năm span và F1 khớp chính xác còn thấp hơn nữa, 50,0%.
Có một chỗ ngược đời đáng nhớ: bấm vào nhãn B mở đầu một thực thể lại không đổi F1 span chút nào. Đổi B-ORG ở token 6 thành I-ORG cho ra một I treo ngay sau O, mà quy ước mặc định của sim là mở span mới, nên span tổ chức được dựng lại y nguyên. Chấm theo token vẫn tụt xuống 94,1% vì nhãn rõ ràng đã khác. Chuyển ô chọn sang bỏ qua cả cụm thì cùng cú bấm ấy lại xoá sạch span tổ chức.
Khớp một phần chỉ nới chứ không cứu
Vì chấm khớp chính xác quá khắc nghiệt, một số nghiên cứu báo thêm khớp một phần: span đoán được tính là đúng khi nó cùng loại và chồng lấn ít nhất một token với một span đúng chưa bị ghép. Ở trạng thái mở đầu, ORG[6,10] chồng lấn ORG[6,11] nên được tính, TP lên 3, F1 lên 85,7%.
Nhưng khớp một phần không phải cây đũa thần, và có hai chỗ nó bó tay:
- Bấm Đúng biên, sai loại. Cả hai biên đều đúng, chỉ loại bị đổi từ
LOCsangORG. Khớp một phần vẫn đòi cùng loại, nên nó cho đúng con số như khớp chính xác: 66,7%. - Span
LOC[11,11]ở trạng thái mở đầu chồng lấn span đúngORG[6,11], nhưng khác loại, nên vẫn nằm nguyên trongFP.
Cả hai cách chấm ở đây đều ghép span một đối một: mỗi span đoán bắt cặp nhiều nhất một span đúng. Nhờ vậy luôn có FP bằng số span đoán trừ TP, và FN bằng số span đúng trừ TP. Bộ ghép khớp một phần ưu tiên bắt các cặp trùng khít trước, rồi mới ghép phần còn lại theo độ chồng lấn lớn nhất, nên F1 khớp một phần không bao giờ nhỏ hơn F1 khớp chính xác. Đó là một tính chất được cổng kiểm số quét vét cạn trên toàn bộ 117.649 cặp chuỗi nhãn dài 3 token, mỗi cặp chấm lại dưới cả hai quy ước nên tổng cộng 235.298 lượt.
Nói cho sòng phẳng thì trên chính trang này, cái thứ tự "trùng khít trước" không bao giờ đổi được con số nào. Một chuỗi BIO không có cách nào diễn tả hai thực thể chồng lên nhau, nên các span rút ra từ hai hàng nhãn luôn rời nhau, và với đầu vào rời nhau thì ghép tham lam một lượt cũng ra đúng kết quả ấy. Luật ưu tiên chỉ thật sự cắn khi ai đó đưa thẳng vào bộ ghép hai span chồng nhau, việc mà giao diện không làm được nhưng hàm thì cho phép, nên cổng kiểm số khoá riêng ca đó.
Token thấp mà span cao cũng xảy ra
Đừng vội kết luận chấm theo token luôn cho số đẹp hơn. Bấm Bỏ sót tổ chức: mô hình gán O cho cả sáu token của tên trường.
- Chấm theo token rơi xuống 11 trên 17, tức 64,7%, vì sai tận sáu token.
- Chấm theo span lại là
TPbằng 2,FPbằng 0,FNbằng 1. Precision bằng 100% vì mô hình không đoán bừa span nào, recall bằng 66,7%, F1 bằng 80%.
Sai nhiều token nhưng sai gọn trong một thực thể thì chỉ mất một span. Sai ít token nhưng rải vào giữa nhiều thực thể thì mất nhiều span. Hai cách chấm không xếp hạng mô hình theo cùng một chiều, nên trộn lẫn chúng khi so hai bài báo là một lỗi thật chứ không phải chuyện nhỏ.
Chuỗi BIO sai luật và quy ước của bài này
Mô hình gán nhãn từng token độc lập nên hoàn toàn có thể xuất ra chuỗi vi phạm luật BIO, ví dụ một I-PER đứng ngay sau O, hoặc một I-ORG nối vào B-PER. Không có định nghĩa chuẩn cho những trường hợp đó, và đây chính là chỗ hai bộ chấm khác nhau in ra hai con số khác nhau cho cùng một đầu ra. Có hai quy ước đang sống song song:
- Mở span mới. Nhãn
I-Xbị treo được coi nhưB-X, tức mở một span mới. Đây là cách scriptconllevalcủa CoNLL và thư việnseqevalở chế độ mặc định làm. - Bỏ qua cả cụm. Nhãn
I-Xbị treo, và mọiI-Xcố nối tiếp nó, bị vứt như thể chúng làO. Đây làseqevalở chế độ nghiêm ngặt với lược đồ IOB2.
Ô chọn ở thanh công cụ cho bạn đổi giữa hai quy ước, và sim luôn hiện số vị trí sai luật đang có. Bấm Chuỗi sai luật rồi đổi qua đổi lại: cùng một hàng nhãn đoán, cùng một hàng nhãn đúng, F1 khớp chính xác nhảy giữa 66,7% và 80,0%. Khi hai hàng nhãn đều hợp luật thì hai quy ước cho kết quả y hệt nhau, và sim nói thẳng điều đó thay vì để bạn tưởng cái ô chọn bị hỏng.
Vài quy ước khác của bài, nói ra để bạn khỏi phải đoán:
- Bài tách token bằng khoảng trắng thuần. Bộ tách từ tiếng Việt thật sẽ gộp
Đà Nẵngthành một đơn vị và làm đổi mọi con số trên trang. - Khi không có span đoán nào thì precision được quy ước bằng 1, khi không có span đúng nào thì recall được quy ước bằng 1, và câu rỗng cho độ chính xác token bằng 1. Nhờ vậy hai hàng nhãn giống hệt nhau luôn cho 1 ở mọi độ đo, kể cả khi cả hai đều toàn
O. Nhiều thư viện lại chọn 0 cho các trường hợp này. Đó là quy ước, không phải chân lý, nên khi so số với một bộ chấm khác thì phải kiểm chỗ này trước. - Câu dài quá 40 token bị cắt, và sim báo rõ đã bỏ bao nhiêu token thay vì lặng lẽ rút ngắn.
Chấm theo token trả lời câu hỏi "mô hình gán đúng bao nhiêu nhãn", chấm theo span trả lời câu hỏi "mô hình tìm đúng bao nhiêu thực thể". Người dùng cuối chỉ quan tâm câu thứ hai, nên đó là con số phải báo cáo. Một độ chính xác token 94% nghe rất đẹp vẫn có thể che một F1 span 57%, tức trong bốn thực thể mô hình lấy ra chỉ có hai cái đúng trọn vẹn.
- 1Chuỗi nhãn B-PER I-PER B-PER sinh ra mấy span?
- 2Một câu 17 token, mô hình sai đúng một nhãn, ở token cuối của một thực thể sáu token. Chuyện gì xảy ra với hai cách chấm?
- 3Mô hình gán O cho toàn bộ một tổ chức sáu token, các thực thể còn lại đều đúng. Vì sao precision theo span vẫn bằng 100%?