[KT AIVLE SCHOOL]

NLP

조진목_스터디 2024. 11. 5. 22:47

NLP: 자연어 처리, 단일 단어를 개별적으로 이해하는 것뿐만 아니라 해당 단어의 맥락을 이해

- 문장 분류 : 리뷰의 감정 파악, 이메일 스팸 여부 감지 등

- 개체 명(사람, 위치, 조직 등) 인식

- 문장 생성

- 질문에 대한 답변

- 텍스트 번역, 요약

 

 

Transfomer: 문맥상 집중해야 할 단어를 캐치 --> Attention

 

 

pipeline 함수: transformer 기반 LLM 모델을 손쉽게 사용할 수 있게 해주는 함수, 복잡한 언어 모델 처리(NLP) 과정을 감추고, 다음 과정이 물 흐르듯 흘러감

- 전처리 --> 모델 사용 --> 후처리

 

Pipeline으로 사용 가능한 언어 관련 task 

• sentiment-analysis: 문장에 대한 긍정, 중립, 부정 감정 분류

• zero-shot-classification: 학습 과정에서 본 적 없는 클래스에 대해 분류

• summarization: 긴 문장이나 글의 핵심 내용을 짧게 요약하는 기술

• translation: 번역

• text-generation: 문장을 이어서 작성

from transformers import pipeline

# sentiment-analysis 모델 파이프라인 생성
# 기본값 : distilbert-base-uncased-finetuned-sst-2-english

classifier = pipeline("sentiment-analysis")

# 모델 사용
text = ["I've been waiting for a HuggingFace course my whole life.",
        "I hate this so much!",
        "I have a dream.",
        "She was so happy."]

classifier(text)

 

# Zero-shot 분류 파이프라인 생성
classifier = pipeline(task = "zero-shot-classification", model="facebook/bart-large-mnli")

# 후보 레이블 지정
candidate_labels = ["tech", "politics", "business", "finance", "AI"]

# 분류하고자 하는 텍스트
text = "This is a tutorial about using transformers in natural language processing."

# 분류 수행
result = classifier(text, candidate_labels)

# 결과 출력
print(f"Labels: {result['labels']}")
print(f"Scores: {result['scores']}")

 

# 한국어에서 영어로 번역하는 파이프라인 생성
translator_ko_to_en = pipeline(task = "translation", model="halee9/translation_en_ko")

# 번역하고자 하는 한국어 텍스트
text_ko = "안녕하세요, 오늘 미세먼지가 무척 심하네요."

# 번역 수행
translated_text_en = translator_ko_to_en(text_ko, max_length=60)

# 번역된 영어 텍스트 출력
print(f"Translated Text (KO to EN): {translated_text_en[0]['translation_text']}")

 

# 텍스트 요약 파이프라인 생성, 여기서는 BART 모델을 사용
summarizer = pipeline("summarization", model="ainize/kobart-news")

# 소설 상록수 중에서...
input_text = '''
가을 학기가 되자, ○○일보사에서 주최하는 학생계몽운동에 참가하였던 대원들이 돌아왔다. 오늘 저녁은 각처에서 모여든 대원들을 위로하는 다과회가 그 신문사 누상에서 열린 것이다.
오륙백 명이나 수용할 수 있는 대강당에는 전 조선의 방방곡곡으로 흩어져서 한여름 동안 땀을 흘려 가며 활동한 남녀 대원들로 빈틈없이 들어찼다.
폭양에 그을은 그들의 시커먼 얼굴! 큰 박덩이만큼씩 한 전등이 드문드문하게 달린 천장에서 내리비치는 불빛이 휘황할수록, 흰 벽을 등지고 앉은 그네들의 얼굴은 더한층 검어 보인다.
만호 장안의 별처럼 깔린 등불이 한눈에 내려다보이도록 사방의 유리창을 활짝 열어제쳤건만, 건장한 청년들의 코와 몸에서 풍기는 훈김이 우거진 콩밭 속에를 들어간 것만치나 후끈후끈 끼친다.
정각이 되자 P학당의 취주악대는 코넷, 트럼본 같은 번쩍거리는 악기를 들고 연단 앞줄에 가 벌려 선다. 지휘자가 손을 내젓는 대로 힘차게 연주하는 것은 유명한 독일 사람의 작곡인 쌍두취 행진곡(雙頭鷲行進曲)이다. 그 활발하고 장쾌한 멜로디는 여러 사람의 심장까지 울리면서 장내의 공기를 진동시킨다.
'''

# 텍스트 요약 수행
summary = summarizer(input_text)

# 요약된 텍스트 출력
print(f"Summary: {summary[0]['summary_text']}")

 

# 영문 생성 모델 다운로드
generator = pipeline("text-generation", model="distilgpt2")

# 문장 생성 실행
generator("In this course, we will teach you how to",
          max_length=30,                    # 생성할 최대 토큰 수
          num_return_sequences=3)           # 생성할 문장

 

 

허깅 페이스: 자연어 처리 및 인공 지능 분야에서 가장 인기 있는 오픈 소스 라이브러리와 모델을 제공하는 플랫폼

- transformers 라이브러리 제공

사전 훈련된 다양한 Transformer 기반 LLM모델(BERT, GPT, T5, RoBERTa 등)을 쉽게 사용

텍스트 분류, 질문 답변, 텍스트 생성, 요약, 번역 등 다양한 NLP task 수행

 

 

Tokenize: 문장을 의미 있는 단위(토큰)로 쪼개기 (문자, 문장, 형태소 단위)

 

Embedding Vector: 토큰에 (머신이 파악할 수 있는) 의미를 부여하기

- 사람이 쓰는 자연어를 machine 이 이해할 수 있는 숫자의 나열(벡터)로 변환(혹은 변환된 벡터)

- 사람의 언어인 자연어를 처리하게 하려면 자연어를 숫자로 바꿔 입력을 해줘야 함

!pip install gensim
from gensim.models import Word2Vec

# 각 문장들을 토크나이즈 하기
token_sent = [tokenizer.convert_ids_to_tokens(tokenizer(text).input_ids) for text in text_data]

# Word2Vec 임베딩 생성
model = Word2Vec(sentences=token_sent, vector_size=30, window=5, min_count=1, workers=4)

# 토큰 'core'의 벡터 확인
token = 'components'
vector = model.wv[token]

print('index :', tokenizer([token]))
print('embedding vector : \n', vector.round(4))

 

 

단어 임베딩

- 단어를 고차원 벡터로 매핑하는 기술

- 문서, 문장 내에서 단어의 의미와 문맥을 담아 냄

- Word2Vec, FastText 등

 

부분 단어 토크화 - BERT에서 사용

from transformers import AutoTokenizer

model_ckpt = "distilbert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_ckpt)

text = text_data[0]
encoded_text = tokenizer(text)
print(text)
print(encoded_text)

* input_ids : 각 토큰의 고유 정수값
* attention_mask :

# id를 다시 토큰으로 변환
tokens = tokenizer.convert_ids_to_tokens(encoded_text.input_ids)
print(tokens)

print(tokenizer.convert_tokens_to_string(tokens))

# 어휘 사전 크기
tokenizer.vocab_size

# 모델의 최대 문맥 크기

# 토큰의 개수: length
tokenizer.model_max_length

# 모델 입력을 위한 필드 이름
tokenizer.model_input_names

 

 

Langchain에서 사용하는 세 가지 유형의 Message

▪ SystemMessage : 시스템 역할 부여

▪ HumanMessage : 질문

▪ AIMessage : 답변

 

 

'[KT AIVLE SCHOOL]' 카테고리의 다른 글

객체탐지(1)  (4) 2024.11.07
Text - 챗봇  (7) 2024.11.06
CNN  (1) 2024.11.04
딥러닝(3)  (0) 2024.11.01
딥러닝(2)  (0) 2024.10.31