Trong đó:
- iter: số lần lặp
- terr: tỷ lệ lỗi đối với các tag. (số tag lỗi chia cho tất cả các tag) - serr: tỷ lệ lỗi đối với các câu. (số câu lỗi chia cho tổng số câu) - act: số ví dụ đƣợc kích hoạt trong tập làm việc
- uact: số ví dụ mà tham số kép đạt ngƣỡng trên của C. 0 uact khi dữ liệu huấn luyện là tách tuyến tính.
- obj: giá trị của đối tƣợng hiện thời, ||w||^2
- kkt: giá trị kkt lớn nhất. Khi giá trị này = 0.0, MIRA training kết thúc. * Ánh xạ CRF-CRF++:
Trong CRF++, tác giả tổ chức các câu thành các đối trƣợng Tagger, đối tƣợng này chứa các thông tin về tập dữ liệu training nhƣ:
- Câu cần gán nhãn:
std::vector<std::vector <const char *> > x_;
- Các loại nhãn: std::vector<char*> y_;
- Thừa số chuẩn hóa: double Z_;
- …
Tính toán thừa số chuẩn hóa bằng thuật toán forwardbackward nhƣ sau:
void TaggerImpl::forwardbackward() {
if (x_.empty()) return;
for (int i = 0; i < static_cast<int>(x_.size()); ++i)
for (size_t j = 0; j < ysize_; ++j)
node_[i][j]->calcAlpha();
for (int i = static_cast<int>(x_.size() - 1); i >= 0; --i)
for (size_t j = 0; j < ysize_; ++j)
node_[i][j]->calcBeta(); Z_ = 0.0;
for (size_t j = 0; j < ysize_; ++j)
Z_ = logsumexp(Z_, node_[0][j]->beta, j == 0);
return;
Trong CRF++, để xác định y trong công thức (3.13), tác giả dùng thuật toán Viterrbi nhƣ sau:
void TaggerImpl::viterbi() {
for (size_t i = 0; i < x_.size(); ++i) { for (size_t j = 0; j < ysize_; ++j) { double bestc = -1e37;
Node *best = 0;
const std::vector<Path *> &lpath = node_[i][j]->lpath; for (const_Path_iterator it = lpath.begin(); it != lpath.end(); ++it) {
double cost = (*it)->lnode->bestCost +(*it)->cost + node_[i][j]->cost; if (cost > bestc) { bestc = cost; best = (*it)->lnode; } } node_[i][j]->prev = best;
node_[i][j]->bestCost = best ? bestc : node_[i][j]- >cost;
} }
double bestc = -1e37; Node *best = 0;
size_t s = x_.size()-1;
for (size_t j = 0; j < ysize_; ++j) { if (bestc < node_[s][j]->bestCost) { best = node_[s][j];
bestc = node_[s][j]->bestCost; }
}
for (Node *n = best; n; n = n->prev) result_[n->x] = n->y;
cost_ = -node_[x_.size()-1][result_[x_.size()-1]]- >bestCost;
4.2.2. Testing
Trong đó model_file đƣợc tạo ra ở bƣớc learn. Còn test_file là dữ liệu kiểm thử muốn gán tag tuần tự. test file phải cùng dạng với training file.
Ví dụ kết quả thực hiện crf_test: