[ 자연어 처리 ] 자연어처리 개요
2023. 9. 11. 21:05ㆍ자연어 처리
728x90
1. 자연어 (Natural Language Processing, NLP)
- 프로그래밍 언어와 같이 인공적으로 만든 기계언어와 대비되는 단어로, 우리가 일상에서 주로 사용하는 언어
1-1. 자연어 처리
- 컴퓨터가 한국어나 영어와 같은 인간의 자연어를 읽고 이해할 수 있도록 돕는 인공지능의 한 분야
- 자연어에서 의미 있는 정보를 추출하여 활용
- 기계가 자연어의 의미를 이해하게 함
- 기계가 사람의 언어로 소통할 수 있게 함
1-2.자연어처리의 활용
- 문서 분류, 스팸 처리와 같은 분류 문제부터 검색어 추천과 같은 추천기능, 음성인식, 질의 응답, 번영 등의 다양한 분야에서 사용되고 있음
- 반복 업무 자동화
- 검색 효율 향상 및 검색 엔진 최적화
- 대규모 문석 분석 및 정리
- 소셜 미디어 분석
1-3. 용어 정리
- 자연어이해(Natural Language Understanding, NLU)
- 자연어 처리의 하위 집합
- 자연어 이해 기술의 목족은 일반적으로 기계가 자연어의 실제 의미, 의도나 감정 질문 등을 사람처럼 이해하도록 돕는 것
- 기계가 다양한 텍스트의 숨겨진 의미를 해서하려면 사전 처리 작업들과 추가 학습이 필요
- " 참 잘한다"
- 텍스트에 명시적으로 나타나는 표지적인 정보 이외에 숨겨진 뜻을 파악
- 비 언어적인 신호(표정, 손짓, 몸짓)도 힌트로 사용될 수 있음
- 텍스트에서 의미있는 정보를 추출하는 기술과 상황을 통계적으로 학습시킬 수 있는 다량의 데이터가 필요함
- 자연어 생성(Natural Language Generation, NLG)
- 기계가 사람의 언어를 직접 생성하도록 돕는 기술
- NLG는 기계가 일련의 계산 결과를 사람의 언어를 표현하도록 도와줌
2. 자연어 처리 다양한 Task
2-1. Text Classification
- 단어, 문장, 문서 단위의 텍스트에 사전 정의된 카테고리를 할당하는 작업
- Sentiment Analysis: 주어진 문장의 감정을 분류
- Abusing Detection: 주어진 문장의 어뷰징 여뷰를 판별 # 욕이나 이런걸 막기 위해 하는것 ex) 비방용 댓글 막기
2-2. Information Retrieval and Document Ranking
- 두 문서나 문장 간 유사도를 결정하는 작업
- Text Similarity Task는 dcoument DB가 있을 때 query text에 대해서 가장 유사한 문서를 반환하는 것을 ㅁ고표로 하는 Retrival 혹은 ranking 작업으로 확장될 수 있음
2-3. Text to text Genenration
- 텍스트를 입력으로 받아 목표를 달성하는 텍스트를 생성하는 작업
- 소스 언어의 텍스트를 의미를 유지한 채 타겟언어의 텍스트로 번역하는 작업
- 여러 문서들의 의미를 유지한 채 거 닯은 버전의 텍스트로 요약하는 작업
- 포괄적인 관점에서 사람이 작성한 것은 텍스트를 생성하는 작업
2-4. Knowledge bases,Entities and Relation
- 지식 기반,의미론적인 인티티나 관계를 파악하는 자연어처리 분야
2-5. Topics and Keywords
- 문서 혹은 문장 내의 주제나 키워드를 파악하는 자연어처리 분야
2-6. Charbots
- 음성이나 문자를 통한 인간과의 대화를 통해서 특정한 작업을 수행하도록 컴퓨터 프로그램
- 정해진 규칙에 맞춰서 메시지를 입력하면 발활르 출력하는 규칙 기반 챗봇부터 문맥을 입력받아 적절한 답변을 생성. 거맥하여 인공지능 기반 챗봇 등이 있음
2-7. Test Reasoninf
- 주어진 지식이나 상식을 활용하여 일련의 추론 작업을 수행하는 작업
- 간단한 수학 문제들을 푼다고 생각해보면 일련의 계산 과정에 의해 답을 도출하게 되는데 일련의 계산 과정을 추론 과정이라함
2-8. Fake Nows and Hate Speech Detection
- 허위 혹은 오해의 소지가 있는 정보가 포함된 텍스트를 감지하고 필터링하는 작업
- 소셜 미디어 혹은 배포 중인 제품에서 발생하는 여뷰징 콘텐츠들을 필터링 하기 위해 사용
2-9 Text to Data and vice-versa
- 자연어처리 작업 단일 모달인 텍스트 관련 작업 뿐만 아니라, 입출력의 모달을 다양하게 활용할 수 있음
- 음성을 텍스트(STT) 로 혹은 텍스트롤(TTS으로 변환하는 작업이나, 텍스트를 이미지(Text to Image)로 변환하는 작업 등이 실무 또는 학계에서 많이 논의됨
3.자연어처리 진행 순서
3-1.문제 정의
- 문제에 대한 솔루션이 있어야 하고, 명확하고 구체적일수록 알맞는 자연어처리 기술을 찾을 수 있음
3-2. 데이터 수집 및 분석
- 다양한 학습데이터를 수집하기 위해 공개된 데이터셋, 유료 데이터셋 또는 웹 크롤링을 사용하여 수집
- https://paperswithcode.com/datasets?mod=texts&task=question-answering
- 웹 크롤링을 통해 데이터를 수집했다면 EDA 및 분석 작업을 통해 데이터를 철저하게 검증해야 함(탐색적 데이터 분석)
- 정답 레이블이 필요하다면 수집한 데이터에 레이블을 붙여야 함(M-Turk,SELECTSTART)
3-3. 데이터 전처리
- 학습에 용이하게 데이터를 수정 / 보완하는 작업
- 자연어처리 진행 과정에서 데이터가 차지하는 비중이 매우 높기 때문에 데이터를 수집하고 전처리하는 과정이 매우 중요함
- 토큰화 (Tokenization) : 주어진 데이터셋에서 문장이나 문서들을 토큰이라 불리는 단위로 나누는 작업
- 정제 (Cleaning) : 갖고 있는 데이터셋으로부터 노이즈 데이터(이상치,편향 등)를 제거하는 작업
- 정규화 (normalization) : 표현 방법이 다른 데이터들을 통합시켜서 같은 항목으로 합침
3-4. 모델링
- 자연어처리 작업은 대부분 단어 토큰들을 결과로 표현
- 언어 모델을 사용하며 문장 혹은 단어에 확률을 할당하여 컴퓨터가 처리할 수 있도록 함
- 자연어 처리 분야에는 많은 언어 모델들이 있음
- 어떤 언어 모델이 내가 풀고자 하는 문제에 가장 적합한지 확인
- 자연어 작업 처리에 특화된 세부적인 테크닉들이 다 다르므로 SOTA 모델들을 확인해야 함
- https://paperswithcode.com/area/natural-language-processing
3-5. 모델 학습 및 평가
- 데이터가 준비되어 있고 모델 구조와 학습 방법을 결정했다면 언어 모델을 학습
- GPU 환경에서 진행
- 가용할 수 있는 인프라에 맞춰서 학습 파라미터를 설정하고 학습을 시작
- 학습도중, 학습 종료 후 평가
- 정량 평가, 정성 평가
3-6. 실무에서의 평가 진행 과정
- 준비된 데이터셋을 Train/Valid/Test 데이터셋으로 분할
- Train 데이터셋으로 모델을 학습하고, 중간 중간 Valid 데이터셋으로 학습 진행 상황 체크
- 문제 없이 학습이 종료되었다면 Test 데이터셋과 추가 정량 평가 데이터셋들로 최종 모델에 대한 정량 성능 지표를 측정
- 정성 평가를 수행하기 위해 정성 평가 데이터셋을 만들고 평가자를 모집하여 블라인드 테스트를 진행
- 정량 평가 및 정상 평가 결과에 따라 모델 사용 여부를 결정
4. Huggingface
- 기계 학습을 사용하여 애플리케이션을 구축하기 위한 도구를 개발하는 회사
- 자연어 처리 애플리케이션으로 구축된 Transformers 라이브러리와 사용자가 기계 학습 모델 및 데이터셋을 공유할 수 있는 플랫폼으로 유명
- https://huggingface.co/
- Huggingface에 업로드된 모델들은 기본적으로 PretrainedModel 클래스를 상속받고 있음
!pip install transformers
-----------------------------------------------------------------------------------------------
# 결과
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Collecting transformers
Downloading transformers-4.30.2-py3-none-any.whl (7.2 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.2/7.2 MB 35.0 MB/s eta 0:00:00
Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from transformers) (3.12.0)
Collecting huggingface-hub<1.0,>=0.14.1 (from transformers)
Downloading huggingface_hub-0.15.1-py3-none-any.whl (236 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 236.8/236.8 kB 27.9 MB/s eta 0:00:00
Requirement already satisfied: numpy>=1.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (1.22.4)
Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.10/dist-packages (from transformers) (23.1)
Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from transformers) (6.0)
Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from transformers) (2022.10.31)
Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from transformers) (2.27.1)
Collecting tokenizers!=0.11.3,<0.14,>=0.11.1 (from transformers)
Downloading tokenizers-0.13.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (7.8 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.8/7.8 MB 96.9 MB/s eta 0:00:00
Collecting safetensors>=0.3.1 (from transformers)
Downloading safetensors-0.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.3/1.3 MB 78.0 MB/s eta 0:00:00
Requirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.10/dist-packages (from transformers) (4.65.0)
Requirement already satisfied: fsspec in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.14.1->transformers) (2023.4.0)
Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub<1.0,>=0.14.1->transformers) (4.5.0)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (1.26.15)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2022.12.7)
Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (2.0.12)
Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->transformers) (3.4)
Installing collected packages: tokenizers, safetensors, huggingface-hub, transformers
Successfully installed huggingface-hub-0.15.1 safetensors-0.3.1 tokenizers-0.13.3 transformers-4.30.2
from getpass import getpass
from huggingface_hub import HfApi
token = getpass('토큰을 입력하세요:')
-------------------------------------------
# 결과
토큰을 입력하세요:
----------------------------------------------
bert_tokenizer=AutoTokenizer.from_pretrained("bert-base-cased")
# 결과
# AutoModel: 모델의 관한 정보를 처음부터 명시하지 않아도 됨.
# 예) BERT모델을 사용하는 경우 모델의 상세정보 필요 없이 Model ID만으로 손쉽게 모델 구성이 가능
from transformers import AutoModel,AutoTokenizer, BertTokenizer
print(bert_tokenizer.vocab_size)
---------------------------------
# 결과
28996
for i, key in enumerate(bert_tokenizer.get_vocab()):
print(key)
if i>10:
break
----------------------------------------------------------
# 결과
1840
[unused8]
##hood
aggressive
Annals
engines
Ellen
desperately
countryside
Rovers
Territorial
Medieval
---------------------------------------------------------------
print(type(bert_tokenizer))
---------------------------------------------------------------
# 결과
<class 'transformers.models.bert.tokenization_bert_fast.BertTokenizerFast'>
---------------------------------------------------------------------------
sample_1 = 'welcome to the natural language class'
sample_2 = 'welcometothe naturallanguageclass'
#return_tensors: Token을 어떤 type으로 반환할지 설정(tf,pt,np)
tokenized_input_text=bert_tokenizer(sample_1,return_tensors='pt')
for key,value in tokenized_input_text.items():
print('{}:\n\t{}'.format(key,value))
--------------------------------------------------------------------------
# 결과
input_ids:
tensor([[ 101, 7236, 1106, 1103, 2379, 1846, 1705, 102]])
token_type_ids:
tensor([[0, 0, 0, 0, 0, 0, 0, 0]])
attention_mask:
tensor([[1, 1, 1, 1, 1, 1, 1, 1]])
---------------------------------------------------------------------------
tokenized_input_text=bert_tokenizer(sample_2,return_tensors='pt')
for key,value in tokenized_input_text.items():
print('{}:\n\t{}'.format(key,value))
---------------------------------------------------------------------------
# 결과
input_ids:
tensor([[ 101, 7236, 2430, 10681, 2379, 19514, 6718, 2176, 1665, 17223,
102]])
token_type_ids:
tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
attention_mask:
tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])
----------------------------------------------------------------------------------------
print(tokenized_input_text['input_ids'])
print(tokenized_input_text.input_ids)
print(tokenized_input_text['token_type_ids'])
print(tokenized_input_text.token_type_ids)
print(tokenized_input_text['attention_mask'])
print(tokenized_input_text.attention_mask)
---------------------------------------------------------------------------------------
# 결과
tensor([[ 101, 7236, 2430, 10681, 2379, 19514, 6718, 2176, 1665, 17223,
102]])
tensor([[ 101, 7236, 2430, 10681, 2379, 19514, 6718, 2176, 1665, 17223,
102]])
tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])
tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])
----------------------------------------------------------------------------------------
tokenized_text = bert_tokenizer.tokenize(sample_1)
print(tokenized_text)
input_ids= bert_tokenizer.encode(sample_1)
print(input_ids)
decoded_ids = bert_tokenizer.decode(input_ids)
print(decoded_ids)
----------------------------------------------------------------------------------------
# 결과
['welcome', 'to', 'the', 'natural', 'language', 'class']
[101, 7236, 1106, 1103, 2379, 1846, 1705, 102]
[CLS] welcome to the natural language class [SEP]
----------------------------------------------------------------------------------------
tokenized_text = bert_tokenizer.tokenize(sample_2)
print(tokenized_text)
input_ids= bert_tokenizer.encode(sample_2)
print(input_ids)
decoded_ids = bert_tokenizer.decode(input_ids)
print(decoded_ids)
----------------------------------------------------------------------------------------
# 결과
['welcome', '##to', '##the', 'natural', '##lang', '##ua', '##ge', '##c', '##lass']
[101, 7236, 2430, 10681, 2379, 19514, 6718, 2176, 1665, 17223, 102]
[CLS] welcometothe naturallanguageclass [SEP]
-----------------------------------------------------------------------------------------
tokenized_text = bert_tokenizer.tokenize(sample_1,add_special_tokens=False)
print(tokenized_text)
input_ids= bert_tokenizer.encode(sample_1,add_special_tokens=False)
print(input_ids)
decoded_ids = bert_tokenizer.decode(input_ids)
print(decoded_ids)
----------------------------------------------------------------------------------------
# 결과
['welcome', 'to', 'the', 'natural', 'language', 'class']
[7236, 1106, 1103, 2379, 1846, 1705]
welcome to the natural language class
----------------------------------------------------------------------------------------
tokenized_text=bert_tokenizer.tokenize(
sample_1,
add_special_tokens=False,
max_length=5,
truncation=True
)
print(tokenized_text)
---------------------------------------------------------------------------------------
# 결과
['welcome', 'to', 'the', 'natural', 'language']
--------------------------------------------------------------------------------------
input_ids=bert_tokenizer.encode(
sample_1,
add_special_tokens=False,
max_length=5,
truncation=True
)
print(input_ids)
decoded_ids = bert_tokenizer.decode(input_ids)
print(decoded_ids)
---------------------------------------------------------------------------------------
# 결과
[7236, 1106, 1103, 2379, 1846]
welcome to the natural language
--------------------------------------------------------------------------------------
tokenized_text=bert_tokenizer.tokenize(
sample_1,
add_special_tokens=False,
max_length=20,
padding='max_length'
)
print(tokenized_text)
---------------------------------------------------------------------------------------
# 결과
['welcome', 'to', 'the', 'natural', 'language', 'class', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]']
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
tokenized_text = bert_tokenizer.tokenize(
sample_1,
add_special_tokens=False,
max_length=20,
padding='max_length' # 나머지 부분을 채워달라.[PAD]라는 토큰으로 채움.
)
print(tokenized_text)
input_ids = bert_tokenizer.encode(
sample_1,
add_special_tokens=False,
max_length=20,
padding='max_length' # 인덱스 값은 0으로 채워짐
)
print(input_ids)
decode_ids = bert_tokenizer.decode(input_ids)
print(decode_ids)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# 결과
['welcome', 'to', 'the', 'natural', 'language', 'class', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]']
[7236, 1106, 1103, 2379, 1846, 1705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
welcome to the natural language class [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD] [PAD]
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
print(bert_tokenizer.pad_token)
print(bert_tokenizer.pad_token_id)
------------------------------------------
# 결과
[PAD]
0
--------------------------------------------
kor_text = ' 아직도 목요일이네'
tokenized_text = bert_tokenizer.tokenize(
kor_text,
add_special_tokens=False,
max_length=10,
padding='max_length' # 나머지 부분을 채워달라.[PAD]라는 토큰으로 채움.
)
print(tokenized_text)
# 모르는 단어는 UNK로 나옴
----------------------------------------------------------------------------
# 결과
['[UNK]', '[UNK]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]', '[PAD]']
------------------------------------------------------------------------------------------
tokenized_input_text=bert_tokenizer(kor_text,return_tensors='pt')
for key,value in tokenized_input_text.items():
print('{}:\n\t{}'.format(key,value))
----------------------------------------------------------------------
# 결과
input_ids:
tensor([[101, 100, 100, 102]])
token_type_ids:
tensor([[0, 0, 0, 0]])
attention_mask:
tensor([[1, 1, 1, 1]])
-------------------------------------------------
tokenized_text = bert_tokenizer.tokenize(kor_text,add_special_tokens=False)
print(tokenized_text)
input_ids= bert_tokenizer.encode(kor_text,add_special_tokens=False)
print(input_ids)
decoded_ids = bert_tokenizer.decode(input_ids)
print(decoded_ids)
--------------------------------------------------------------------------------
# 결과
['[UNK]', '[UNK]']
[100, 100]
[UNK] [UNK]
--------------------------------------------------
# 한국어 텍스트 모델
multi_bert_model = AutoModel.from_pretrained('bert-base-multilingual-cased')
multi_bert_tokenizer=AutoTokenizer.from_pretrained('bert-base-multilingual-cased')
# 결과
print(multi_bert_tokenizer.vocab_size)
------------------------------------------
# 결과
119547
-------------------------------------------
text='한국인이 알아볼수 있는 한국어를 사용합니다.'
tokenized_text = multi_bert_tokenizer.tokenize(text)
print(tokenized_text)
input_ids= multi_bert_tokenizer.encode(text)
print(input_ids)
decoded_ids = multi_bert_tokenizer.decode(input_ids)
print(decoded_ids)
--------------------------------------------------------
# 결과
['한국', '##인이', '알', '##아', '##볼', '##수', '있는', '한국', '##어를', '사', '##용', '##합', '##니다', '.']
[101, 48556, 56789, 9524, 16985, 101450, 15891, 13767, 48556, 80940, 9405, 24974, 33188, 48345, 119, 102]
[CLS] 한국인이 알아볼수 있는 한국어를 사용합니다. [SEP]
------------------------------------------------------------------------------------------------------------
unk_text='한꺾인 알아볼수 있뉸 한귝어를 사용합뉘다'
tokenized_text = multi_bert_tokenizer.tokenize(unk_text)
print(tokenized_text)
input_ids= multi_bert_tokenizer.encode(unk_text)
print(input_ids)
decoded_ids = multi_bert_tokenizer.decode(input_ids)
print(decoded_ids)
-----------------------------------------------------------------------
# 결과
['한', '##꺾', '##인', '알', '##아', '##볼', '##수', '[UNK]', '[UNK]', '사', '##용', '##합', '##뉘', '##다']
[101, 9954, 118680, 12030, 9524, 16985, 101450, 15891, 100, 100, 9405, 24974, 33188, 118756, 11903, 102]
[CLS] 한꺾인 알아볼수 [UNK] [UNK] 사용합뉘다 [SEP]
-----------------------------------------------------------------------------------------------------------
added_token_num = multi_bert_tokenizer.add_tokens(['한꾺인','알아뽈','있뉸'])
print(added_token_num)
----------------------------------------------------------------------------
# 결과 3
----------------------------------------------------------------------------
tokenized_text=multi_bert_tokenizer.tokenize(unk_text,add_special_tokens=False)
print(tokenized_text)
--------------------------------------------------------------------------------
# 결과
['한', '##꺾', '##인', '알', '##아', '##볼', '##수', '있뉸', '[UNK]', '사', '##용', '##합', '##뉘', '##다']
--------------------------------------------------------------------------------------------------------
input_ids = multi_bert_tokenizer.encode(unk_text,add_special_tokens=False)
print(input_ids)
------------------------------------------------------------------------------
# 결과
[9954, 118680, 12030, 9524, 16985, 101450, 15891, 119549, 100, 9405, 24974, 33188, 118756, 11903]
--------------------------------------------------------------------------------------------------
decoded_ids=multi_bert_tokenizer.decode(input_ids)
print(decoded_ids)
-----------------------------------------------------
# 결과
한꺾인 알아볼수 있뉸 [UNK] 사용합뉘다
-------------------------------------
special_token_text = '[DAD]아빠[/DAD]가 방에 들어가신다'
tokenized_text = multi_bert_tokenizer.tokenize(special_token_text,add_special_tokens = False)
print(tokenized_text)
input_ids = multi_bert_tokenizer.encode(special_token_text,add_special_tokens = False)
print(input_ids)
decoded_ids = multi_bert_tokenizer.decode(input_ids)
print(decoded_ids)
---------------------------------------------------------------------------------------------
# 결과
['[', 'DA', '##D', ']', '아', '##빠', '[', '/', 'DA', '##D', ']', '가', '방', '##에', '들어', '##가', '##신', '##다']
[164, 47855, 11490, 166, 9519, 119008, 164, 120, 47855, 11490, 166, 8843, 9328, 10530, 71568, 11287, 25387, 11903]
[ DAD ] 아빠 [ / DAD ] 가 방에 들어가신다
-------------------------------------------------------------------------------------------------------------------
# special token 등록하기
special_token_text = '[DAD]아빠[/DAD]가 방에 들어가신다' # special token 을 추가
# add_special_tokens(): key(additional_special_tokens):value로 데이터를 넣음
added_token_num = multi_bert_tokenizer.add_special_tokens({'additional_special_tokens': ['[DAD]', '[/DAD]']})
special_token_text = '[DAD]아빠[/DAD]가 방에 들어가신다'
tokenized_text = multi_bert_tokenizer.tokenize(special_token_text,add_special_tokens = False)
print(tokenized_text)
input_ids = multi_bert_tokenizer.encode(special_token_text,add_special_tokens = False)
print(input_ids)
decoded_ids = multi_bert_tokenizer.decode(input_ids)
print(decoded_ids)
-----------------------------------------------------------------------------------------------------------------
# 결과
['[DAD]', '아', '##빠', '[/DAD]', '가', '방', '##에', '들어', '##가', '##신', '##다']
[119550, 9519, 119008, 119551, 8843, 9328, 10530, 71568, 11287, 25387, 11903]
[DAD] 아빠 [/DAD] 가 방에 들어가신다
--------------------------------------------------------------------------------------------
decoded_ids=multi_bert_tokenizer.decode(input_ids,skip_special_tokens=True)
print(decoded_ids)
-------------------------------------------------------------------------------------------
# 결과
아빠 가 방에 들어가신다
----------------------------------
print (added_token_num)
------------------------------------
# 결과
2
-------------------------------------
# 입력을 문장의 리스트로 구성하여 tokenizer의 입력으로 사용하면 출력 결과도 배열로 저장됨
sample_list=['아빠가 빵에 들어가신다','[DAD]아빠[/DAD]가방에들어가신다']
tokens=multi_bert_tokenizer(
sample_list,
padding=True
)
for i in range(2):
print('Tokens(int):{}'.format(tokens['input_ids'][i]))
print('Tokens(str):{}'.format([multi_bert_tokenizer.convert_ids_to_tokens(s)for s in tokens ['input_ids'][i]]))
print('Tokens(attn_mask):{}'.format(tokens['attention_mask'][i]))
-----------------------------------------------------------------------------------------------------------------
# 결과
Tokens(int):[101, 9519, 119008, 11287, 9390, 10530, 71568, 11287, 25387, 11903, 102, 0, 0]
Tokens(str):['[CLS]', '아', '##빠', '##가', '빵', '##에', '들어', '##가', '##신', '##다', '[SEP]', '[PAD]', '[PAD]']
Tokens(attn_mask):[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0]
Tokens(int):[101, 119550, 9519, 119008, 119551, 8843, 42337, 10530, 93200, 11287, 25387, 11903, 102]
Tokens(str):['[CLS]', '[DAD]', '아', '##빠', '[/DAD]', '가', '##방', '##에', '##들어', '##가', '##신', '##다', '[SEP]']
Tokens(attn_mask):[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
---------------------------------------------------------------------------------------------------------------------
# [MASK] 토큰 예측
masked_text = '아빠가 [MASK] 들어가신다'
tokenized_text = multi_bert_tokenizer.tokenize(masked_text)
print(tokenized_text)
--------------------------------------------------------------
# 결과
['아', '##빠', '##가', '[MASK]', '들어', '##가', '##신', '##다']
----------------------------------------------------------------
from transformers import pipeline
nlp_fill = pipeline('fill-mask',model='bert-base-multilingual-cased')
nlp_fill(masked_text)
-----------------------------------------------------------------------
# 결과
Some weights of the model checkpoint at bert-base-multilingual-cased were not used when initializing BertForMaskedLM: ['cls.seq_relationship.bias', 'cls.seq_relationship.weight']
- This IS expected if you are initializing BertForMaskedLM from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).
- This IS NOT expected if you are initializing BertForMaskedLM from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).
[{'score': 0.05300603434443474,
'token': 9654,
'token_str': '잘',
'sequence': '아빠가 잘 들어가신다'},
{'score': 0.0506289005279541,
'token': 11287,
'token_str': '##가',
'sequence': '아빠가가 들어가신다'},
{'score': 0.047388408333063126,
'token': 8982,
'token_str': '나',
'sequence': '아빠가 나 들어가신다'},
{'score': 0.03328700736165047,
'token': 9056,
'token_str': '다',
'sequence': '아빠가 다 들어가신다'},
{'score': 0.026803268119692802,
'token': 14867,
'token_str': '##면',
'sequence': '아빠가면 들어가신다'}]
728x90
반응형
'자연어 처리' 카테고리의 다른 글
[ 자연어 처리 ] Seq2Seq (1) | 2023.09.12 |
---|---|
[ 자연어 처리 ] 임베딩 시각화 (0) | 2023.09.12 |
[ 자연어 처리 ] 워드 임베딩 (0) | 2023.09.12 |
[ 자연어 처리 ] 임베딩 (0) | 2023.09.12 |
[ 자연어 처리 ] 데이터 전처리 (0) | 2023.09.12 |