ํํ ๋ฆฌ์ผ: ๋ค์๋ ์ํฐํฐ ์ธ์(NER)์ ์ํด BERT๋ฅผ ๋ฏธ์ธ ์กฐ์ ํ๋ ๋ฐฉ๋ฒ
ํํ ๋ฆฌ์ผ: NER์ฉ BERT๋ฅผ ๋ฏธ์ธ ์กฐ์ ํ๋ ๋ฐฉ๋ฒ
Skim AI์ ๋จธ์ ๋ฌ๋ ์ฐ๊ตฌ์ ํฌ๋ฆฌ์ค ํธ๋์ด ์ฒ์ ๊ฒ์ํ์ต๋๋ค.
์๊ฐ
์ด ๋ฌธ์์์๋ ๋ค์๋ ์ํฐํฐ ์ธ์(NER)์ ์ํด BERT๋ฅผ ๋ฏธ์ธ ์กฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํฉ๋๋ค. ํนํ, NER์ ์ํด BERT ๋ณํ์ธ SpanBERTa๋ฅผ ํ๋ จํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํฉ๋๋ค. ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ํ ์คํ์ธ์ด์ฉ ์ฌ์ฉ์ ์ง์ BERT ์ธ์ด ๋ชจ๋ธ ํ๋ จ์ ๋ํ ์๋ฆฌ์ฆ 3๋ถ ์ค 2๋ถ์ ๋๋ค:
- 1๋ถ: ์คํ์ธ์ด์ฉ RoBERTa ์ธ์ด ๋ชจ๋ธ์ ์ฒ์๋ถํฐ ํ๋ จํ๋ ๋ฐฉ๋ฒ
- 3๋ถ: ์ฒ์๋ถํฐ ์คํ์ธ์ด์ฉ ์ผ๋ ํธ๋ผ ์ธ์ด ๋ชจ๋ธ์ ํ๋ จํ๋ ๋ฐฉ๋ฒ
์ด์ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์ ์ ํฌ ํ์ด ์คํ์ธ์ด์ฉ ํธ๋์คํฌ๋จธ ์ธ์ด ๋ชจ๋ธ์ธ SpanBERTa๋ฅผ ์ฒ์๋ถํฐ ๋๊ท๋ชจ ๋ง๋ญ์น์ ๋ํด ์ฌ์ ํ์ต์ํจ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํ ๋ฐ ์์ต๋๋ค. ์ด ๋ชจ๋ธ์ ๋ฌธ๋งฅ์ ๋ฐ๋ผ ์ํ์ค์์ ๋ง์คํน๋ ๋จ์ด๋ฅผ ์ ํํ๊ฒ ์์ธกํ ์ ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์๋ ํธ๋์คํฌ๋จธ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ์ค์ ๋ก ํ์ฉํ๊ธฐ ์ํด ๋ช ๋ช ๋ ์ํฐํฐ ์ธ์ ์์ ์ ์ํด SpanBERTa๋ฅผ ๋ฏธ์ธ ์กฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
์ ์ ์์ ๋ฐ๋ฅด๋ฉด Wikipedia์ํฐํฐ ์๋ณ, ์ํฐํฐ ์ฒญํน, ์ํฐํฐ ์ถ์ถ์ด๋ผ๊ณ ๋ ํ๋ ๋ช ๋ช ๋ ์ํฐํฐ ์ธ์(NER)์ ๋น์ ํ ํ ์คํธ์ ์ธ๊ธ๋ ๋ช ๋ช ๋ ์ํฐํฐ๋ฅผ ์ฐพ์์ ์ฌ๋ ์ด๋ฆ, ์กฐ์ง, ์์น, ์๋ฃ ์ฝ๋, ์๊ฐ ํํ, ์๋, ํํ ๊ฐ์น, ๋ฐฑ๋ถ์จ ๋ฑ๊ณผ ๊ฐ์ ์ฌ์ ์ ์๋ ์นดํ ๊ณ ๋ฆฌ๋ก ๋ถ๋ฅํ๋ ์ ๋ณด ์ถ์ถ์ ํ์ ์์ ์ ๋๋ค.
์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. run_ner.py
ํ๊น
ํ์ด์ค์ CoNLL-2002 ๋ฐ์ดํฐ ์ธํธ ๋ฅผ ์ฌ์ฉํ์ฌ SpanBERTa๋ฅผ ๋ฏธ์ธ ์กฐ์ ํ ์ ์์ต๋๋ค.
์ค์
๋ค์ด๋ก๋ ํธ๋์คํฌ๋จธ
๋ฅผ ํด๋ฆญํ๊ณ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํฉ๋๋ค.
%pture
!.git clone https://github.com/huggingface/transformers
ํธ๋์คํฌ๋จธ
!.pip ์ค์น .
!.pip ์ค์น -r ./examples/requirements.txt
..
๋ฐ์ดํฐ
1. ๋ฐ์ดํฐ ์ธํธ ๋ค์ด๋ก๋
์๋ ๋ช ๋ น์ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์์ถ์ ํด์ ํฉ๋๋ค. ํ์ผ์๋ ๋ค์ ์ธ ๊ฐ์ง ๋ถ๋ถ์ ๋ํ ํ๋ จ ๋ฐ ํ ์คํธ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. CoNLL-2002 ๊ณต์ ์์ :
- esp.testa: ๊ฐ๋ฐ ๋จ๊ณ๋ฅผ ์ํ ์คํ์ธ์ด ํ ์คํธ ๋ฐ์ดํฐ
- esp.testb: ์คํ์ธ์ด ํ ์คํธ ๋ฐ์ดํฐ
- esp.train: ์คํ์ธ ์ด์ฐจ ๋ฐ์ดํฐ
%pture
!wget -O 'conll2002.zip' 'https://drive.google.com/uc?export=download&id=1Wrl1b39ZXgKqCeAFNM9EoXtA1kzwNhCe'
!.unzip 'conll2002.zip'
๊ฐ ๋ฐ์ดํฐ ์งํฉ์ ํฌ๊ธฐ์ ๋๋ค:
!wc -l conll2002/esp.train
!wc -l conll2002/esp.testa
!wc -l conll2002/esp.testb
273038 conll2002/esp.train
54838 conll2002/esp.testa
53050 conll2002/esp.testb
๋ชจ๋ ๋ฐ์ดํฐ ํ์ผ์๋ ๋จ์ด, ๊ด๋ จ ํ์ฌ ํ๊ทธ, IOB2 ํ์์ ๋ช ๋ช ๋ ์ํฐํฐ ํ๊ทธ์ ์ธ ๊ฐ์ง ์ด์ด ์์ต๋๋ค. ๋ฌธ์ฅ ๋๋๊ธฐ๋ ๋น ์ค๋ก ์ธ์ฝ๋ฉ๋ฉ๋๋ค.
!head -n20 conll2002/esp.train
๋ฉ๋ฒ๋ฅธ NP B-LOC
( Fpa O
ํธ์ฃผ NP B-LOC
) Fpt O
, Fc O
25 Z O
may NC O
( Fpa O
EFE NC B-ORG
) Fpt O
. Fp O
- Fg O
El DA O
Abogado NC B-PER
์ผ๋ฐ AQ I-PER
๋ธ SP I-PER
NC ์ํ I-PER
, Fc O
ํ๋ จ, ๊ฐ๋ฐ ๋ฐ ํ ์คํธ ๋ฐ์ดํฐ ์ธํธ์ ๊ฒฝ์ฐ ๋จ์ด ์ด๊ณผ ๋ช ๋ช ๋ ์ํฐํฐ ํ๊ทธ ์ด๋ง ์ ์งํฉ๋๋ค.
!cat conll2002/esp.train | cut -d " " -f 1,3 > train_temp.txt
!cat conll2002/esp.testa | cut -d " " -f 1,3 > dev_temp.txt
!cat conll2002/esp.testb | cut -d " " -f 1,3 > test_temp.txt
2. ์ ์ฒ๋ฆฌ
์ถ๊ฐ ์ ์ฒ๋ฆฌ ๋จ๊ณ์ ๋ชจ๋ธ ํ์ต์ ํ์ํ ๋ช ๊ฐ์ง ๋ณ์๋ฅผ ์ ์ํด ๋ณด๊ฒ ์ต๋๋ค:
MAX_LENGTH = 120 #@param {type: "์ ์"}
MODEL = "chriskhanhtran/spanberta" #@param ["chriskhanhtran/spanberta", "bert-base-multilingual-cased"]
์๋ ์คํฌ๋ฆฝํธ๋ ๋ค์๋ณด๋ค ๊ธด ๋ฌธ์ฅ์ ๋ถํ ํฉ๋๋ค. MAX_LENGTH
(ํ ํฐ ๊ธฐ์ค)์ ์์ ํ ํฐ์ผ๋ก ์ค์ฌ์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํ ํฐํํ ๋ ๊ธด ๋ฌธ์ฅ์ด ์๋ ค์ ํ์ต ๋ฐ์ดํฐ๊ฐ ์์ค๋๊ณ ํ
์คํธ ์ธํธ์ ์ผ๋ถ ํ ํฐ์ด ์์ธก๋์ง ์์ ์ ์์ต๋๋ค.
%pture
!.wget "https://raw.githubusercontent.com/stefan-it/fine-tuned-berts-seq/master/scripts/preprocess.py"
!python3 preprocess.py train_temp.txt $MODEL $MAX_LENGTH > train.txt
!python3 preprocess.py dev_temp.txt $MODEL $MAX_LENGTH > dev.txt
!python3 preprocess.py test_temp.txt $MODEL $MAX_LENGTH > test.txt
2020-04-22 23:02:05.747294: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ libcudart.so.10.1์ ์ฑ๊ณต์ ์ผ๋ก ์ด์์ต๋๋ค.
๋ค์ด๋ก๋ ์ค์
๋๋ค: 100% 1.03k/1.03k [00:00<00:00, 704kB/s]
๋ค์ด๋ก๋ ์ค์
๋๋ค: 100% 954k/954k [00:00<00:00, 1.89MB/s]
๋ค์ด๋ก๋ ์ค: 100% 512k/512k [00:00<00:00, 1.19MB/s]
๋ค์ด๋ก๋ ์ค: 100% 16.0/16.0 [00:00<00:00, 12.6kB/s]
2020-04-22 23:02:23.409488: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ libcudart.so.10.1์ ์ฑ๊ณต์ ์ผ๋ก ์ด์์ต๋๋ค.
2020-04-22 23:02:31.168967: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ libcudart.so.10.1์ ์ฑ๊ณต์ ์ผ๋ก ์ด์์ต๋๋ค.
3. ๋ผ๋ฒจ
CoNLL-2002/2003 ๋ฐ์ดํฐ ์ธํธ์๋ 9๊ฐ์ง ํด๋์ค์ NER ํ๊ทธ๊ฐ ์์ต๋๋ค:
- O, ๋ช ๋ช ๋ ์ํฐํฐ ์ธ๋ถ
- B-MIS, ๋ค๋ฅธ ๊ธฐํ ๋ฒ์ธ ๋ฐ๋ก ๋ค์ ๊ธฐํ ๋ฒ์ธ ์์
- I-MIS, ๊ธฐํ ๋ฒ์ธ
- B-PER, ๋ค๋ฅธ ์ฌ๋ ์ด๋ฆ ๋ฐ๋ก ๋ค์ ์ด๋ฆ ์์ ๋ถ๋ถ
- I-PER, ๊ฐ์ธ ์ด๋ฆ
- B-ORG, ๋ค๋ฅธ ์กฐ์ง์ ๋ฐ๋ก ๋ค์์ ์์๋๋ ์กฐ์ง์ ์์
- I-ORG, ์กฐ์ง
- B-LOC, ๋ค๋ฅธ ์์น ๋ฐ๋ก ๋ค์ ์๋ ์์น์ ์์์
- I-LOC, ์์น
๋ฐ์ดํฐ ์งํฉ์ CoNLL-2002/2003 ๋ฐ์ดํฐ ์งํฉ๊ณผ ๋ค๋ฅธ ๋ ์ด๋ธ์ด ์๊ฑฐ๋ ๋ ๋ง์ ๋ ์ด๋ธ์ด ์๋ ๊ฒฝ์ฐ ์๋ ์ค์ ์คํํ์ฌ ๋ฐ์ดํฐ์์ ๊ณ ์ ๋ ์ด๋ธ์ ๊ฐ์ ธ์์ ๋ค์ ์์น์ ์ ์ฅํฉ๋๋ค. labels.txt
. ์ด ํ์ผ์ ๋ชจ๋ธ ๋ฏธ์ธ ์กฐ์ ์ ์์ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
!cat train.txt dev.txt test.txt | cut -d " " -f 2 | grep -v "^$"| sort | uniq > labels.txt
๋ฏธ์ธ ์กฐ์ ๋ชจ๋ธ
๋ค์์ ๋ค์์ ์์ ์คํฌ๋ฆฝํธ์
๋๋ค. ํธ๋์คํฌ๋จธ
์ ์ ์ฅ์์์ NER์ฉ ๋ชจ๋ธ์ ๋ฏธ์ธ ์กฐ์ ํ๋ ๋ฐ ์ฌ์ฉํ ๊ฒ์
๋๋ค. 2020๋
4์ 21์ผ ์ดํ Hugging Face๋ ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์
๋ฐ์ดํธํ์ฌ ์๋ก์ด ํธ๋ ์ด๋
ํด๋์ค๋ฅผ ์ฌ์ฉํ์ธ์. ํฅํ ์ถฉ๋์ ๋ฐฉ์งํ๋ ค๋ฉด ์ด๋ฌํ ์
๋ฐ์ดํธ ์ด์ ๋ฒ์ ์ ์ฌ์ฉํ์ธ์.
%pture
!wget "https://raw.githubusercontent.com/chriskhanhtran/spanish-bert/master/ner/run_ner.py"
!wget "https://raw.githubusercontent.com/chriskhanhtran/spanish-bert/master/ner/utils_ner.py"
์ด์ ์ด์ ํ์ต์ ํ ์ฐจ๋ก์ ๋๋ค. ๋ด ์ด์ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๋ ๋๊ท๋ชจ ์คํ์ธ์ด ๋ง๋ญ์น์ ๋ํด RoBERTa ์ธ์ด ๋ชจ๋ธ์ ์ฌ์ ํ์ต์์ผ ๋ฌธ๋งฅ์ ๋ฐ๋ผ ๋ง์คํฌ๋ ๋จ์ด๋ฅผ ์์ธกํ์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ชจ๋ธ์ ์ธ์ด์ ๊ณ ์ ํ ์์ฑ์ ํ์ตํ์ต๋๋ค. ์ฌ์ ํ์ต๋ ๋ชจ๋ธ์ ํ๊น ํ์ด์ค์ ์๋ฒ์ ์ ๋ก๋ํ์ต๋๋ค. ์ด์ ๋ชจ๋ธ์ ๋ก๋ํ๊ณ NER ์์ ์ ๋ง๊ฒ ๋ฏธ์ธ ์กฐ์ ์ ์์ํ๊ฒ ์ต๋๋ค.
์๋๋ ํธ๋ ์ด๋ ํ์ดํผํ๋ผ๋ฏธํฐ์ ๋๋ค.
MAX_LENGTH = 128 #@param {type: "์ ์"}
MODEL = "chriskhanhtran/spanberta" #@param ["chriskhanhtran/spanberta", "bert-base-multilingual-cased"]
OUTPUT_DIR = "spanberta-ner" #@param ["spanberta-ner", "bert-base-ml-ner"]
BATCH_SIZE = 32 #@param {type: "์ ์"}
NUM_EPOCHS = 3 #@param {type: "์ ์"}
SAVE_STEPS = 100 #@param {type: "integer"}
LOGGING_STEPS = 100 #@param {type: "์ ์"}
SEED = 42 #@param {type: "integer"}
๊ต์ก์ ์์ํ๊ฒ ์ต๋๋ค.
!python3 run_ner.py
--data_dir ./
--model_type bert
--labels ./labels.txt
--model_name_or_path $MODEL
--output_dir $OUTPUT_DIR
--max_seq_length $MAX_LENGTH
--num_train_epochs $NUM_EPOCHS
--per_gpu_train_batch_size $BATCH_SIZE
--save_steps $SAVE_STEPS
--logging_steps $LOGGING_STEPS
--seed $SEED
--do_train
--do_eval
--do_predict
--overwrite_output_dir
๊ฐ๋ฐ ์ธํธ์์์ ์ฑ๋ฅ:
04/21/2020 02:24:31 - INFO - __main__ - ***** ํ๊ฐ ๊ฒฐ๊ณผ *****
04/21/2020 02:24:31 - INFO - __main__ - f1 = 0.831027443864822
04/21/2020 02:24:31 - INFO - __main__ - ์์ค = 0.1004064822183894
04/21/2020 02:24:31 - INFO - __main__ - ์ ๋ฐ๋ = 0.8207885304659498
04/21/2020 02:24:31 - INFO - __main__ - recall = 0.8415250344510795
ํ ์คํธ ์ธํธ์์์ ์ฑ๋ฅ:
04/21/2020 02:24:48 - INFO - __main__ - ***** ํ๊ฐ ๊ฒฐ๊ณผ *****
04/21/2020 02:24:48 - INFO - __main__ - f1 = 0.8559533721898419
04/21/2020 02:24:48 - INFO - __main__ - ์์ค = 0.06848683688204177
04/21/2020 02:24:48 - INFO - __main__ - ์ ๋ฐ๋ = 0.845858475041141
04/21/2020 02:24:48 - INFO - __main__ - recall = 0.8662921348314607
๋ค์์ ๋ฏธ์ธ ์กฐ์ ์ ํ ์๋ณด๋์ ๋๋ค. ์คํฌ๋ฒํ ๋ฐ bert-๊ธฐ๋ฐ-๋ค๊ตญ์ด-์ผ์ด์ค ๋ฅผ 5๊ฐ์ ์ํฌํฌ๋ก ์ค์ ํฉ๋๋ค. 3๊ฐ์ ์ํฌํฌ ์ดํ์๋ ๋ชจ๋ธ์ด ํ์ต ๋ฐ์ดํฐ์ ๊ณผ๋ํ๊ฒ ์ ํฉํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๋ถ๋ฅ ๋ณด๊ณ ์
๋ชจ๋ธ์ด ์ค์ ๋ก ์ผ๋ง๋ ์ ์๋ํ๋์ง ์ดํดํ๊ธฐ ์ํด ์์ธก์ ๋ก๋ํ๊ณ ๋ถ๋ฅ ๋ณด๊ณ ์๋ฅผ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
def read_examples_from_file(file_path):
"""CoNLL-2002/2003 ๋ฐ์ดํฐ ํ์ผ์์ ๋จ์ด์ ๋ ์ด๋ธ์ ์ฝ์ต๋๋ค.
Args:
file_path (str): NER ๋ฐ์ดํฐ ํ์ผ์ ๊ฒฝ๋ก.
๋ฐํํฉ๋๋ค:
์์(๋์
๋๋ฆฌ): ๋ ๊ฐ์ ํค๊ฐ ์๋ ๋์
๋๋ฆฌ: words
(๋ชฉ๋ก ๋ชฉ๋ก)
๊ฐ ์ํ์ค์์ ๋จ์ด๋ฅผ ๋ค๊ณ ๋ ์ด๋ธ
(๋ชฉ๋ก ๋ชฉ๋ก) ๋ณด์
ํด๋น ๋ ์ด๋ธ.
"""
์ด๋ค(ํ์ผ_๊ฒฝ๋ก, ์ธ์ฝ๋ฉ="utf-8")๋ฅผ f๋ก ์ฌ์ฉํฉ๋๋ค:
examples = {"words": [], "labels": []}
words = []
labels = []
f์ ์ค์ ๋ํด
if line.startswith("-DOCSTART-") ๋๋ line == "" ๋๋ line == "\n":
if words:
examples["words"].append(words)
examples["labels"].append(labels)
words = []
labels = []
else:
splits = line.split(" ")
words.append(splits[0])
len(splits) > 1์ด๋ฉด
labels.append(splits[-1].replace("\n", ""))
else:
# ์์ ์์๋ mode = "test"์ ๋ํ ๋ ์ด๋ธ์ด ์์ ์ ์์ต๋๋ค.
labels.append("O")
๋ฐํ ์์
์์ ํ ์คํธ ํ์ผ์์ ๋ฐ์ดํฐ์ ๋ ์ด๋ธ์ ์ฝ์ต๋๋ค:
y_true = read_examples_from_file("test.txt")["labels"]
y_pred = read_examples_from_file("spanberta-ner/test_predictions.txt")["labels"]
๋ถ๋ฅ ๋ณด๊ณ ์๋ฅผ ์ธ์ํฉ๋๋ค:
seqeval.metrics์์ classification_report๋ฅผ classification_report_seqeval๋ก ๊ฐ์ ธ์ต๋๋ค.
print(classification_report_seqeval(y_true, y_pred))
์ ๋ฐ ๋ฆฌ์ฝ F1 ์ ์ ์ง์
LOC 0.87 0.84 0.85 1084
ORG 0.82 0.87 0.85 1401
๊ธฐํ 0.63 0.66 0.65 340
PER 0.94 0.96 0.95 735
๋ง์ดํฌ๋ก ํ๊ท 0.84 0.86 0.85 3560
๋งคํฌ๋ก ํ๊ท 0.84 0.86 0.85 3560
์ด ๋ณด๊ณ ์์ ํ์๋๋ ๋ฉํธ๋ฆญ์ ์ํฐํฐ์ ๋ชจ๋ ๋จ์ด๊ฐ ์ ํํ๊ฒ ์์ธก๋์ด์ผ ํ๋์ ์ ํํ ์์ธก์ผ๋ก ๊ณ์ฐ๋๋ NER ๋ฐ POS ํ๊น ๊ณผ ๊ฐ์ NLP ์์ ์ ์ํด ํน๋ณํ ์ค๊ณ๋์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ๋ถ๋ฅ ๋ณด๊ณ ์์ ๋ฉํธ๋ฆญ์ ๋ค์๋ณด๋ค ํจ์ฌ ๋ฎ์ต๋๋ค. SCIKIT-Learn์ ๋ถ๋ฅ ๋ณด๊ณ ์.
numpy๋ฅผ np๋ก ๊ฐ์ ธ์ต๋๋ค.
sklearn.metrics์์ classification_report ๊ฐ์ ธ์ค๊ธฐ
print(classification_report(np.concatenate(y_true), np.concatenate(y_pred)))
์ ๋ฐ ๋ฆฌ์ฝ F1 ์ ์ ์ง์
B-LOC 0.88 0.85 0.86 1084
B-MISC 0.73 0.73 0.73 339
B-OG 0.87 0.91 0.89 1400
B-PER 0.95 0.96 0.95 735
I-LOC 0.82 0.81 0.81 325
I-MISC 0.85 0.76 0.80 557
I-OG 0.89 0.87 0.88 1104
I-PER 0.98 0.98 0.98 634
O 1.00 1.00 1.00 45355
์ ํ๋ 0.98 51533
๋งคํฌ๋ก ํ๊ท 0.89 0.87 0.88 51533
WEIGHTED AVG 0.98 0.98 0.98 51533
์์ ๋ณด๊ณ ์์์ ๋ณผ ์ ์๋ฏ์ด ์ ํฌ ๋ชจ๋ธ์ ์ฌ๋, ์์น, ์กฐ์ง์ ์์ธกํ๋ ๋ฐ ์ข์ ์ฑ๋ฅ์ ๋ณด์
๋๋ค. ๋ค์์ ์ํด ๋ ๋ง์ ๋ฐ์ดํฐ๊ฐ ํ์ํฉ๋๋ค. MISC
์ํฐํฐ๋ฅผ ์ถ๊ฐํ์ฌ ์ด๋ฌํ ์ํฐํฐ์ ๋ํ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ๊ฐ์ ํฉ๋๋ค.
ํ์ดํ๋ผ์ธ
๋ชจ๋ธ์ ๋ฏธ์ธ ์กฐ์ ํ ํ์๋ ์ด ํํ ๋ฆฌ์ผ์ ๋ฐ๋ผ ์ปค๋ฎค๋ํฐ์ ๊ณต์ ํ ์ ์์ต๋๋ค. ํ์ด์ง. ์ด์ Hugging Face์ ์๋ฒ์์ ๋ฏธ์ธ ์กฐ์ ๋ ๋ชจ๋ธ์ ๋ก๋ํ์ฌ ์คํ์ธ์ด ๋ฌธ์์์ ๋ช ๋ช ๋ ์ํฐํฐ๋ฅผ ์์ธกํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํธ๋์คํฌ๋จธ์์ ๊ฐ์ ธ์ค๊ธฐ ํ์ดํ๋ผ์ธ, ์๋ ๋ชจ๋ธ ํฌ ํ ํฐ ๋ถ๋ฅ, ์๋ ํ ํฐ ํ๊ธฐ
model = AutoModelForTokenClassification.from_pretrained("skimai/spanberta-base-cased-ner-conll02")
ํ ํฐํ๊ธฐ = AutoTokenizer.from_pretrained("skimai/spanberta-base-cased-ner-conll02")
ner_model = ํ์ดํ๋ผ์ธ('ner', ๋ชจ๋ธ=๋ชจ๋ธ, ํ ํฐํ๊ธฐ=ํ ํฐํ๊ธฐ)
์๋ ์๋ ๋ค์์์ ๊ฐ์ ธ์จ ๊ฒ์ ๋๋ค. ์๊ฒฌ ๊ทธ๋ฆฌ๊ณ "์คํฐ๋ธ ๋ฏ๋์ ์ฌ๋ฌด์ฅ๊ด์ ์ฝ๋ก๋19 ํฌ๋ฐ๋ฏน ์ดํ ๋ฏธ๊ตญ์ ๊ฒฝ์ ํ๋ณต์ ์๊ฐ์์ด ๊ฑธ๋ฆด ๊ฒ์ด๋ผ๊ณ ๋งํ์ต๋๋ค."
์ํ์ค = "La recuperaciรณn econรณmica de los Estados United States despuรฉs de la " \
"์ฝ๋ก๋ ๋ฐ์ด๋ฌ์ค ํฌ๋ฐ๋ฏน์ ๋ช ๋ฌ ์์ ๋๋ ๊ฒ์ด๋ผ๊ณ " \
"์คํฐ๋ธ ๋ฏ๋์ ์ฌ๋ฌด์ฅ๊ด."
ner_model(์ํ์ค)
[{'entity': 'B-ORG', 'score': 0.9155661463737488, 'word': 'ฤ Estados'},
{'entity': 'I-ORG', 'score': 0.800682544708252, 'word': 'ฤ Unidos'},
{'entity': 'I-MISC', 'score': 0.5006815791130066, 'word': 'ฤ corona'},
{'entity': 'I-MISC', 'score': 0.510674774646759, 'word': 'virus'},
{'entity': 'B-PER', 'score': 0.5558510422706604, 'word': 'ฤ Secretario'},
{'entity': 'I-PER', 'score': 0.7758238315582275, 'word': 'ฤ del'},
{'entity': 'I-PER', 'score': 0.7096233367919922, 'word': 'ฤ Tesoro'},
{'entity': 'B-PER', 'score': 0.9940345883369446, 'word': 'ฤ Steven'},
{'entity': 'I-PER', 'score': 0.9962581992149353, 'word': 'ฤ M'},
{'entity': 'I-PER', 'score': 0.9918380379676819, 'word': 'n'},
{'entity': 'I-PER', 'score': 0.9848328828811646, 'word': 'uch'},
{'entity': 'I-PER', 'score': 0.8513168096542358, 'word': 'in'}]
๋ฉ์ง๋ค์! ๋ฏธ์ธ ์กฐ์ ๋ ๋ชจ๋ธ์ ์์ ์์ ๋ชจ๋ ์ํฐํฐ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ธ์ํ๊ณ ์ฌ์ง์ด "์ฝ๋ก๋ ๋ฐ์ด๋ฌ์ค"๋ ์ธ์ํฉ๋๋ค.
๊ฒฐ๋ก
๋ช ๋ช ๋ ๊ฐ์ฒด ์ธ์์ ํ ์คํธ์์ ์ค์ํ ์ ๋ณด๋ฅผ ๋น ๋ฅด๊ฒ ์ถ์ถํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋น์ฆ๋์ค์ ์ ์ฉํ๋ฉด ๊ณ์ฝ์๋ ๋ฌธ์๋ฅผ ์ฝ๋ ์ฌ๋์ ์์ฐ์ฑ ํฅ์์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ NER์ ๋จ์ด ์์ค์์ ์ ํํ ๋ถ๋ฅ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ๋ฐฑ์ค๋ธ์๋์ ๊ฐ์ ๋จ์ํ ์ ๊ทผ ๋ฐฉ์์ผ๋ก๋ ์ด ์์ ์ ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ๊น๋ค๋ก์ด NLP ์์ ์ ๋๋ค.
์ฌ์ ํ์ต๋ BERT ๋ชจ๋ธ์ ํ์ฉํ์ฌ ์คํ์ธ์ด์ ๋ํ NER ์์ ์์ ์ฐ์ํ ์ฑ๋ฅ์ ๋น ๋ฅด๊ฒ ์ป์ ์ ์๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์์ต๋๋ค. ์ฌ์ ํ๋ จ๋ SpanBERTa ๋ชจ๋ธ์ ๋ฌธ์ ๋ถ๋ฅ์ ๊ฐ์ ๋ค๋ฅธ ์์ ์๋ ๋ฏธ์ธ ์กฐ์ ํ ์ ์์ต๋๋ค. ์ํ์ค ๋ถ๋ฅ ๋ฐ ๊ฐ์ ๋ถ์์ ์ํด BERT๋ฅผ ๋ฏธ์ธ ์กฐ์ ํ๋ ์์ธํ ํํ ๋ฆฌ์ผ์ ์์ฑํ์ต๋๋ค.
์ด ์๋ฆฌ์ฆ์ ๋ค์ 3๋ถ์์๋ ์ต์ ์ฑ๋ฅ์ ๋น ๋ฅด๊ฒ ๋ฌ์ฑํ ์ ์๋ ๋ณ์๊ธฐ ๋ชจ๋ธ์ ๋ํ ๋ณด๋ค ํจ์จ์ ์ธ ์ฌ์ ๊ต์ก ์ ๊ทผ ๋ฐฉ์์ธ ELECTRA๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํฉ๋๋ค. ๊ธฐ๋ํด์ฃผ์ธ์!