[NLP] 한국어 구어체(대화체) 맞춤법 교정 모델 (Korean typos corrector) : ET5 Text2Text Generation

jongmin-oh·2023년 6월 6일
1

Korean-NLP-model

목록 보기
2/4

배경

맞춤법 교정기에 대한 개발은 오래전부터 계속 되었다. 현재 hanspell 이나 spacing 같은 맞춤법 교정 오픈소스들이 많이 공개되어있지만, 메신저 대화 문장이 대부분인 우리 데이터에서 오타로 인해 발생하는 맞춤법 오류는 잘 교정해주지 못했다.

"돼다, 되다"와 같은 맞춤법 교정은 사실 우리 서비스에서는 필요가 없었다.
완벽하게 잡을 필요도 없고 사람 or 모델(tokenzier)이 잘 알 수 있도록 변형하여 NLU 정확도를 높히고 챗봇이 한글 파괴된 답변을 하지 않게 답변 DB를 정제하는 것이 우리의 목표였다.

우리 학습데이터/답변데이터에서 필요한 맞춤법 교정은
위 예시("완죤 어이업 ㅅ네 진쨬ㅋㅋㅋ")와 같은 문장들이 많다.

그러던 중 ETRI 에서 개발한 PLM 모델인 ET5 모델을 알게되었고, 맞춤법 교정 말뭉치까지 공개되어있어 Text2Text Generation Task를 통해 교정 모델을 개발했다.
개인적으로 ETRI-T5는 현존하는 한국어 PLM 모델중 최고라고 생각한다.

맞춤법 데이터는 예전부터 계속 존재했기 때문에 이미 누군가 맞춤법 교정 모델을 만들었을 법해서 계속 찾아보았지만, 없어서 그냥 내가 주말에 만들었다.
내 교정기가 누군가에게 도움이 되길 바란다.


한국어 맞춤법 교정기

  • ETRI-et5 모델을 기반으로 fine-tuning한 한국어 구어체 전용 맞춤법 교정기 입니다.
  • 바로 사용하실 분들은 밑에 예제 코드 참고해서 모델('j5ng/et5-typos-corrector') 다운받아 사용하실 수 있습니다.

Base on PLM model(ET5)

Base on Dataset

Data example

originalcorrected
이런게 눔 ㄱ ㅣ찮아서 ㅠㅠ이런 게 넘 귀찮아서 ㅠㅠ
어쩌다 가게되써어쩌다 가게 됐어?
이따 얘기하쟈이따 얘기하자
ㅋㅋㅋㅋㅋㅋ언넝 맞이해ㅋㅋㅋㅋㅋㅋ 얼른 맞이해
그냥 일을안가르쳐주고그냥 일을 안 가르쳐 주고

Data Preprocessing

  • 특수문자 제거 (쉼표) .(마침표) 제거
  • null 값("") 제거
  • 너무 짧은 문장 제거(길이 2 이하)
  • 문장 내 &name&, name1 등 이름 태그가 포함된 단어 제거(단어만 제거하고 문장은 살림)
  • total : 318,882 쌍

How to use

import torch
from transformers import T5ForConditionalGeneration, T5Tokenizer

# T5 모델 로드
model = T5ForConditionalGeneration.from_pretrained("j5ng/et5-typos-corrector")
tokenizer = T5Tokenizer.from_pretrained("j5ng/et5-typos-corrector")

device = "cuda:0" if torch.cuda.is_available() else "cpu"
# device = "mps:0" if torch.cuda.is_available() else "cpu" # for mac m1

model = model.to(device) 

# 예시 입력 문장
input_text = "아늬 진짜 무ㅓ하냐고"

# 입력 문장 인코딩
input_encoding = tokenizer("맞춤법을 고쳐주세요: " + input_text, return_tensors="pt")

input_ids = input_encoding.input_ids.to(device)
attention_mask = input_encoding.attention_mask.to(device)

# T5 모델 출력 생성
output_encoding = model.generate(
    input_ids=input_ids,
    attention_mask=attention_mask,
    max_length=128,
    num_beams=5,
    early_stopping=True,
)

# 출력 문장 디코딩
output_text = tokenizer.decode(output_encoding[0], skip_special_tokens=True)

# 결과 출력
print(output_text) # 아니 진짜 뭐 하냐고.

With Transformer Pipeline

import torch
from transformers import T5ForConditionalGeneration, T5Tokenizer, pipeline

model = T5ForConditionalGeneration.from_pretrained('j5ng/et5-typos-corrector')
tokenizer = T5Tokenizer.from_pretrained('j5ng/et5-typos-corrector')

typos_corrector = pipeline(
    "text2text-generation",
    model=model,
    tokenizer=tokenizer,
    device=0 if torch.cuda.is_available() else -1,
    framework="pt",
)

input_text = "완죤 어이업ㅅ네진쨬ㅋㅋㅋ"
output_text = typos_corrector("맞춤법을 고쳐주세요: " + input_text,
            max_length=128,
            num_beams=5,
            early_stopping=True)[0]['generated_text']

print(output_text) # 완전 어이없네 진짜 ᄏᄏᄏᄏ.

학습코드 : https://github.com/jongmin-oh/korean-typos-corrector

결론 : 개인적으로 만족할 만한 성능이지만, 아직 교정하지 못하는 case들이 많았다 이런 것들은 따로 저장해 두었다가 나중에 학습데이터에 추가해서 모델을 지속적으로 업데이트 해나가야겠다.

profile
스타트업에서 자연어처리 챗봇을 연구하는 머신러닝 개발자입니다.

5개의 댓글

comment-user-thumbnail
2024년 3월 27일

안녕하세요! 혹시 모델('j5ng/et5-typos-corrector') 은 어디서 다운받나요? 이트리 링크가도 api고 모델파일은 따로 없네요 ㅠ

1개의 답글
comment-user-thumbnail
2024년 6월 18일

고맙습니다. 사랑합니다.

답글 달기
comment-user-thumbnail
2024년 8월 19일

안녕하세요, 종민님.
저는 현재 한 부트캠프에서 데이터 분석 코스를 수강 중인 학생입니다. 최종 프로젝트로 유튜브 댓글 분석을 진행하고 있는데, 이 과정에서 종민님이 공유해주신 Korean typos corrector 모델을 사용하고 있습니다. 진행 중 몇 가지 궁금한 점이 있어 이렇게 문의드리게 되었습니다.
첫째로, 유튜브 댓글의 맞춤법 교정 과정에서 특정 문장이 반복되어 출력되는 현상이 발생했는데, 혹시 이 문제의 원인이 무엇일지 여쭤보고 싶습니다.
둘째로, 일부 댓글이 맞춤법 교정 후 잘리는 현상이 발생하여 기존 댓글의 온점(.)을 모두 삭제한 후 라이브러리를 적용해 보았는데, 이러한 방법으로 진행할 경우 예상되는 문제점이 있을지 궁금합니다.
마지막으로, max_length 옵션의 최대치에 대한 제한이 있는지도 문의드리고 싶습니다.
바쁘시겠지만, 답변 주시면 큰 도움이 될 것 같습니다. 감사합니다.

1개의 답글