runesight · exclusions · ai · feature
RuneSight: mạng nơ-ron phân biệt văn bản với mã
Phiên bản 1.0.6 bỏ danh sách regex viết tay từng quyết định dòng nào là văn bản, dòng nào là đường dẫn, định danh và mã điều khiển. RuneSight, một bộ phân loại nơ-ron 400 KB huấn luyện trên chín trăm nghìn dòng từ game thật, câu thật ở mười sáu ngôn ngữ và mọi mã điều khiển engine đã được ghi tài liệu, giờ đưa ra quyết định đó trong vài micro giây trên CPU của bạn, nêu lý do ở mỗi hàng và không bao giờ đụng tới dòng có văn bản thật.
Mỗi game RuneTranslate mở ra phần lớn là văn bản mà người chơi sẽ đọc, cộng thêm một cái đuôi dài những thứ chỉ trông giống văn bản: đường dẫn tài nguyên, tên biến, mã điều khiển, khóa plugin, nhãn debug, một khối base64 ai đó để quên trong file dữ liệu. Dịch một thứ như vậy, trường hợp tốt nhất là phí một lượt gọi. Tệ nhất là một cảnh không bao giờ tải được vì engine giờ tra một cái tên không còn tồn tại.
Từ bản đầu tiên, ranh giới giữa hai loại này được vạch bằng tay: hàng trăm biểu thức chính quy, mỗi cái cho một dạng rác chúng tôi từng gặp, engine này tiếp engine khác. Phiên bản 1.0.6 thay danh sách đó bằng RuneSight, một mạng nơ-ron nhỏ được huấn luyện trên dữ liệu thật. Với mỗi dòng đã trích xuất, nó quyết định dòng đó là văn bản hay đường ống kỹ thuật, trong vài micro giây, trên CPU của bạn, ngay trong ứng dụng.
Vì sao danh sách quy tắc không còn đủ
Một biểu thức chính quy chỉ bắt đúng dạng mà nó được viết cho. bg_office_01 là một định danh, nên quy tắc cho snake_case bắt được nó. Rồi một game Wolf RPG xuất hiện với <<GET_FILE_EXIST>>Data/\s[1], một game Bakin với Lv.\partystatus[0], một game Unity với "CubismTaskQueue.OnTask" already set., và một tên thư mục viết bằng tiếng Nhật làm hỏng quy tắc đường dẫn vốn giả định là ASCII. Mỗi cái thành một quy tắc mới, giới hạn cẩn thận để không nuốt hội thoại thật, và mỗi engine mới lại bắt đầu vòng lặp.
Quy tắc cũng không cân nhắc được bằng chứng. Một dòng phần lớn là mã điều khiển với ba từ hội thoại ở cuối vẫn là văn bản và phải giữ ở dạng dịch được. Một dòng là câu đầy đủ nói về một file .png là văn bản. Một dòng chỉ có \f[\cself[1]]\space[4] thì không. Phân biệt chúng cần cảm nhận được cả dòng, chứ không phải khớp một phần của nó.
RuneSight là gì
RuneSight là một bộ phân loại khoảng 400 kilobyte. Nó đọc một dòng như một túi các mảnh ký tự dài từ một đến bốn ký tự, băm vào một bảng cố định, và ghép với vài chục thuộc tính đo được của dòng: bao nhiêu phần là chữ cái, chữ số, dấu câu hay khoảng trắng, dùng những hệ chữ nào, có giống đường dẫn không, ngoặc có cân không, có kết thúc như một câu không. Một lớp ẩn nhỏ biến chúng thành hai câu trả lời: xác suất dòng đó không phải văn bản, và nếu không phải thì nó thuộc loại không-phải-văn-bản nào.
Câu trả lời thứ hai là thứ bạn thấy trong trình chỉnh sửa. Hàng bị loại trừ luôn kèm một lý do bạn đọc được: mẫu mã, tham chiếu tài nguyên, nhãn hệ thống, số, chú thích, khóa plugin, chỉ có mã điều khiển, nhị phân hoặc lệnh plugin. Hàng có một dấu RuneSight nhỏ cùng độ tin cậy đằng sau phán quyết, nên quyết định không bao giờ là hộp đen, và một cú bấm vào hàng sẽ bật nó lại.
Toàn bộ chạy khoảng bốn micro giây cho mỗi dòng. Một JRPG trăm nghìn dòng được phân loại trong chưa tới một giây, trên bất kỳ máy Windows hoặc Linux nào, không cần GPU và không gửi gì đi đâu.
Nó học từ đâu
Không có dữ liệu gán nhãn sẵn cho việc này, nên nó được dựng từ đầu. Tập huấn luyện gồm hơn chín trăm nghìn dòng một chút:
- Game thật. Trích xuất đầy đủ của mười ba game trên mười engine, từ RPG Maker và Ren’Py tới Wolf RPG, Kirikiri, Artemis, Unity, Godot, Bakin và Unreal, được gán nhãn bằng chính các quy tắc mà RuneSight thay thế. Đó là mức sàn: nó phải bắt được mọi thứ mà quy tắc bắt được.
- Câu thật. Một phần tư triệu câu ở mười sáu ngôn ngữ, gồm tiếng Nhật, Trung, Hàn, Thái, Ả Rập, Nga và các ngôn ngữ chữ Latin, để văn bản bình thường ở bất kỳ ngôn ngữ nguồn nào không bao giờ bị nhầm với mã.
- Đường ống thật. Một trăm sáu mươi nghìn đường dẫn, định danh, tên có dấu chấm và dòng chú thích thu từ mã nguồn và gói phần mềm, những dạng mà các engine dùng chung.
- Cả những điểm mù, có chủ đích. Gần ba trăm nghìn dòng sinh ra từ các tài liệu mã điều khiển chính thức của Wolf RPG, RPG Maker và Bakin, mỗi dòng ghép với dòng hội thoại gần giống mà nó không được nuốt: một câu nhắc tới một file, một cái tên theo sau là một con số, một dòng chữ có mã ở giữa.
- Tập vàng kiểm tay. Mọi dòng mà quy tắc cũ bị ghim vào, cộng các dòng thật được báo cáo từ game đã chơi, được xét từng dòng một.
Những gì nó phải chứng minh trước khi phát hành
Một mô hình chỉ tốt hơn về trung bình vẫn là thụt lùi với ai gặp phải lỗi mới của nó, nên RuneSight chịu các ngưỡng cố định, chạy lại mỗi lần huấn luyện lại:
- Trên mọi game thật trong tập, nó bắt được ít nhất 99.5% những gì quy tắc viết tay bắt được.
- Trên tập cố định các dòng buộc phải giữ dịch được, những dòng mà quy tắc cũ luôn được kiểm thử, nó loại trừ không dòng nào.
- Trên văn xuôi thật, ít hơn 0.2% số dòng bị loại trừ.
- Lý do nó nêu đúng ít nhất 97% số lần.
- Một dòng được chấm điểm trong dưới 5 micro giây.
Quy tắc quan trọng nhất là quy tắc về dòng hỗn hợp. Một dòng có văn bản thật cạnh mã vẫn là văn bản, và vẫn dịch được. RuneSight chỉ gỡ một dòng khi cả dòng là đường ống kỹ thuật.
Điều gì không đổi
RuneSight quyết định hình dạng của một dòng. Những quyết định cần ngữ cảnh chứ không phải hình dạng vẫn đến từ các bộ điều hợp engine: tên node Godot bị loại vì vị trí của nó trong cây cảnh, chú thích sự kiện RPG Maker vì lệnh chứa nó, khóa tham số plugin vì file nó nằm trong. Các quy tắc đó vẫn còn, cùng với các quy tắc theo chính sách mà bạn thấy ở cột lý do, ví dụ dòng không có ký tự nào của ngôn ngữ nguồn.
Bộ lọc regex của riêng bạn chạy sau RuneSight và hoạt động y như trước, và mọi dòng bị loại trừ, dù do ai quyết định, vẫn là hàng đỏ chọn tham gia mà bạn bật lại được. Không điều gì RuneSight quyết định là chung cuộc.
Xem nó ở đâu
Huy hiệu RuneSight nằm ở góc dưới bên phải ứng dụng, phía trên dòng phiên bản. Chấm của nó màu xanh khi mô hình đã được tải. Mở ra, nó cho biết kích thước mô hình, ngưỡng tin cậy đi kèm, và lần trích xuất gần nhất đã làm gì: chấm điểm bao nhiêu dòng, loại trừ bao nhiêu, và chỗ nào nó bất đồng với quy tắc cũ. Sau mỗi lần trích xuất, một thông báo ngắn lặp lại các con số đó.
Nếu mô hình không tải được, huy hiệu sẽ báo, và việc trích xuất đơn giản quay về các quy tắc trước đó. Ứng dụng không bao giờ từ chối hoạt động vì chuyện này.
Mọi chỗ mô hình bất đồng với quy tắc cũ đều được ghi vào một log cục bộ nhỏ và không bao giờ tải lên. Nếu một dòng bạn coi là hội thoại thật bị loại trừ, hãy bật lại trong trình chỉnh sửa và báo cho chúng tôi trên Discord. Những báo cáo đó chính là thứ lần huấn luyện lại tiếp theo học từ đó.
Bài liên quan
Sẵn sàng thử RuneTranslate?
Gói miễn phí mở khóa mọi engine và mọi nhà cung cấp dịch trừ RuneLingua. Supporter ($3.99/tháng) mở khóa tốc độ tối đa.
Tải cho Windows & Linux
