# PhoBERT

## Tổng quan

Mô hình PhoBERT được đề xuất trong [PhoBERT: Pre-trained language models for Vietnamese](https://huggingface.co/papers/2003.00744) bởi Dat Quoc Nguyen, Anh Tuan Nguyen.

Tóm tắt từ bài báo như sau:

*Chúng tôi giới thiệu PhoBERT với hai phiên bản, PhoBERT-base và PhoBERT-large, là các mô hình ngôn ngữ đơn ngữ quy mô lớn đầu tiên được công bố công khai và huấn luyện trước cho tiếng Việt. Kết quả thực nghiệm cho thấy PhoBERT luôn vượt trội so với mô hình đa ngữ huấn luyện trước tốt nhất gần đây là XLM-R (Conneau et al., 2020) và cải thiện mức độ tiên tiến (state-of-the-art) trong nhiều tác vụ NLP đặc thù cho tiếng Việt, bao gồm gắn nhãn từ loại (Part-of-speech tagging), phân tích phụ thuộc (Dependency parsing), nhận thực thể có tên (Named-entity recognition) và suy luận ngôn ngữ tự nhiên (Natural language inference).*

Mô hình này được đóng góp bởi [dqnguyen](https://huggingface.co/dqnguyen). Mã gốc có thể được tìm thấy [tại đây](https://github.com/VinAIResearch/PhoBERT).

## Ví dụ sử dụng

```python
import torch

from transformers import AutoModel, AutoTokenizer

phobert = AutoModel.from_pretrained("vinai/phobert-base", device_map="auto")
tokenizer = AutoTokenizer.from_pretrained("vinai/phobert-base")

# INPUT TEXT MUST BE ALREADY WORD-SEGMENTED!
line = "Tôi là sinh_viên trường đại_học Công_nghệ ."

input_ids = torch.tensor([tokenizer.encode(line)])

with torch.no_grad():
    features = phobert(input_ids)  # Models outputs are now tuples
```

Cài đặt PhoBERT giống với BERT, ngoại trừ phần phân tách token. Tham khảo [tài liệu BERT](bert) để biết thông tin về các lớp cấu hình và tham số của chúng. Bộ phân tách token đặc thù cho PhoBERT được mô tả bên dưới.

## PhobertTokenizer[[transformers.PhobertTokenizer]]

#### transformers.PhobertTokenizer[[transformers.PhobertTokenizer]]

```python
transformers.PhobertTokenizer(vocab_file, merges_file, bos_token = '<s>', eos_token = '</s>', sep_token = '</s>', cls_token = '<s>', unk_token = '<unk>', pad_token = '<pad>', mask_token = '<mask>', **kwargs)
```

[Nguồn](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/phobert/tokenization_phobert.py#L49)

**Tham số:**

vocab_file (`str`) : Đường dẫn đến tệp từ vựng.

merges_file (`str`) : Đường dẫn đến tệp merges.

bos_token (`str`, *tuỳ chọn*, mặc định là `"<s>"`) : Token bắt đầu chuỗi được sử dụng trong quá trình tiền huấn luyện. Có thể được dùng làm token phân loại chuỗi.    Khi xây dựng một chuỗi bằng các token đặc biệt, đây không phải là token được dùng cho phần bắt đầu của chuỗi. Token được dùng là `cls_token`.

eos_token (`str`, *tùy chọn*, mặc định là `"</s>"`) : Token kết thúc chuỗi. Khi xây dựng một chuỗi bằng các token đặc biệt, đây không phải là token được dùng cho việc kết thúc chuỗi. Token được dùng là `sep_token`.

sep_token (`str`, *tùy chọn*, mặc định là `"</s>"`) : Token phân cách, được sử dụng khi xây dựng một chuỗi từ nhiều chuỗi, ví dụ như hai chuỗi cho phân loại chuỗi hoặc một văn bản và một câu hỏi cho trả lời câu hỏi. Nó cũng được sử dụng làm token cuối cùng của một chuỗi được xây dựng với các token đặc biệt.

cls_token (`str`, *tùy chọn*, mặc định là `"<s>"`) : Token phân loại được sử dụng khi thực hiện phân loại chuỗi (phân loại toàn bộ chuỗi thay vì phân loại theo từng token). Đây là token đầu tiên của chuỗi khi được xây dựng với các token đặc biệt.

unk_token (`str`, *tùy chọn*, mặc định là `"<unk>"`) : Token không xác định. Một token không có trong từ vựng sẽ không thể được chuyển đổi thành ID và sẽ được gán thành token này thay thế.

pad_token (`str`, *tùy chọn*, mặc định là `"<pad>"`) : Token được sử dụng để đệm, chẳng hạn khi xử lý các lô (batch) các chuỗi có độ dài khác nhau.

mask_token (`str`, *tùy chọn*, mặc định là `"<mask>"`) : Token được sử dụng để che các giá trị. Đây là token được dùng khi huấn luyện mô hình này với mô hình hóa ngôn ngữ có che (masked language modeling). Đây là token mà mô hình sẽ cố gắng dự đoán.

Xây dựng bộ phân từ PhoBERT. Dựa trên Byte-Pair-Encoding.

Tokenizer này kế thừa từ [PreTrainedTokenizer](/docs/transformers/v5.23.0/vi/main_classes/tokenizer#transformers.PythonBackend), lớp chứa hầu hết các phương thức chính. Người dùng nên tham khảo siêu lớp này để biết thêm thông tin về các phương thức đó.

#### add_from_file[[transformers.PhobertTokenizer.add_from_file]]

```python
add_from_file(f)
```

[Nguồn](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/phobert/tokenization_phobert.py#L325)

Tải một từ điển có sẵn từ tệp văn bản và thêm các ký tự của nó vào phiên bản này.

#### build_inputs_with_special_tokens[[transformers.PhobertTokenizer.build_inputs_with_special_tokens]]

```python
build_inputs_with_special_tokens(token_ids_0: list[int], token_ids_1: list[int] | None = None)
```

[Nguồn](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/phobert/tokenization_phobert.py#L144)

**Tham số:**

token_ids_0 (`list[int]`) : Danh sách các ID mà các token đặc biệt sẽ được thêm vào.

token_ids_1 (`list[int]`, *tuỳ chọn*) : Danh sách ID thứ hai tuỳ chọn cho các cặp chuỗi.

**Trả về:** `list[int]`

Danh sách [input IDs](../glossary#input-ids) với các token đặc biệt phù hợp.

Xây dựng đầu vào mô hình từ một chuỗi hoặc một cặp chuỗi cho các tác vụ phân loại chuỗi bằng cách nối và thêm các token đặc biệt. Một chuỗi PhoBERT có định dạng như sau:

- một chuỗi đơn: `<s> X </s>`
- cặp chuỗi: `<s> A </s></s> B </s>`

#### convert_tokens_to_string[[transformers.PhobertTokenizer.convert_tokens_to_string]]

```python
convert_tokens_to_string(tokens)
```

[Nguồn](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/phobert/tokenization_phobert.py#L291)

Chuyển đổi một chuỗi các token (chuỗi ký tự) trong một chuỗi duy nhất.

#### create_token_type_ids_from_sequences[[transformers.PhobertTokenizer.create_token_type_ids_from_sequences]]

```python
create_token_type_ids_from_sequences(token_ids_0: list[int], token_ids_1: list[int] | None = None)
```

[Nguồn](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/phobert/tokenization_phobert.py#L198)

**Tham số:**

token_ids_0 (`list[int]`) : Danh sách các ID.

token_ids_1 (`list[int]`, *tuỳ chọn*) : Danh sách ID thứ hai tuỳ chọn cho các cặp chuỗi.

**Trả về:** `list[int]`

Danh sách các số 0.

Tạo một mask từ hai chuỗi được truyền vào để sử dụng trong một tác vụ phân loại cặp chuỗi. PhoBERT không sử dụng token type ids, do đó một danh sách các số 0 được trả về.

#### get_special_tokens_mask[[transformers.PhobertTokenizer.get_special_tokens_mask]]

```python
get_special_tokens_mask(token_ids_0: list[int], token_ids_1: list[int] | None = None, already_has_special_tokens: bool = False)
```

[Nguồn](https://github.com/huggingface/transformers/blob/v5.23.0/src/transformers/models/phobert/tokenization_phobert.py#L170)

**Tham số:**

token_ids_0 (`list[int]`) : Danh sách các ID.

token_ids_1 (`list[int]`, *tuỳ chọn*) : Danh sách ID thứ hai tuỳ chọn cho các cặp chuỗi.

already_has_special_tokens (`bool`, *tùy chọn*, mặc định là `False`) : Xác định xem danh sách token đã được định dạng với các token đặc biệt cho mô hình hay chưa.

**Trả về:** `list[int]`

Một danh sách các số nguyên trong khoảng [0, 1]: 1 cho một token đặc biệt, 0 cho một token chuỗi.

Lấy các id của chuỗi từ một danh sách token chưa được thêm token đặc biệt. Phương thức này được gọi khi thêm token đặc biệt bằng cách sử dụng phương thức `prepare_for_model` của tokenizer.

