﻿1
00:00:00,286 --> 00:00:02,869
(subtle blast)

2
00:00:04,694 --> 00:00:07,380
- In this video, we will see together

3
00:00:07,380 --> 00:00:09,930
what is the normalizer component

4
00:00:09,930 --> 00:00:13,023
that we'd find at the
beginning of each tokenizer.

5
00:00:14,550 --> 00:00:16,830
The normalization operation consists

6
00:00:16,830 --> 00:00:19,890
in applying a succession
of normalization rules

7
00:00:19,890 --> 00:00:20,853
to the raw text.

8
00:00:21,870 --> 00:00:25,710
We choose normalization rules
to remove noise in the text

9
00:00:25,710 --> 00:00:27,900
which seem useless for the learning

10
00:00:27,900 --> 00:00:30,363
and use of our language model.

11
00:00:33,090 --> 00:00:37,470
Let's take a very diverse
sentence with different fonts,

12
00:00:37,470 --> 00:00:39,780
upper and lower case characters,

13
00:00:39,780 --> 00:00:43,083
accents, punctuation and multiple spaces,

14
00:00:43,920 --> 00:00:46,683
to see how several tokenizer normalize it.

15
00:00:48,488 --> 00:00:50,730
The tokenizer from the FNet model

16
00:00:50,730 --> 00:00:53,700
has transformed the
letter with font variants

17
00:00:53,700 --> 00:00:57,480
or circled into their basic version

18
00:00:57,480 --> 00:00:59,733
and has removed the multiple spaces.

19
00:01:00,960 --> 00:01:03,960
And now if we look at the normalization

20
00:01:03,960 --> 00:01:05,880
with Retribert's tokenizer,

21
00:01:05,880 --> 00:01:08,010
we can see that it keeps characters

22
00:01:08,010 --> 00:01:12,090
with several font variants
and keeps the multiple spaces,

23
00:01:12,090 --> 00:01:14,223
but it removes all the accents.

24
00:01:16,170 --> 00:01:18,870
And if we continue to
test this normalization

25
00:01:18,870 --> 00:01:23,040
of many other tokenizers
associated to models

26
00:01:23,040 --> 00:01:25,110
that we can find on the Hub,

27
00:01:25,110 --> 00:01:28,833
we see that they also propose
other kind of normalization.

28
00:01:33,900 --> 00:01:35,850
With the fast tokenizers,

29
00:01:35,850 --> 00:01:39,060
it's very easy to observe
the normalization chosen

30
00:01:39,060 --> 00:01:41,193
for the currently loaded tokenizer.

31
00:01:42,330 --> 00:01:46,140
Indeed, each instance of a fast tokenizer

32
00:01:46,140 --> 00:01:48,030
has an underlying tokenizer

33
00:01:48,030 --> 00:01:51,390
from the HuggingFace
Tokenizers library stored

34
00:01:51,390 --> 00:01:53,643
in the backend_tokenizer attribute.

35
00:01:54,690 --> 00:01:58,470
This object has itself
a normalizer attribute

36
00:01:58,470 --> 00:02:01,830
that we can use thanks to
the normalize_str method

37
00:02:01,830 --> 00:02:03,153
to normalize a string.

38
00:02:04,560 --> 00:02:08,700
It is thus very practical
that this normalization,

39
00:02:08,700 --> 00:02:11,070
which was used at the time of the training

40
00:02:11,070 --> 00:02:12,903
of the tokenizer was saved,

41
00:02:13,857 --> 00:02:16,200
and that it applies automatically

42
00:02:16,200 --> 00:02:19,233
when you ask a trained
tokenizer to tokenize a text.

43
00:02:21,000 --> 00:02:25,500
For example, if we hadn't
included the albert normalizer,

44
00:02:25,500 --> 00:02:28,770
we would have had a lot of unknown tokens

45
00:02:28,770 --> 00:02:30,930
by tokenizing this sentence

46
00:02:30,930 --> 00:02:33,213
with accents and capital letters.

47
00:02:35,730 --> 00:02:38,370
This transformation can
also be undetectable

48
00:02:38,370 --> 00:02:40,050
with a simple print.

49
00:02:40,050 --> 00:02:42,810
Indeed, keep in mind that for a computer,

50
00:02:42,810 --> 00:02:45,840
text is only a succession of 0 and 1,

51
00:02:45,840 --> 00:02:47,820
and it happens that different successions

52
00:02:47,820 --> 00:02:51,363
of 0 and 1 render the
same printed character.

53
00:02:52,380 --> 00:02:56,403
The 0 and 1 go in group
of 8 to form a byte.

54
00:02:57,480 --> 00:03:00,690
The computer must then
decode this sequence of bytes

55
00:03:00,690 --> 00:03:02,493
into a sequence of code points.

56
00:03:04,530 --> 00:03:09,530
In our example, the 2 bytes
is decoded using UTF-8

57
00:03:09,900 --> 00:03:11,403
into a single code point.

58
00:03:12,450 --> 00:03:15,090
The unicode standard then allows us

59
00:03:15,090 --> 00:03:18,191
to find the character
corresponding to this code point,

60
00:03:18,191 --> 00:03:20,283
the c cedilla.

61
00:03:21,499 --> 00:03:23,790
Let's repeat the same operation

62
00:03:23,790 --> 00:03:26,577
with this new sequence
composed of 3 bytes,.

63
00:03:27,420 --> 00:03:30,543
This time it is transformed
into two code points,

64
00:03:31,410 --> 00:03:35,280
which also correspond to
the c cedilla character.

65
00:03:35,280 --> 00:03:36,780
It is in fact the composition

66
00:03:36,780 --> 00:03:39,810
of the unicode Latin Small Letter C

67
00:03:39,810 --> 00:03:42,240
and the combining cedilla.

68
00:03:42,240 --> 00:03:45,000
But it's annoying because
what appears to us

69
00:03:45,000 --> 00:03:46,680
to be a single character

70
00:03:46,680 --> 00:03:49,653
is not at all the same
thing for the computer.

71
00:03:52,470 --> 00:03:57,240
Fortunately, there are unicode
standardization standards

72
00:03:57,240 --> 00:04:02,130
known as NFC, NFD, NFKC or NFKD

73
00:04:02,130 --> 00:04:04,893
that allow erasing some
of these differences.

74
00:04:05,730 --> 00:04:08,223
These standards are
often used by tokenizers.

75
00:04:09,900 --> 00:04:12,090
On all these previous examples,

76
00:04:12,090 --> 00:04:15,510
even if the normalizations
changed the look of the text,

77
00:04:15,510 --> 00:04:17,970
they did not change the content;

78
00:04:17,970 --> 00:04:19,177
you could still read,

79
00:04:19,177 --> 00:04:21,987
"Hello world, let's
normalize this sentence."

80
00:04:22,980 --> 00:04:25,980
However, you must be aware
that some normalizations

81
00:04:25,980 --> 00:04:30,363
can be very harmful if they are
not adapted to their corpus.

82
00:04:31,620 --> 00:04:34,387
For example, if you take
the French sentence,

83
00:04:34,387 --> 00:04:38,790
"Un pere indigne," which
means "An indignant father,"

84
00:04:38,790 --> 00:04:42,510
and normalize it with the
bert-base-uncase tokenizer

85
00:04:42,510 --> 00:04:44,313
which removes the accent,

86
00:04:45,150 --> 00:04:48,000
then the sentence
becomes "Un pere indigne"

87
00:04:48,000 --> 00:04:49,707
which means "An unworthy father".

88
00:04:53,460 --> 00:04:56,760
If you watched this video
to build your own tokenizer,

89
00:04:56,760 --> 00:04:59,610
there are no absolute
rules to choose or not

90
00:04:59,610 --> 00:05:02,970
a normalization for a new tokenizer,

91
00:05:02,970 --> 00:05:06,210
but I advise you to take
the time to select them

92
00:05:06,210 --> 00:05:10,743
so that they do not make you
lose important information.

93
00:05:12,296 --> 00:05:14,879
(subtle blast)

