MRA / tasks /summarization.py
dsfklj's picture
Upload 12 files
1fc9eac verified
Raw History Blame Contribute Delete
2.14 kB
from transformers import PreTrainedTokenizerFast, BartForConditionalGeneration
import torch
"""
[설계 의도]
텍스트 요약은 생성 길이와 하이퍼파라미터를 세밀하게 제어해야 하므로, Pipeline 대신 AutoClass API를 사용했습니다.
한국어 처리 정확도를 높이기 위해 KoBART의 BPE 기반 토크나이저를 직접 적용해 형태소 손실을 최소화했습니다.
"""
model_name = "ainize/kobart-news"
tokenizer = PreTrainedTokenizerFast.from_pretrained(model_name)
model = BartForConditionalGeneration.from_pretrained(model_name)
if torch.cuda.is_available():
model = model.to('cuda')
def summarize_review(text, min_len, max_len):
# 텐서 변환
input_ids = tokenizer.encode(text, return_tensors="pt")
if torch.cuda.is_available():
input_ids = input_ids.to('cuda')
# 명시적 생성 제어
summary_ids = model.generate(
input_ids=input_ids,
bos_token_id=model.config.bos_token_id,
eos_token_id=model.config.eos_token_id,
length_penalty=1.0, # 2.0에서 1.0으로 낮춰서 불필요하게 길게 쓰는 것을 방지
max_length=int(max_len),
min_length=int(min_len),
num_beams=4,
early_stopping=True # 문장이 마침표로 완성되면 제한 길이에 도달 안 해도 즉시 종료!
)
# 자연어로 디코딩
answer = tokenizer.decode(summary_ids[0], skip_special_tokens=True)
# 문장이 중간에 잘린 경우를 대비한 깔끔한 후처리
if not answer.endswith(('.', '!', '?')) and '.' in answer:
answer = answer[:answer.rfind('.') + 1]
# 자주 틀리는 오타나 어색한 어미를 파이썬 문자열 교체로 강제 교정합니다.
answer = answer.replace("네다.", "네요.")
answer = answer.replace("너무하네다", "너무하네요")
answer = answer.replace("뿐이.", "뿐입니다.")
answer = answer.replace("로썸틱", "로맨틱") # 만약 자주 나오는 이상한 단어가 있다면 이렇게 추가
return answer