Định nghĩa triển khai sơ đồ chuyển trạng thái tuyến tính

Một phần của tài liệu (LUẬN VĂN THẠC SĨ) Giải quyết vấn đề nhận dạng tiếng Việt bằng phân tích cú pháp (Trang 40)

Mỗi trạng thái chứa một danh sách các phép dịch chuyển tới trạng thái tiếp theo để bao gồm ánh xạ δ. Mỗi trạng thái cũng cần có định danh để được liên kết. Trạng thái cuối cùng thường trỏ tới một ký hiệu ra

struct linear_state_s { longnat_t m_id; output_symbol_s *m_sym; longnat_t m_shift_num; linear_shift_s **m_shift; }; Bảng 2-19. Định nghĩa trạng thái tuyến tính

Mỗi một phép dịch chuyển sẽ bao gồm một từ hoặc một ký hiệu vào và một con trỏ tới trạng thái sẽ được chuyển đến

struct linear_shift_s {

input_symbol_s *m_sym; linear_state_s *m_state; };

Bảng 2-20. Định nghĩa phép chuyển tuyến tính2.4.3. Thuật toán xây dựng 2.4.3. Thuật toán xây dựng

Các sơ đồ chuyển trạng thái tuyến tính thường được xây dựng trên một ngôn ngữ tương ứng. Cho một ngôn ngữ hay một tập câu, chúng ta sẽ thêm các câu vào sơ đồ chuyển trạng thái tuyến tính cho tới khi hết tập câu.

linear_diagram_s::built_from_language(language l) { for(sentence sent ∈ l) {

st = this->get_first_state();

for(i=0; i<sent.length; i++) st = this->append_state(st, sent.word(i)); st->m_sym = sent.output_symbol;

} }

Bảng 2-21. Thuật toán xây dựng sơđồ chuyển trạng thái tuyến tính

Trong các tính huống khác nhau, thuật toán này có thể được triển khai để thêm ký hiệu đầu ra (tường hợp trạng thái kết thúc).

2.5. Sơđồ chuyn trng thái đẩy xung (pushdown state transition diagram)

Sơ đồ chuyển trạng thái đẩy xuống là dạng đơn giản nhất của ô tô mát đẩy xuống thường được dùng trong các chương trình dịch. Về cơ bản, sơ đồ chuyển trạng thái đẩy xuống chỉ khác với sơ đồ chuyển trạng thái tuyến tính ở chỗ mỗi trạng thái có chứa một danh sách các phép đẩy xuống. Nhưng thuật toán sinh sơ đồ chuyển trạng thái đẩy xuống thì hoàn toàn khác.

2.5.1. Định nghĩa hình thức

Mỗi trạng thái trong sơ đồ chuyển trạng thái đẩy xuống có thêm một tập các phép dịch chuyển (reduce). Đây là khác biệt so với sơ đồ chuyển trạng thái tuyến tính. Chính nhờ đặc điểm này mà ngăn xếp hay đồ thị chuyển hình trạng của các bộ phân tích đẩy xuống có thể co lại (đẩy xuống) thay vì kéo dài mãi mãi như ngăn xếp của các bộ phân tích tuyến tính.

M = <V, Π, Q, i, F, δ, ρ>

V là từ điển đầy đủ của văn phạm tương ứng Π là tập các luật của văn phạm tương ứng Q là tập trạng thái của sơ đồ

F xác định các trạng thái kết thúc F⊂Q

δ là ánh xạ từ Σ×Q vào Q xác định các phép chuyển

ρ là ánh xạ từ Q vào Π xác định các phép rút gọn của mỗi trạng thái

Bảng 2-22. Định nghĩa hình thức sơđồ chuyển trạng thái đẩy xuống

Sơ đồ chuyển trạng thái đẩy xuống thường được sinh từ một văn phạm phi ngữ cảnh tương ứng. Ví dụ như sơ đồ dưới đây

0 (initial) 1 (final) 0 -> s 2 3 n -> t«i 4 n -> nã 5 s -> n vp 6 7 v -> ®i 8 v -> ra 9 vp -> v pl 10 pl -> chî 11 pl -> ch¬i s n t«i vp v ®i ra pl chî ch¬i * s = n vp; + n = tôi | ; vp = v pl; + v = đi | ra; + pl = chơi | chợ; Hình 2-2. Ví dụ về sơđồ chuyển trạng thái đẩy xuống

Trong sơ đồ này, chúng ta có thể thấy các câu của văn phạm được triển khai thế nào nếu như chúng ta đi từ trạng thái ban đầy 0 đến các trạng thái khác, ví dụ như câu “s”, hay câu “n v pl”, hay câu “n vp”. Chúng ta có thể thấy các khái niệm

V = { s, n, vp, v, pl, tôi, nó, đi, ra, chơi, chợ } Π = { s->n vp, n->tôi, n->, vp->v pl, v->đi, v->ra, pl->chơi, pl->chợ } Q = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 } i = 0 F = { 1 } ρ(0) = {} ρ(1) = { 0->s } ρ(2) = {} ρ(3) = { n->tôi } ρ(4) = { n->nó } ρ(5) = { s-> n vp } ρ(6) = { } ρ(7) = { v->đi } ρ(8) = { v->ra } ρ(9) = { vp-> v pl } ρ(10) = { pl->chợ } ρ(11) = { pl->chơi }

δ(0, s) = 1, δ(0, n) = 2, δ(0, tôi) = 3, δ(0, nó) = 4

δ(2, vp) = 5, δ(2, v) = 6, δ(2, đi) = 7, δ(2, ra) = 8,

δ(6, pl) = 9, δ(6, chợ) = 10, δ(6, chơi) = 11

Bảng 2-23. Ví dụ về sơđồ chuyển trạng thái đẩy xuống2.5.2. Định nghĩa triển khai 2.5.2. Định nghĩa triển khai

Do mỗi sơ đồ chuyển trạng thái đẩy xuống tương ứng với một văn phạm và chứa một tập các luật cũng như tập ký hiệu, chúng tôi định nghĩa nó như là lớp con của lớp văn phạm.

struct pushdown_diagram_s: public grammar_s { longnat_t m_state_num;

pushdown_state_s **m_state; };

Bảng 2-24. Định nghĩa hình thức sơđồ chuyển trạng thái đẩy xuống

Mỗi trạng thái chứa danh sách các phép dịch chuyển (tương ứng với δ) và danh sách các phép rút gọn (tương ứng với ρ). Ngoài ra mỗi trạng thái cần chứa danh sách các mục (item). Danh sách này chỉ dùng duy nhất khi sinh các trạng thái và làm định danh cho chính trạng thái đó. Trạng thái đầu i và tập trạng thái kết thúc F sẽ được triển khai vào thành thuộc tính của một trạng thái.

struct pushdown_state_s { longnat_t m_id; bool_t m_final; bool_t m_initial; longnat_t m_reduce_num; pushdown_symbol_s **m_reduce_LHS; pushdown_rule_s **m_reduce_RHS; longnat_t m_shift_num; pushdown_state_s **m_shift_state; pushdown_state_s **m_shift_sym; longnat_t m_item_num;

pushdown_item_s **m_item; };

Bảng 2-25. Định nghĩa trạng thái đẩy xuống

Trong triển khai nhận dạng, chúng tôi đưa thêm từ điển mẫu cục bộ vào trong mỗi trạng thái đẩy xuống. Từ điển cục bộ này sẽ được dùng để nhận dạng tín hiệu vào tại trạng thái đó.

2.5.3. Thuật toán xây dựng

Việc xây dựng sơ đồ chuyển trạng thái đẩy xuống gồm hai bước. Bước thứ nhất là tải văn phạm tương ứng của nó lên từ tập tin và bước thứ hai là dùng thuật toán sinh. Chúng tôi sẽ trình bày thuật toán sinh

1) Sinh trạng thái đầu tiên, tính đầy đủ các item, và thêm vào sơ đồ 2) Với mỗi trạng thái s, ta sẽ sinh ra các trạng thái tiếp bằng các bước

21) Duyệt các item và sinh ra danh sách shift và danh sách reduce. Các item kết thúc sẽ được thêm vào danh sách reduce, các item còn ký tự thì ký tự được thêm vào shift 22) Với mỗi ký tự trong shift, sinh trạng thái ps, sưu tập các item từ s vào ps, tính đủ

item cho ps, và thêm ps vào sơ đồ nếu chưa có và xoá ps nếu đã có 3) Xoá bỏ tất cả các item trong sơ đồ, vì nó chỉ dùng khi sinh

Bảng 2-26a. Thuật toán xây dựng sơđồ chuyển trạng thái đẩy xuống

Thuật toán này khá phức tạp và cần một khái niệm trung gian là item, vốn là một luật có thêm con trỏ chỉ vị trí hiện tại (đang xét). Mỗi một trạng thái sẽ được xác định duy nhất bằng một danh sách các item. Phép xác định này cần thiết trong quá trình thêm duy nhất trạng thái vào sơ đồ.

pushdown_diagram_s::generate_diagram() {

pushdown_state_s *st = new pushdown_state_s();

st->add_item_unique(get_meta_symbol(), get_meta_rule()); st->calculate_other_items();

for(st ∈ this) {

st->generate_shift_list_and_reduce_list(); for(symbol sym ∈ st->shift_list) {

pst = new pushdown_state_s(); pst->collect_item_from(st, sym); pst->calculate_other_items(); nst = this->add_state_unique(st, sym, pst); if(nst != pst) delete pst; } } this->delete_all_items(); }

Bảng 2-26b. Thuật toán xây dựng sơđồ chuyển trạng thái đẩy xuống

Về cơ bản, việc sinh các trạng thái trong sơ đồ chuyển trạng thái đẩy xuống dựa vào các luật giống như việc sinh các trạng thái trong sơ đồ chuyển trạng thái tuyến tính dựa vào các câu. Do sơ đồ chuyển trạng thái tuyến tính dùng ngôn ngữ tuyến tính cho nên chúng ta không cần khái niệm item để lưu vị trí hiện tại.

2.6. Chui con chung ln nht

Chuỗi con chung (common substring) là cách mô hình hoá các chuỗi. Tập hợp các chuỗi có thể rất khác nhau do các yếu tố dư thừa hay cụ thể, nhưng phần cô đọng nhất và tổng quát nhất sẽ xuất hiện trong tất cả các chuỗi con. Do vậy, cách đơn giản nhất để mô hình hoá một tập các chuỗi là tìm ra chuỗi con chung của chúng.

Chúng ta đã từng biết đến khái niệm giả thuyết (hypothesis) trong lý thuyết học tự động (machine learning) như là một mô hình được tổng quát hoá từ các ví dụ hay các bộ giá trị cụ thể. Khái niệm chuỗi con chung lớn nhất có gì đó rộng hơn một

chút. Bản thân một chuỗi đã mở rộng hơn một bộ giá trị và có thể dùng để biểu diễn bộ giá trị, do đó khái niệm chuỗi con chung cũng có thể dùng để biểu diễn một giả thuyết theo nghĩa nào đó. Chúng tôi muốn trình bày phần này như một phương pháp mô hình hoá các chuỗi phát âm cũng như các tín hiệu.

2.6.1. Định nghĩa chuỗi con chung lớn nhất

Một chuỗi con chung của hai chuỗi là một chuỗi hình thành từ các ký tự của có mặt trong cả hai chuỗi theo đúng thứ tự. Ví dụ chuỗi "x1yy2zz3tt" và chuỗi "ab1c2de3" có chung chuỗi con "1", "12", "13", "23", "123". Và trong trường hợp này chuỗi con chung lớn nhất là "123" vì nó có độ dài lớn nhất. Vì vậy chúng ta hoàn toàn có thể biểu diễn dạng chung của hai chuỗi trên là "*1*2*3*" trong đó các dấu sao thay thế cho một chuỗi bất kỳ kể cả rỗng. Chúng ta gọi hàm tìm chuỗi con chung là ánh xạ từ danh sách các chuỗi tới một chuỗi.

mcs(string s1, string s2) → (string s)

Số chuỗi càng nhiều thì chuỗi con chung càng ngắn. Đây cũng là đặc điểm chung của các mô hình. Nếu chúng ta tìm đặc điểm chung của càng nhiều đối tượng thì số đặc điểm chung càng ít. Có thể biểu diễn hình thức tính chất này như sau

length(mcs(s1, s2)) ≤ length(mcs(s1, mcs(s2, s3)))

Chuỗi con chung của hai chuỗi giống hệt nhau chính là một trong hai chuỗi. Đây là đặc điểm được dùng để thử nghiệm các triển khai của chuỗi con chung

mcs(a, a) = a

Chuỗi con chung lớn nhất của hai chuỗi đối xứng. Nghĩa là không có chuỗi nào có vai trò lớn hơn trong quá trình mô hình hoá. Đây cũng là tính chất dùng để kiểm chứng các cài đặt

mcs(a, b) = mcs(b, a)

Chuỗi con chung nên có tính chất kết hợp. Nếu chúng ta thực hiện thủ công, có thể tính chất này không đảm bảo do chúng ta chọn những chuỗi con lớn nhất khác nhau khi chúng có cùng độ dài. Nhưng trong cài đặt bằng thủ tục, tính chất kết hợp tồn tại do thủ tục tìm luôn chọn chuỗi con chung lớn nhất đầu tiên.

mcs(a, mcs(b, c)) = mcs(mcs(a, b), c) = mcs(a, b, c)

2.6.2. Thuật toán tìm chuỗi con chung lớn nhất

Để tìm được các mẫu chung, chúng ta cần thuật toán chuỗi con chung. Chuỗi con chung là chuỗi con dài nhất gồm các ký tự có chung của hai chuỗi theo đúng thứ tự từ trái sang phải. Ví dụ chuỗi bcaaa và chuỗi aaabc có chung aaa, hay chuỗi x12y3z và chuỗi a11b22c33 có chung 123. Chúng tôi tìm chuỗi con chung bằng thuật toán sau

string mcs(string s1, string s2) { sconfgraph conf;

init_graph(conf, s1);

for(i=0; length(s2); i++) for(st ∈ conf)

if( found_char(s2[i], st) ) add_state(st, s2[i], conf); st = find_longest_state(conf);

return create_string(st, conf); }

Bảng 2-27. Thuật toán chuỗi con chung

Thuật toán này hoạt động bằng cách xây dựng chuỗi con cũng như phát triển chuỗi con từ các ký tự của một chuỗi dọc theo chuỗi còn lại. Sơ đồ chuyển hình trạng sẽ lưu giữ thông tin cho phép ta xác định chuỗi con dài nhất. Ta sẽ duyệt dọc theo trạng thái dài nhất ngược về đầu để xây dựng chuỗi con chung. Dưới đây là ví dụ về thuật toán chuỗi con chung

Chuỗi con

được duyệt

Đồ thị chuyển hình trạng

b c a a a (*, aaabc, *) Ban đầu ta có hình trạng (*, aaabc, *) gồm ba thành phần. Phần đầu là con trỏ tới hình trạng sinh ra nó, phần hai là chuỗi còn lại, và phần ba là chuỗi con

c a a a (*, aaabc, *) (0, c, b)

Khi ký tự b được lấy, có một hình trạng duy nhất chứa và cũng chứa chữ b nên một hình trạng mới sinh ra đó là (0, c, b)

(0, c, b) (1, *, bc)

cùng hình trạng (1, *, bc) nên chỉ một hình trạng được thêm vào

a a (*, aaabc, *) (0, c, b) (1, *, bc) (0, aabc, a)

Khi ký tự a được lấy, chỉ có hình trạng ban đầu chứa chữ a nên chúng ta chỉ thêm được một hình trạng (0, aabc, a)

a (*, aaabc, *)

(0, c, b) (1, *, bc) (0, aabc, a) (3, abc, aa)

Khi ký tự a tiếp theo được lấy, có hai hình trạng chứa chữ a nên chúng ta có hai hình trạng mới. Tuy nhiên (*, aaabc, *) sinh (0, aabc, a) đã có, nên chúng ta chỉ thêm được (3, abc, aa)

* (*, aaabc, *) (0, c, b) (1, *, bc) (0, aabc, a) (3, abc, aa) (4, bc, aaa)

Khi ký tự a cuối cùng được lấy, có ba hình trạng chứa chữ a tuy nhiên (*, aaabc, *) sinh (0, aabc, a) đã có và (0, aabc, a) sinh (3, abc, aa) đã có nên chúng ta chỉ thêm (4, bc, aaa)

Dựa vào danh sách hình trạng ta có danh sách các chuỗi con, đó là *, b, bc, a, aa, aaa và tìm thấy aaa là lớn nhất.

Bảng 2-28. Ví dụ về thuật toán chuỗi con chung

Để nhận dạng được mẫu tổng quát trong tập tin, ta cần bỏ qua một số véc tơ thừa và chỉ để lại các véc tơ gần với mẫu. Điều này có thể được thực hiện bằng cách giữ nguyên trạng thái khi gặp một véc tơ không mong muốn thay vì chuyển về trạng thái ban đầu như bình thường. Hầu hết các chương trình dịch vẫn dùng chiến lược này để phân tích tiếp tập tin.

2.6.3. Vai trò của chuỗi con chung

Trong thực tế các mẫu phát âm của cùng một đơn vị diễn đạt, từ hay câu, thường rất khác nhau ngay cả khi chúng được ghi âm cách nhau vài giây. Chúng ta có thể kiểm tra điều này bằng một chương trình ghi âm và một chương trình phân tích giọng nói. Do vậy để nhận dạng được các mẫu ghi âm khác nhau của cùng một từ, chúng ta cần tạo ra một mẫu tổng quát hay mô hình của từ đó. Bằng cách trích chọn các đặc trưng chung nhất của các mẫu ghi âm khác nhau của cùng một từ,

chúng ta sẽ tạo ra một mô hình cho từ đó. Mô hình này sau đó được sử dụng để so sánh với các mẫu mới ghi âm để tìm ra từ.

Nói chung chúng ta không phải thay đổi trên tầng phân tích cú pháp vì vai trò định hướng và giới hạn của nó không ảnh hưởng tới các mẫu mà chỉ ảnh hưởng tới không gian mẫu. Do đó các thủ tục huấn luyện và nhận dạng ở tầng phân tích từ vựng bị tác động.

Để huấn luyện được một bộ nhận dạng mẫu tổng quát, chúng ta cần tạo ra các mẫu tổng quát sau đó thêm vào bộ nhận dạng. Mẫu tổng quát sẽ được tạo ra bằng thuật toán tìm chuỗi con chung. Vì chúng ta không thêm tất cả các mẫu mà chúng ta chỉ thêm vào một mẫu chung nhất do đó số lượng mẫu thêm vào ít hơn và độ dài của mỗi mẫu thêm vào cũng ngắn hơn.

Việc nhận dạng hay khớp mẫu giữa mẫu tổng quát và mẫu cụ thể được thực hiện bằng cách khớp có lựa chọn các ký hiệu giống nhau nhất trong từ điển. Chúng ta thường gặp điều này trong các bộ tìm kiếm từ vựng ví dụ như Google. Khi người dùng đánh sai một từ ví dụ “persiten” chương trình tìm kiếm sẽ hỏi lại người dùng có phải định đánh từ “persistence” hay không. Do đó chúng ta có cơ sở thuật toán để thực hiện việc khớp mẫu cụ thể (mẫu thiếu hoặc thừa) với mẫu tổng quát. Và mẫu chuẩn của chúng ta không phải do một ai quy định mà được thống kê và trích chọn trên một lượng lớn các mẫu.

Chương 3

TÍN HIU TING NÓI

Trong phần trước, chúng ta đã xem xét tín hiệu như đầu vào của bài toán nhận dạng tiếng nói. Trong phần này chúng ta sẽ làm chi tiết ý nghĩa của tín hiệu và các thao tác trên tín hiệu.

Phần tín hiệu sẽ bao gồm các thuật toán biến đổi các tín hiệu thành một bộ tham số hoặc một quan sát. Đây là phần quan trọng tương đương với phần lý thuyết nhận dạng vì nó đóng một nửa vai trò trong tốc độ cũng như độ chính xác của cả hệ thống huấn luyện và nhận dạng tiếng nói.

Khái niệm tín hiệu (signal) trong tài liệu này đồng nghĩa với tín hiệu tiếng nói (speech signal) hoặc tín hiệu âm thanh (sound signal), có nghĩa tín hiệu là một chiều và tuần tự.

3.1. Định nghĩa tín hiu

Một tín hiệu (signal) theo là một dãy số hữu hạn (finite sequence) các số thực hoặc số nguyên. Mỗi số nguyên trong tín hiệu gọi là mẫu (sample). Hay tín hiệu có thể được coi là một hàm từ tập số tự nhiên vào tập số thực. Chúng ta sử dụng ký pháp dãy để biểu diễn tín hiệu

S = { s1, s2, .. sn }

Trong triển khai các ứng dụng tương tác trực tiếp, tín hiệu đưa vào là liên tục và không xác định độ dài trước. Mặc dù vậy chúng ta vẫn có phương pháp chia nhỏ các tín hiệu thu được thành các đoạn hữu hạn.

3.2. Ly mu tín hiu (signal sampling)

Tín hiệu là hàm vô hạn và liên tục theo thời gian, ví dụ như hàm sin(t) xác

Một phần của tài liệu (LUẬN VĂN THẠC SĨ) Giải quyết vấn đề nhận dạng tiếng Việt bằng phân tích cú pháp (Trang 40)

Tải bản đầy đủ (PDF)

(107 trang)