You are on page 1of 29

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN

MÔN HỌC: XỬ LÝ NGÔN NGỮ TỰ NHIÊN - CS221

BÁO CÁO ĐỒ ÁN

LUKE: Deep Contextualized Entity Representations

with Entity-aware Self-attendtion

Giảng viên hướng dẫn: Nguyễn Thị Quý

Nhóm 3

Trần Nguyễn Tuấn Anh - 21521840

Mạc An Kiều - 21522269

Trương Hữu Thọ - 21521479

Tô Duy Nguyên Hoàng - 21522100

TP Hỗ Chí Minh, Ngày 23 tháng 12 năm 2023


Mục lục

1 Giới thiệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
2 Tập dữ liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
3 Thực nghiệm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
3.1 Tạo môi trường . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
3.2 Clone git repository . . . . . . . . . . . . . . . . . . . . . . . . . . 2
3.3 Import các thư viện cần thiết . . . . . . . . . . . . . . . . . . . . 3
3.4 Tái tạo kết quả thực nghiệm LUKE trên CoNLL-2003 bằng Hugging
Face Transformers . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.5 Tái tạo kết quả thử nghiệm LUKE trên TACRED bằng cách sử
dụng Hugging Face Transformers . . . . . . . . . . . . . . . . . . 15
3.6 Tái tạo kết quả thử nghiệm LUKE trên Open Entity bằng cách sử
dụng Hugging Face Transformers . . . . . . . . . . . . . . . . . . 21
4 Tổng kết . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

ii
1 GIỚI THIỆU

Trong báo cáo này, chúng tôi tiếp cận và triển khai mô hình LUKE (Language Under-
standing with Knowledge-based Embeddings) để thực hiện tác vụ phân loại thực thể trên
tập dữ liệu CoNLL-2003, TACRED, và Open Entity. Môi trường thực nghiệm được xây
dựng và thực hiện trên Google Colab với sự hỗ trợ của các thư viện như Transformers,
seqeval, Spacy và PyTorch.

2 TẬP DỮ LIỆU

• CoNLL-2003 Named Entity Recognition Dataset:

– Mục tiêu: Tập dữ liệu này được sử dụng để thực hiện nhiệm vụ nhận diện
thực thể đặc biệt (NER) trong văn bản.

– Nhiệm vụ chính: Nhận diện và phân loại các thực thể đặc biệt như "PER-
SON", "ORGANIZATION", "LOCATION", và "MISC".

– Định dạng: Dữ liệu được biểu diễn dưới dạng các câu văn bản với các thực
thể được đánh dấu và phân loại.

• TACRED Relation Classification Dataset:

– Mục tiêu: Tập dữ liệu này tập trung vào nhiệm vụ phân loại mối quan hệ
giữa các cặp thực thể trong văn bản.

– Nhiệm vụ chính: Phân loại mối quan hệ như "per:title", "org:topMembers/employees",


"per:parents", và "per:origin".

– Định dạng: Các câu văn bản được cung cấp với các cặp thực thể được đánh
dấu và phân loại mối quan hệ.

• Open Entity Entity Typing Dataset:

– Mục tiêu: Tập dữ liệu này được sử dụng cho nhiệm vụ phân loại loại thực
thể của các đối tượng trong văn bản.

1
– Nhiệm vụ chính: Phân loại loại thực thể như "person", "location", "orga-
nization", "time", và "other".

– Định dạng: Dữ liệu bao gồm các câu văn bản với các đối tượng được đánh
dấu và phân loại loại thực thể.

3 THỰC NGHIỆM

3.1 TẠO MÔI TRƯỜNG

Môi trường thực nghiệm

Chúng ta sẽ sử dụng Google Colab, một môi trường lập trình trực tuyến cung cấp bởi
Google. Colab cho phép chúng ta sử dụng GPU mà không cần cài đặt hay cấu hình riêng
biệt, giúp tăng tốc độ huấn luyện mô hình và thực hiện thực nghiệm nhanh chóng.

Kết nối với drive

Chúng ta sẽ kết nối với Googe Drive để làm việc trong suốt quá trình tiến hành làm thực
nghiệm.

Hình 1: Kết nối với drive

3.2 CLONE GIT REPOSITORY

Trong báo cáo này, chúng ta xem xét và tái tạo kết quả đạt được trên tập dữ liệu
CoNLL-2003 named entity recognition dataset, TACRED relation classification dataset,
Open Entity entity typing dataset sử dụng thư viện Transformers và mô hình được fine-
tuned có sẵn trên Model Hub. Báo cáo gốc được tạo ra bởi tác giả, với mã nguồn được
chia sẻ trên GitHub: https://github.com/huggingface/transformers.git

2
Hình 2: Clone git repository

3.3 IMPORT CÁC THƯ VIỆN CẦN THIẾT

Do yêu cầu cụ thể của mỗi tập dữ liệu và nhiệm vụ mà mô hình cần thực hiện khác nhau
nên việc import các thư viện cũng sẽ khác nhau đôi chút giữa 3 mô hình.

Đối với tập dữ liệu CoNLL-2003 named entity recognition

Mô hình được sử dụng để thực hiện nhiệm vụ nhận diện thực thể (NER), mục tiêu là
xác định ranh giới và loại của các thực thể trong văn bản.

Hình 3: Import thư viện đối với tập dữ liệu CoNLL-2003 named entity recognition

• ’unicodedata’: Thự viện này được sử dụng để xử lý các ký tự Unicode, kiểm tra
loại của ký tự (ví dụ: lầ dấu câu, ký tự chữ,...).

• ’numpy’: Thư viện cho các phép toán số học và ma trận.

• ’seqeval.metrics’: Thư viện cung cấp các hầm để đánh giá kết quả của mô hình
NER, đặc biệt trong ngữ cảnh của đánh giá chuỗi (sequence labeling).

• ’spacy’: Thư viện xử lý ngôn ngữ tự nhiên, được sử dụng để xử lý và phân tích
văn bản.

3
• ’torch’: Thực viện PyTorch, một thư viện Máy học, được sử dụng để xây dựng và
huấn luyện mô hình.

• ’tqdm’: Thư viện cho thanh tiến trình (progress bar), giúp theo dõi tiến độ của
vòng lặp.

• ’LukeTokenizer’ và ’LukeForEntitySpanClassification’: Thư viện và mô hình


cụ thể cho tác vụ phân loại thực thể với LUKE (Language Understanding with
Knowledge-based Embeddings).

Đối với tập dữ liệu TACRED relation classification

Mô hình thực hiện nhiệm vụ phân loại quan hệ giữa các thực thể trong văn bản.

Hình 4: Import thư viện đối với tập dữ liệu TACRED relation classification

• ’json’: Thư viện xử lý JSON, được sử dụng để đọc và xử lý dữ liệu dạng JSON.

• ’LukeTokenizer’ và ’LukeForEntityPairClassification’: Thư viện và mô hình


cụ thể cho tác vụ phân loại quan hệ giữa cặp thực thể với LUKE.

Đối với tập dữ liệu Open Entity entity typing

Mô hình được sử dụng để phân loại loại thực thể của từng thực thể độc lập trong văn
bản.

Hình 5: Import thư viện đối với tập dữ liệu Open Entity entity typing

4
• ’LukeTokenizer’ và ’LukeForEntityClassification’: Thư viện và mô hình cụ
thể cho tác vụ phân loại loại thực thể của từng thực thể độc lập với LUKE.

3.4 TÁI TẠO KẾT QUẢ THỰC NGHIỆM LUKE TRÊN CONLL-2003 BẰNG HUG-
GING FACE TRANSFORMERS

Tải tập dữ liệu:

Để đảm bảo tính nhất quán và tái tạo kết quả, chúng ta sẽ sử dụng tập dữ liệu kiểm
thử ’eng.testb’ từ bộ dữ liệu CoNLL-2003 về nhận diện thực thể (NER). Tập dữ liệu
này chứa các đoạn văn bản đã được gán nhãn với các thực thể như người, tổ chức và địa
điểm.

Hình 6: Tải tập dữ liệu kiểm thử ’eng.testb’ từ bộ dữ liệu CoNLL-2003

Tải mô hình đã được đào tạo

Mô hình chúng ta sẽ sử dụng là một biến thể của LUKE, đã được đào tạo trên tập dữ
liệu CoNLL-2003 để thực hiện nhiệm vụ phân loại đoạn thực thể.

Hình 7: Load mô hình đã được đào tạo

Chúng ta tiến hành load tokenizer tương ứng để chuẩn bị dữ liệu đầu vào cho mô
hình.

5
Hình 8: Load tokenizer đã được đào tạo

Load tập dữ liệu và chuẩn bị dữ liệu đầu vào

• Load và xử lý tập dữ liệu


Đầu tiên, chúng ta tiến hành tải tập dữ liệu từ tếp ’eng.testb’ của bộ dữ liệu
CoNLL-2003 sử dụng hàm ’load_documents’. Hàm này trả về danh sách các từ
điển, mỗi từ điển biểu một văn bản trong tập dữ liệu, với các thông tin như chuỗi
từ (’words’), nhãn NER tương ứng (’labels’), và vị trí biên của câu
(’sentence_boundaries’).

1 def load_documents ( dataset_file ) :

2 documents = []

3 words = []

4 labels = []

5 sentence_boundaries = []

6 with open ( dataset_file ) as f :

7 for line in f :

8 line = line . rstrip ()

9 if line . startswith ( " - DOCSTART " ) :

10 if words :

11 documents . append ( dict (

12 words = words ,

13 labels = labels ,

14 sentence_boundaries = sentence_boundaries

15 ))

16 words = []

17 labels = []

18 sentence_boundaries = []

19 continue

20

21 if not line :

22 if not sentence_boundaries or len ( words ) !=

s entence_boundaries [ -1]:

23 sentence_boundaries . append ( len ( words ) )

6
24 else :

25 items = line . split ( " " )

26 words . append ( items [0])

27 labels . append ( items [ -1])

28

29 if words :

30 documents . append ( dict (

31 words = words ,

32 labels = labels ,

33 sentence_boundaries = sentence_boundaries

34 ))

35

36 return documents

37

38 test_documents = load_documents ( " eng . testb " )

39

Sau khi tải xong, chúng ta sẽ sử dụng hàm ’load_examples’ để tạo ra các ví dụ
dùng để đánh giá mô hình. Hàm này tạo một đối tượng batch cho mỗi câu trong
mỗi văn bản. Mô hình giải quyết nhiệm vụ bằng cách phân loại tất cả các đoạn
thực thể có thể trong một thành ["NIL","MISC","PER","ORG","LOC"], trong đó
"NIL" đại diện cho đoạn không phải là tên thực thể.

1 def load_examples ( documents ) :

2 examples = []

3 max_token_length = 510

4 max_mention_length = 30

6 for document in tqdm ( documents ) :

7 words = document [ " words " ]

8 subword_lengths = [ len ( tokenizer . tokenize ( w ) ) for w in words ]

9 total_subword_length = sum ( subword_lengths )

10 sentence_boundaries = document [ " sentence_boundaries " ]

11

12 for i in range ( len ( sentence_boundaries ) - 1) :

13 sentence_start , sentence_end = sentence_boundaries [ i : i +2]

14 if total_subword_length <= max_token_length :

15 # if the total sequence length of the document is shorter

7
than the

16 # maximum token length , we simply use all words to build

the sequence

17 context_start = 0

18 context_end = len ( words )

19 else :

20 # if the total sequence length is longer than the maximum

length , we add

21 # the surrounding words of the target s e n t e n c e to the

sequence until it

22 # reaches the maximum length

23 context_start = sentence_start

24 context_end = sentence_end

25 cur_length = sum ( subword_lengths [ context_start : context_end

])

26 while True :

27 if context_start > 0:

28 if cur_length + subword_lengths [ context_start - 1]

<= max_token_length :

29 cur_length += subword_lengths [ context_start -

1]

30 context_start -= 1

31 else :

32 break

33 if context_end < len ( words ) :

34 if cur_length + subword_lengths [ context_end ] <=

max_token_length :

35 cur_length += subword_lengths [ context_end ]

36 context_end += 1

37 else :

38 break

39

40 text = " "

41 for word in words [ context_start : sentence_start ]:

42 if word [0] == " ’" or ( len ( word ) == 1 and is_punctuation (

word ) ) :

43 text = text . rstrip ()

44 text += word

8
45 text += " "

46

47 sentence_words = words [ sentence_start : sentence_end ]

48 s e nt e n ce _ s ub w o rd _ l en g t hs = subword_lengths [ sentence_start :

sentence_end ]

49

50 w o r d _ st a r t _ c h a r _ p os i t i o n s = []

51 w or d_ en d _c ha r_ p os it i on s = []

52 for word in sentence_words :

53 if word [0] == " ’" or ( len ( word ) == 1 and is_punctuation (

word ) ) :

54 text = text . rstrip ()

55 w o r d _ st a r t _ c h a r _ p os i t i o n s . append ( len ( text ) )

56 text += word

57 w or d_ en d _c ha r_ p os it i on s . append ( len ( text ) )

58 text += " "

59

60 for word in words [ sentence_end : context_end ]:

61 if word [0] == " ’" or ( len ( word ) == 1 and is_punctuation (

word ) ) :

62 text = text . rstrip ()

63 text += word

64 text += " "

65 text = text . rstrip ()

66

67 entity_spans = []

68 original_word_spans = []

69 for word_start in range ( len ( sentence_words ) ) :

70 for word_end in range ( word_start , len ( sentence_words ) ) :

71 if sum ( s e n te n c e_ s u bw o r d_ l e ng t h s [ word_start : word_end +

1]) <= max_mention_length :

72 entity_spans . append (

73 ( w o r d _ s t a r t _c h a r _ p o s i t i on s [ word_start ] ,

w or d_ en d _c ha r _p os it i on s [ word_end ])

74 )

75 original_word_spans . append (

76 ( word_start , word_end + 1)

77 )

9
78

79 examples . append ( dict (

80 text = text ,

81 words = sentence_words ,

82 entity_spans = entity_spans ,

83 original_word_spans = original_word_spans ,

84 ))

85

86 return examples

87

88 test_examples = load_examples ( test_documents )

89

• Xử lý dữ liệu đầu vào cho mô hình


Để chuẩn bị dữ liệu đầu vào cho mô hình, ta xử lý từng câu trong các ví dụ
đã tạo. Cụ thể, ta xác định các thực thể có thể trong câu và tạo ra các đối
tượng ’entity_spans’ và ’original_word_spans’. Bên cạnh đó, ta sử dụng hàm
’is_punctuation’ để kiểm tra xem một ký tự có phải là dấu câu không.

1 def is_punctuation ( char ) :

2 cp = ord ( char )

3 if ( cp >= 33 and cp <= 47) or ( cp >= 58 and cp <= 64) or ( cp >= 91 and

cp <= 96) or ( cp >= 123 and cp <= 126) :

4 return True

5 cat = unicodedata . category ( char )

6 if cat . startswith ( " P " ) :

7 return True

8 return False

Đánh giá hiệu suất

• Phân loại các đoạn thực thể và đánh giá hiệu suất
Để đánh giá hiệu suất của mô hình trên tập dữ liệu kiểm thử, chúng ta sẽ thực hiện
phân loại cho tất cả các đoạn thực thể có hể trong tập kiểm thử. Đầu tiên, chúng
ta sẽ loại bỏ tất cả các đoạn được phân loại vào loại "NIL". Sau đó, chúng ta chọn

10
một đoạn từ các đoạn còn lại dựa trên logit của loại thực thể được dự đoán, sắp
xếp theo thứ tự giảm dần.

1 # Xac dinh kich thuoc batch va danh sach de luu tru logits

2 batch_size = 2

3 all_logits = []

5 # Vong lap qua tung batch trong tap du lieu kiem thu

6 for batch_start_idx in trange (0 , len ( test_examples ) , batch_size ) :

7 # Chon batch hien tai tu tap du lieu kiem thu

8 batch_examples = test_examples [ batch_start_idx : batch_start_idx +

batch_size ]

9 # Lay cac doan van ban va thong tin vi tri thuc the tu batch

10 texts = [ example [ " text " ] for example in batch_examples ]

11 entity_spans = [ example [ " entity_spans " ] for example in batch_examples ]

12

13 # Su dung tokenizer de chuyen doi van ban thanh du lieu dau vao cho mo

hinh

14 inputs = tokenizer ( texts , entity_spans = entity_spans , return_tensors = "

pt " , padding = True )

15 # Chuyen du lieu dau vao sang GPU

16 inputs = inputs . to ( " cuda " )

17

18 # Tinh toan gits bang cach dua du lieu dau vao vao mo hinh

19 with torch . no_grad () :

20 outputs = model (** inputs )

21

22 # Luu tru logits tu batch hien tai

23 all_logits . extend ( outputs . logits . tolist () )

24

1 # Lay danh sach nhan thuc te tu tap du lieu kiem thu

2 final_labels = [ label for document in test_documents for label in document

[ " labels " ]]

4 # Khoi tao danh sach de luu tru du doan cua mo hinh

5 final_predictions = []

7 # Vong lap qua tung vi du trong tap du lieu kiem thu

11
8 for example_index , example in enumerate ( test_examples ) :

9 # Lay logits cua vi du hien tai

10 logits = all_logits [ example_index ]

11 # Tim gia tri logit lon nhat va chi so tuong ung

12 max_logits = np . max ( logits , axis =1)

13 max_indices = np . argmax ( logits , axis =1)

14 # Lay vi tri ban dau cua cac tu trong cau

15 original_spans = example [ " original_word_spans " ]

16 # Khoi tao danh sach de luu tru cac du doan

17 predictions = []

18

19 # Vong lap qua tung doan thuc the du doan

20 for logit , index , span in zip ( max_logits , max_indices , original_spans )

21 # Neu loai thuc the khong phai la " NIL "

22 if index != 0:

23 # Luu tru thong tin ve du doan

24 predictions . append (( logit , span , model . config . id2label [ index ])

25

26 # Xay dung chuoi nhan theo dinh dang IOB2

27 predicted_sequence = [ " O " ] * len ( example [ " words " ])

28 for _ , span , label in sorted ( predictions , key = lambda o : o [0] , reverse =

True ) :

29 if all ([ o == " O " for o in predicted_sequence [ span [0] : span [1]]]) :

30 predicted_sequence [ span [0]] = "B - " + label

31 if span [1] - span [0] > 1:

32 predicted_sequence [ span [0] + 1 : span [1]] = [ "I - " + label ]

* ( span [1] - span [0] - 1)

33

34 # Luu tru chuoi du doan vao danh sach cuoi cung

35 final_predictions += predicted_sequence

36

1 # In bao cao ve hieu suat su dung seqeval

2 print ( seqeval . metrics . class ificat ion_r eport ([ final_labels ] , [

final_predictions ] , digits =4) )

12
• Kết quả và nhận xét:

Hình 9: Hiệu suất khi chạy model

1. Tổng thể:

– Micro Avg: Độ chính xác tổng thể (Micro Avg) đạt khoảng 94.20%, là
một mức độ hiệu suất khá cao trên tập dữ liệu kiểm thử.

2. Từng loại thực thể:

– Mô hình có hiệu suất tốt nhất trên loại "PER" với F1-Score là 97.01%,
theo sau là "LOC" với F1-Score là 95.18

– Loại "MISC" có độ chính xác thấp nhất với F1-Score là 86.20%, nhưng
vẫn đạt một mức chấp nhận được.

3. So sánh độ chính xác trung bình:

– Macro Avg: Độ chính xác trung bình trên các loại thực thể (Macro Avg)
là khoảng 93.07%, cho thấy sự ổn định của mô hình trên các loại thực thể
khác nhau.

4. Nhận xét:

– Mô hình có khả năng nhận diện tốt trên nhiều loại thực thể khác nhau,
nhưng còn một số độ chính xác có thể được cải thiện, đặc biệt là trên loại
"MISC".

– Sự chênh lệch giữa Precision và Recall không lớn, cho thấy mô hình đạt
được sự cân bằng giữa việc tránh sai dự đoán (Precision) và bỏ sót (Recall).

13
Áp dụng mô hình trên vào văn bản đầu vào

Cuối cùng, chúng ta sử dụng mô hình đã được đào tạo để nhận diện thực thể tên trong
một đoạn văn bản đầu vào.

1 # Nhap doan van ban tu nguoi dung

2 text = input ()

4 # Su dung Spacy de tach tu van ban thanh cac token

5 nlp = spacy . load ( " en_core_web_sm " )

6 doc = nlp ( text )

8 # Tao danh sach luu tru thong tin vi tri thuc the va tu goc trong cau

9 entity_spans = []

10 o ri g i na l _word_spans = []

11

12 # Duyet qua tung token trong cau

13 for token_start in doc :

14 # Duyet qua tung token tu vi tri hien tai den het cau

15 for token_end in doc [ token_start . i :]:

16 # Luu thong tin ve vi tri thuc the ( bat dau va ket thuc )

17 entity_spans . append (( token_start . idx , token_end . idx + len ( token_end ) ) )

18 # Luu thong tin ve vi tri cua tu goc trong cau

19 o riginal_word_spans . append (( token_start .i , token_end . i + 1) )

20

21 # Chuan bi du lieu dau vao cho mo hinh

22 inputs = tokenizer ( text , entity_spans = entity_spans , return_tensors = " pt " ,

padding = True )

23 inputs = inputs . to ( " cuda " )

24

25 # Thuc hien du doan voi mo hinh

26 with torch . no_grad () :

27 outputs = model (** inputs )

28

29 # Lay thong tin ve logit tu dau ra cua mo hinh

30 logits = outputs . logits

31

32 # Xac dinh vi tri cua logit lon nhat va gia tri logit tuong ung

33 max_logits , max_indices = logits [0]. max ( dim =1)

14
34

35 # Tao danh sach luu tru thong tin du doan

36 predictions = []

37

38 # Duyet qua tung thong tin du doan

39 for logit , index , span in zip ( max_logits , max_indices , original_word_spans ) :

40 # Neu vi tri du doan khong phai la " NIL " ( khong phai la thuc the )

41 if index != 0:

42 # Luu thong tin ve logit , vi tri va nhan thuc te tuong ung

43 predictions . append (( logit , span , model . config . id2label [ int ( index ) ]) )

44

45 # Xay dung chuoi nhan theo dinh nhan IOB2

46 pr ed ic ted _sequence = [ " O " ] * len ( doc )

47 for _ , span , label in sorted ( predictions , key = lambda o : o [0] , reverse = True ) :

48 if all ([ o == " O " for o in predicted_sequence [ span [0] : span [1]]]) :

49 predicted_sequence [ span [0]] = "B - " + label

50 if span [1] - span [0] > 1:

51 predicted_sequence [ span [0] + 1 : span [1]] = [ "I - " + label ] * ( span

[1] - span [0] - 1)

52

53 # Hien thi ket qua du doan

54 for token , label in zip ( doc , predicted_sequence ) :

55 print ( token , label )

56

3.5 TÁI TẠO KẾT QUẢ THỬ NGHIỆM LUKE TRÊN TACRED BẰNG CÁCH SỬ
DỤNG HUGGING FACE TRANSFORMERS

Tải và chuẩn bị dữ liệu:

• Tải dữ liệu từ Google Drive


Sử dụng gói ’google.colab’ để mount Google Drive và sao chép file test.json vào
colab.

1 from google . colab import drive

3 # Mount Google Drive de co the truy cap du lieu

4 drive . mount ( ’/ content / drive ’)

15
5

6 # Sao chep file test . json tu Google Drive vao colab

7 ! cp / content / drive / MyDrive // luke / data / tacred / test . json test . json

• Hàm load dữ liệu vào Examples

– Mở và đọc nội dung từ file test.json.

– Duyệt qua từng mâu trong dữ liệu và trích xuất thông tin cần thiết.

– Xây dựng examples với các thông tin như văn bản, vị trí thực thể, và nhãn
quan hệ.

1 import json

3 def load_examples ( dataset_file ) :

4 # Doc du lieu tu file JSON

5 with open ( dataset_file , " r " ) as f :

6 data = json . load ( f )

8 examples = []

9 for i , item in enumerate ( data ) :

10 # Lay thong tin ve cac token va vi tri thuc the

11 tokens = item [ " token " ]

12 token_spans = dict (

13 subj =( item [ " subj_start " ] , item [ " subj_end " ] + 1) ,

14 obj =( item [ " obj_start " ] , item [ " obj_end " ] + 1)

15 )

16

17 # Xac dinh thu tu xuat hien cua cac thuc the

18 if token_spans [ " subj " ][0] < token_spans [ " obj " ][0]:

19 entity_order = ( " subj " , " obj " )

20 else :

21 entity_order = ( " obj " , " subj " )

22

23 text = " "

24 cur = 0

25 char_spans = {}

16
26

27 # Tao van ban voi vi tri thuc the va khoang trang phu hop

28 for target_entity in entity_order :

29 token_span = token_spans [ target_entity ]

30 text += " " . join ( tokens [ cur : token_span [0]])

31 if text :

32 text += " "

33 char_start = len ( text )

34 text += " " . join ( tokens [ token_span [0] : token_span [1]])

35 char_end = len ( text )

36 char_spans [ target_entity ] = ( char_start , char_end )

37 text += " "

38 cur = token_span [1]

39 text += " " . join ( tokens [ cur :])

40 text = text . rstrip ()

41

42 # tao mot vi du voi thong tin can thiet

43 examples . append ( dict (

44 text = text ,

45 entity_spans =[ tuple ( char_spans [ " subj " ]) , tuple ( char_spans [ " obj

" ]) ] ,

46 label = item [ " relation " ]

47 ))

48

49 return examples

50

51 # Load du lieu tu tap test . json

52 test_examples = load_examples ( " test . json " )

53

Tải và chuẩn bị mô hình và Tokenizer

• Tải mô hình

– Sử dụng hàm ’from_pretrained’ của thư viện Transformers để tải mô hình


đã được fine-tuned trên tập dữ liệu ACRED Relation Classification.

– Thiết lập mô hình ở chế độ evaluation (’eval’) để đảm bảo không có sự thay

17
đổi trọng số trong quá trình đánh giá.

1 # Load diem kiem tra mo hinh ( the model checkpoint )

2 model = L u k e F o r E n t i t y P a i r C l a s s i f i c a t i o n . from_pretrained ( " studio - ousia /

luke - large - finetuned - tacred " )

3 model . eval ()

4 model . to ( " cuda " )

• Tải Tokenizer:

– Tương tự, sử dụng hàm ’from_pretrained’ để tải tokenizer tương ứng với
mô hình đã được fine-tuned.

1 # Load the tokenizer

2 tokenizer = LukeTokenizer . from_pretrained ( " studio - ousia / luke - large -

finetuned - tacred " )

Đánh giá hiệu suất

• Thiết lập tham số đo lường

– ’batch_size’: Đây là kích thước của mỗi batch được sử dụng trong quá trình
đo lường hiệu suất.

– ’num_predicted’,’num_gold’,’num_correct’:Các biến để theo dõi số lượng


dự đoán, số lương nhãn thực tế, và số lượng dự đoán.

Hình 10: Thiết lập tham số đo lường

• Đo lường hiệu suất

– Sử dụng vòng lặp để duyệt qua từng batch của các ví dụ trong tập test.

18
– Chuẩn bị dữ liệu đầu vào bằng cách sử dụng tokenizer và chuyến về thiết bị
GPU (’cuda’).

– Thực hiện dự đoán với mô hình và trích xuất các nhãn dự đoán.

– Tính toán các chỉ số hiệu suất như số lượng dự đoán, số lượng nhãn thực tế,
và số lượng dự đoán chính xác.

Hình 11: Đo lường và đánh giá hiệu suất

• In ra kết quả:

– Tính toán các chỉ số hiệu suất như precision, recall, và F1 score.

– In ra kết quả đo lường hiệu suất để đánh gái mô hình trên tập dữ liệu ACRED
Relation Classification.

Hình 12: In ra kết quả

• Đánh giá kết quả:

19
– Kết quả đo lường hiệu suất cho thấy mô hình đạt được kết quả tốt trên tập
dữ liệu ACRED Relation Classification.

– Precision và Recall đều đạt giá trị 1.0, điều này chỉ ra rằng mô hình không có
dự đoán sai (false positives) hoặc bỏ sót (false negatives).

– F1 Score là sự kết hợp giữa Precision và Recall và cũng đạt giá trị 1.0, là một
kết quả rất lý tưởng.

– Mô hình hoạt động hiệu quả và chính xác trên tập dữ liệu ACRED Relation
Classification.

– Kết quả này có thể là do tập dữ liệu test được chọn có sự biểu diễn tốt của các
mối quan hệ giữa các cặp thực thể, hoặc có thể là do mô hình đã được huấn
luyện và fine-tuned một cách hiệu quả cho nhiệm vụ nhận dạng mối quan hệ
giữa các cặp thực thể trong tập dữ liệu này.

Phát hiện mối quan hệ giữa cặp thực thể (Detecting a relation between a pair
of entities)

• Ví dụ 1:

– Văn bản: "Beyoncé lives in Los Angeles."

– Entity Spans: [(0, 7), (17, 28)] (tương ứng với "Beyoncé" và "Los Angeles")

Hình 13: Ví dụ 1

– Kết quả: Predicted class: per:cities_of_residence

• Ví dụ 2:

– Văn bản: "TuanAnh study in UIT University."

20
– Entity Spans: [(0, 7), (17, 32)] (tương ứng với "TuanAnh" và "UIT Univer-
sity")

Hình 14: Ví dụ 2

– Kết quả: Predicted class: per:schools_attended

3.6 TÁI TẠO KẾT QUẢ THỬ NGHIỆM LUKE TRÊN OPEN ENTITY BẰNG CÁCH
SỬ DỤNG HUGGING FACE TRANSFORMERS

Tải và chuẩn bị dữ liệu

• Tải bộ dữ liệu:

– Gown Command:

1 ! gdown -- id 1 HlWw7Q6 - d F Sm 9 j NS C h 4V a B f1 P l Gq t 9 im

∗ Sử dụng ’gdown’ để tải xuống bộ dữ liệu từ Google Drive thông qua ID


củ tệp

– Trích xuất tệp nén

1 ! tar xzf / content / data . tar . gz

∗ Lệnh trên trích xuất nội dung của tệp nén ’data.tar.gz’.

– Di chuyển ’test.json’ đến thư mục làm việc

1 ! cp data / OpenEntity / test . json .

21
∗ Lệnh trên sao chép tệp ’test.json’ từ thư mục ’data/OpenEntity’ vào
thư mục làm việc hiện tại.

• Load bộ dữ liệu

– Hàm ’load_examples’:

Hình 15: Hàm ’load_examples’

∗ Hàm trên đọc nội dung của tệp ’test.json’, sau đó xử lý và chuyển đổi
dữ liệu thành một danh sách các ví dụ.

∗ Load dữ liệu từ tệp test.json

1 test_examples = load_examples ( " test . json " )

Tải và chuẩn bị mô hình và Tokenizer

• Load mô hình

– Load mô hình đã đào tạo

1 model = L u k e F o r E n t i t y C l a s s i f i c a t i o n . from_pretrained ( "

studio - ousia / luke - large - finetuned - open - entity " )

∗ Dòng trên sử dụng phương thức ’from_pretrained’ để tải mô hình


đã được đào tạo từ đường dẫn đã cung cấp ("studio-ousia/luke-large-

22
finetuned-open-entity"). Mô hình được được thiết kế để thực hiện nhiệm
vụ phân loại thực thể trtên bộ dữ liệu Open Entity Entity Typing.

– Chuyển mô hình sang chế độ đánh giá và sử dụng GPU (CUDA)

1 model . eval ()

2 model . to ( " cuda " )

∗ Hai dòng trên đặt mô hình vào chế độ đánh giá (’eval()’) và chuyển nó
sang sử dụng GPU (CUDA) để tận dụng tốc độ tính toán của GPU

• Load Tokenizer

1 tokenizer = LukeTokenizer . from_pretrained ( " studio - ousia / luke - large

- finetuned - open - entity " )

– Dòng trên sử dụng phương thức ’from_pretrained’ để tải tokenizer đã được


đào tạo từ đường dẫn đã cung cấp. Tokenizer này được sử dụng để chia văn
bản thành các đơn vị nhỏ hơn (token) để đua vào mô hình.

Đánh giá hiệu suất

• Chuẩn bị dữ liệu

– Bắt đầu với việc chuẩn bị các biến đếm và danh sách để lưu trữ kết quả.

– Sau đó, sử dụng vòng lặp để duyệt qua các ví dụ trong bộ dữ liệu kiểm thử
theo từng batch.

– ’texts’: Danh sách các văn bản của các ví dụ trong batch.

– ’entity_spans’: Danh sách các vị trí của các đơn vị thực thể trong văn bản.

– ’gold_labels’: Danh sách các nhãn vàng tương ứng với mỗi ví dụ.

1 # Thiet lap tham so do luong

2 batch_size = 128

3 num_predicted = 0

4 num_gold = 0

23
5 num_correct = 0

6 all_predictions = []

7 all_labels = []

9 # Lap lai cac vi du thu nghiem theo dot

10 for batch_start_idx in trange (0 , len ( test_examples ) , batch_size ) :

11 batch_examples = test_examples [ batch_start_idx : batch_start_idx +

batch_size ]

12 texts = [ example [ " text " ] for example in batch_examples ]

13 entity_spans = [ example [ " entity_spans " ] for example in

batch_examples ]

14 gold_labels = [ example [ " label " ] for example in batch_examples ]

15

• Tokenize và dự đoán

– Sử dụng tokenizer để chuyển đổi văn bản và vị trí thực thể thành đầu vào mô
hình.

– Chuyển đầu vào lên GPU dể tận dụng sức mạnh tính toán của GPU.

– Thực hiện forward pass mà không tính toán gradient, vì chúng ta chỉ đánh giá
hiệu suất.
1 # Tokenize the batch and chuyen sang GPU

2 inputs = tokenizer ( texts , entity_spans = entity_spans , return_tensors = "

pt " , padding = True )

3 inputs = inputs . to ( " cuda " )

5 # Thuc hien foward pass ma khong tinh toan gradient

6 with torch . no_grad () :

7 outputs = model (** inputs )

• Đánh gíá hiệu suất

– Duyệt qua các kết quả dự đoán của mô hình và so sánh chúng với nhãn vàng
để tính toán các độ đo hiệu suất.

– ’num_gold’: Số lượng thực thể thực tế trong toàn bộ bộ dữ liệu kiểm thử.

24
– ’num_predicted’: Số lượng thực thể được dự đoán bởi mô hình.

– ’num_correct’: Số lượng thực thể được dự đoán đúng bởi mô hình.


1 # Cap nhat bo dem ve precision , recall , and F1

2 num_gold += sum ( len ( l ) for l in gold_labels )

3 for logits , labels in zip ( outputs . logits , gold_labels ) :

4 for index , logit in enumerate ( logits ) :

5 if logit > 0:

6 num_predicted += 1

7 predicted_label = model . config . id2label [ index ]

8 if predicted_label in labels :

9 num_correct += 1

10

• Tính toán và xuất kết quả

– Tính toán các độ đo hiệu suất (precision, recall, F1) từ các biến đếm đã tính
được.Tính toán các độ đo hiệu suất (precision, recall, F1) từ các biến đếm đã
tính được.

– In kết quả ra màn hình để đánh giá hiệu suất của mô hình trên bộ dữ liệu
kiểm thử.

– Kết quả này sẽ giúp so sánh với các kết quả đã báo cáo trong bài báo gốc.
1 # Tinh toan precision , recall , and F1

2 precision = num_correct / num_predicted

3 recall = num_correct / num_gold

4 f1 = 2 * precision * recall / ( precision + recall )

6 # In ra ket qua

7 print ( f " \ n \ nprecision : { precision } recall : { recall } f1 : { f1 } " )

• Đánh giá kết quả:

– Precision: 0.798

∗ Điểm này cho biết mô hình có khả năng nhận dạng thực thể mộ cách
chính xác đáng kể.

25
– Recall: 0.766

∗ Tỉ lệ này cho thấy mô hình có khả năng bao quát khá tốt các thực thể
trong dữ liệu kiểm thử.

– F1-Score: 0.782

∗ Kết hợp giữa Precision và Recall, F1-Score ổn định tại một mức cao, đồng
nghĩa với việc mô hình đạt được sự cân bằng giữa chính xác và bao quát.

• Tổng quan về hiệu suất:

– Mô hình có hiệu suất khá tốt trên bộ dữ liệu Open Entity entity typing.

– Precision và Recall khá cân bằng, không có sự chệch lệch lớn giữa chúng, điều
này làm tăng tính tin cậy của mô hình.

Phát hiện các loại thực thể trong văn bản

• Ví dụ 3:

– Văn bản: "Beyoncé lives in Los Angeles."

– Entity Spans: [(0, 7)] (tương ứng với "Beyoncé")

– Kết quả dự đoán: Predicted entity type for Beyoncé: [’person’]

– Mô hình chính xác dự đoán "person" là loại thực thể cho "Beyoncé."

• Ví dụ 4:

– Văn bản: "Beyoncé lives in Los Angeles."

– Entity Spans: [(17, 28)] (tương ứng với "Los Angeles")

– Kết quả dự đoán: Predicted entity type for Los Angeles: [’location’, ’place’]

– Mô hình dự đoán đa dạng loại thực thể cho "Los Angeles," bao gồm "location"
và "place."

• Ví dụ 5:

– Văn bản: "Tho is studying at school."

26
– Entity Spans: [(0, 3)] (tương ứng với "Tho")

– Kết quả dự đoán: Predicted entity type for Tho: [’person’]

– Mô hình dự đoán "person" là loại thực thể cho "Tho."

• Ví dụ 6

– Văn bản: "Tho is studying at school."

– Entity Spans: [(19, 24)] (tương ứng với "school")

– Kết quả dự đoán: Predicted entity type for school: [’place’]

– Mô hình dự đoán "place" là loại thực thể cho "school."

4 TỔNG KẾT

• LUKE là một mô hình mạnh mẽ cho nhiệm vụ nhận diện thực thể đặc biệt và phân
loại mối quan hệ.

• Đối với nhiệm vụ nhận diện thực thể đặc biệt, LUKE xuất sắc trên tập dữ liệu
CoNLL-2003.

• Trong môi trường phân loại mối quan hệ của TACRED, LUKE hoàn thành nhiệm
vụ với độ chính xác tuyệt đối.

• Trong nhiệm vụ phân loại loại thực thể của Open Entity, LUKE có hiệu suất tốt,
nhưng vẫn có không gian để cải thiện.

27

You might also like