Các vị tổ khai sáng ngành xử lý ngôn ngữ tự nhiên

Các vị tổ khai sáng ngành xử lý ngôn ngữ tự nhiên

4 Tháng chín 2024 - 2:18 sáng
Có thể nói cội nguồn của ngành xử lý ngôn ngữ tự nhiên xuất hiện sau Thế chiến Thứ 2, thời đại của Trăm Hoa Đua Nở, với những nhà khoa học có trí tuệ vượt trội. Và đây là giai đoạn khởi đầu cho sự ra đời của máy tính cá nhân (1940 - 1950).

Các vị tổ đầu tiên của ngành xử lý ngôn ngữ tự nhiên (từ những năm 1940 - 1950)

Trong quá khứ, việc xử lý ngôn ngữ đã được tiến hành theo những cách khác nhau trong các ngành như khoa học máy tính (computer science), kỹ sư điện (electrical engineering), ngôn ngữ học (linguistics) và tâm lý học nhận thức (psychology), khoa học về nhận thức (cognitive science). Do sự đa dạng này mà công tác nghiên cứu xử lý ngôn ngữ tự nhiên đã dẫm chân lên nhau: Ngôn ngữ học tính toán (computational linguistics) có trong ngành ngôn ngữ học, xử lý ngôn ngữ tự nhiên (natural language processing) có trong ngành khoa học máy tính (computer science), nhận dạng tiếng nói (speech recognition) có trong ngành kỹ sư điện (electrical engineering), ngôn ngữ học tính toán (computational psycholinguistics) có trong ngành tâm lý học.

Trong bài viết này chúng tôi sẽ trình bày lại lịch sử phát triển của lĩnh vực xử lý ngôn ngữ nói chung và nhận dạng giọng nói nói riêng.

Thời đại của Trăm Hoa Đua Nở

Có thể nói cội nguồn của ngành xử lý ngôn ngữ tự nhiên xuất hiện sau Thế chiến Thứ 2, thời đại của Trăm Hoa Đua Nở, với những nhà khoa học có trí tuệ vượt trội. Và đây là giai đoạn khởi đầu cho sự ra đời của máy tính cá nhân (1940 - 1950).

Trong giai đoạn đầu của thập niên (1940-1950), người ta chứng kiến sự phát triển của các ngành khoa học nền tảng như tự động hóa (automaton), xác xuất thống kê (probabilistic), mô hình lý thuyết thông tin (information theoretic models).

Từ mô hình kiểm thử Turing, đến mạng lưới thần kinh cơ bản MCP neuron

Tự động hóa và mô hình kiểm thử Turing xuất hiện vào những năm 1950 được coi là nền tảng sớm của ngành khoa học máy tính. Từ mô hình kiểm thử Turing, hai nhà khoa học Warren McCulloch và Walter Pitts đã phát triển thành mô hình Mạng lưới Thần Kinh (McCulloch-Pitts neuron / MCP neuron). Đây là nghiên cứu nền tảng cho phát triển của các mô hình nơ-ron nhân tạo phức tạp hơn sau này.

MCP neuron mô tả một nơ-ron nhân tạo đơn giản có hai yếu tố chính: các đầu vào và một hàm kích hoạt (activation function). Mô hình này dựa trên ý tưởng cơ bản rằng nơ-ron nhận đầu vào từ nhiều nguồn, xử lý chúng, và sau đó tạo ra một đầu ra dựa trên một ngưỡng nào đó.

Các đầu vào (input): MCP neuron nhận đầu vào từ các tín hiệu hoặc các nơ-ron khác thông qua các kết nối trọng số. Mỗi đầu vào được gán một trọng số cụ thể.

Hàm kích hoạt (activation function): Nếu tổng trọng số của các đầu vào vượt qua một ngưỡng (threshold), thì MCP neuron sẽ phát ra một tín hiệu đầu ra hoặc tạo ra một xung điện. Ngược lại, nếu tổng trọng số nhỏ hơn hoặc bằng ngưỡng, nơ-ron sẽ không phát ra xung điện.

Ngưỡng (threshold): Ngưỡng là một giá trị cố định, được sử dụng để quyết định xem nơ-ron có phản ứng hay không dựa trên tổng trọng số của các đầu vào.

Hệ thống nhị phân (binary system): MCP neuron thường được sử dụng trong mô hình hệ thống nhị phân, nghĩa là nó có thể chỉ có hai trạng thái: hoạt động (active) hoặc không hoạt động (inactive).

Không có khả năng học tập tự động: Mô hình này không có khả năng học tập tự động. Các trọng số của đầu vào thường được xác định trước và không thay đổi theo thời gian.

MCP neuron thường được sử dụng để mô phỏng các hệ thống đơn giản trong lý thuyết mạng nơ-ron, và nó đã đóng vai trò quan trọng trong việc phát triển các mô hình nơ-ron phức tạp hơn như mạng nơ-ron nhân tạo (artificial neural networks) mà chúng ta thấy trong học máy và trí tuệ nhân tạo hiện đại.

Lý thuyết thông tin và mã hóa của Claude Shannon

Lý thuyết Shannon, còn gọi là lý thuyết thông tin hoặc lý thuyết thông tin và mã hóa, là một lĩnh vực trong khoa học máy tính và khoa học thông tin được đặt tên theo Claude Shannon, một nhà toán học và kỹ sư điện tử người Mỹ.

Lý thuyết Shannon được công bố năm 1948, áp dụng thành quả nghiên cứu trước đó của Markov (mô hình xác xuất và toán rời rạc) vào lĩnh vực ngôn ngữ và truyền dẫn thông tin.

Nguyên tắc cơ bản của lý thuyết này là: Định nghĩa thông tin là một khái niệm toán học, được đo lường bằng đơn vị "bit". Một bit biểu thị sự lựa chọn giữa hai trạng thái hoặc kết quả tương đối. Lý thuyết Shannon mô tả cách các thông tin được biểu diễn, truyền tải và lưu trữ trong các hệ thống số hóa.

Lý thuyết ngôn ngữ hình thức (Formal Language Theory) đã được Chomsky "khai sáng" như thế nào?

Từ các công trình nghiên cứu của hai nhà khoa học Shannon và Markov, Chomsky (1956) đã sớm định hình Lý thuyết ngôn ngữ hình thức (Formal Language Theory).

Lý thuyết cơ bản của ngôn ngữ hình thức (Formal Language) là chuyển đổi ngôn ngữ tự nhiên thành ngôn ngữ quy ước (symbols) để máy tính có thể hiểu được. Mỗi loại ngôn ngữ hình thức được thiết lập một bộ quy tắc riêng gọi là Ngữ pháp phi ngữ cảnh (context-free grammar). Ngữ pháp phi ngữ cảnh dùng các ký hiệu hoặc token để xây dựng cây cú pháp, câu và cụm từ cho loại ngôn ngữ đó (ngôn ngữ lập trình).

Ngữ pháp có bốn giá trị bất biến là: V, T, P, S.

V - It is the collection of variables or nonterminal symbols.
T - It is a set of terminals.
P - It is the production rules that consist of both terminals and nonterminals.
S - It is the Starting symbol.

Một cấu trúc được gọi là ngữ pháp phi ngữ cảnh đều ở dạng:

G -> (V∪T)*, where G ∊ V

Dưới đây là ví dụ triển khai bằng Java:

Từ [G -> (V∪T)*, where G ∊ V], chúng ta có:

V = {a, b}
T = {+, -}

Quy tắc sản xuất:

S -> aS | bS | a | b | + | -

Ví dụ này mô tả một ngôn ngữ gồm các chuỗi ký tự a, b, +, và -. Các chuỗi có thể được tạo bằng cách lặp lại các ký tự từ V hoặc T, hoặc bằng cách sử dụng các phép toán cộng và trừ.

Dưới đây là ví dụ về context-free grammar với công thức là:

G -> (V∪T)*, where G ∊ V

Trong ví dụ này, chúng ta có:

V = {a, b}
T = {+, -}

Với các quy tắc sản xuất sau:

S -> aS | bS | a | b | + | -

Ví dụ này mô tả một ngôn ngữ gồm các chuỗi ký tự a, b, +, và -. Các chuỗi có thể được tạo bằng cách lặp lại các ký tự từ V hoặc T, hoặc bằng cách sử dụng các phép toán cộng và trừ.

Ví dụ về các chuỗi hợp lệ trong ngôn ngữ này:

""
"a"
"ab"
"a+b"
"a-b"
"a+a+b-a"

Ví dụ về các chuỗi không hợp lệ trong ngôn ngữ này:

"c"
"-a"
"a+b+c"

Kết quả khi chạy chương trình này:

S(a(S(b)))

Trong ví dụ này, cây phân tích cú pháp đại diện cho chuỗi "a+b". Cây phân tích cú pháp có dạng:

S
/ \
a   S
/ \
b   S
Như vậy, chúng ta đã có một ví dụ về context-free grammar với công thức là:

G -> (V∪T)*, where G ∊ V

Ví dụ này có thể được mở rộng để mô tả các ngôn ngữ khác.

 

import java.util.ArrayList;
import java.util.List;

public class CFG {

    private static final List V = new ArrayList<>();
    private static final List T = new ArrayList<>();

    static {
        V.add("a");
        V.add("b");
        T.add("+");
        T.add("-");
    }

    public static void main(String[] args) {
        String input = "a+b";

        // Tạo cây phân tích cú pháp
        ParseTree tree = parse(input);

        // In ra cây phân tích cú pháp
        System.out.println(tree);
    }

    private static ParseTree parse(String input) {
        // Tạo cây phân tích cú pháp gốc
        ParseTree root = new ParseTree("S");

        // Duyệt qua chuỗi đầu vào
        for (int i = 0; i < input.length(); i++) {
            // Lấy ký tự hiện tại
            char c = input.charAt(i);

            // Tìm quy tắc sản xuất phù hợp
            ParseTree child = findRule(c);

            // Thêm cây con vào cây phân tích cú pháp gốc
            root.addChild(child);
        }

        return root;
    }

    private static ParseTree findRule(char c) {
        // Tìm ký tự trong tập V
        if (V.contains(String.valueOf(c))) {
            return new ParseTree(String.valueOf(c));
        }

        // Tìm ký tự trong tập T
        if (T.contains(String.valueOf(c))) {
            return new ParseTree(String.valueOf(c));
        }

        // Tìm quy tắc sản xuất cho ký tự c
        for (String rule : V) {
            if (rule.contains(String.valueOf(c))) {
                return new ParseTree(rule);
            }
        }

        // Không tìm thấy quy tắc sản xuất nào phù hợp
        return null;
    }
}

class ParseTree {

    private String rule;
    private List children;

    public ParseTree(String rule) {
        this.rule = rule;
        this.children = new ArrayList<>();
    }

    public void addChild(ParseTree child) {
        this.children.add(child);
    }

    public String toString() {
        return rule + "(" + children.toString() + ")";
    }
}

 

Nguyễn Văn Hiến

Tôi là Nguyễn Văn Hiến, Founder của Tummosoft. Tôi có hơn 20 năm lập trình, vào thời điểm máy vi tính còn là tài sản quý giá của người giàu. Nhưng sức đam mê công nghệ của tôi đã giúp tôi vượt qua những khó khăn và theo đuổi nghề lập trình. Đối với tôi, sáng tạo các sản phẩm công nghệ bằng ngôn ngữ cũng giống như người nghệ sĩ sáng tác những họa phẩm.

Bài viết liên quan