맞춤법 교정기에 대한 개발은 오래전부터 계속 되었다. 현재 hanspell 이나 spacing 같은 맞춤법 교정 오픈소스들이 많이 공개되어있지만, 메신저 대화 문장이 대부분인 우리 데이터에서 오타로 인해 발생하는 맞춤법 오류는 잘 교정해주지 못했다.
"돼다, 되다"와 같은 맞춤법 교정은 사실 우리 서비스에서는 필요가 없었다.
완벽하게 잡을 필요도 없고 사람 or 모델(tokenzier)이 잘 알 수 있도록 변형하여 NLU 정확도를 높히고 챗봇이 한글 파괴된 답변을 하지 않게 답변 DB를 정제하는 것이 우리의 목표였다.
우리 학습데이터/답변데이터에서 필요한 맞춤법 교정은
위 예시("완죤 어이업 ㅅ네 진쨬ㅋㅋㅋ")와 같은 문장들이 많다.
그러던 중 ETRI 에서 개발한 PLM 모델인 ET5 모델을 알게되었고, 맞춤법 교정 말뭉치까지 공개되어있어 Text2Text Generation Task를 통해 교정 모델을 개발했다.
개인적으로 ETRI-T5는 현존하는 한국어 PLM 모델중 최고라고 생각한다.
맞춤법 데이터는 예전부터 계속 존재했기 때문에 이미 누군가 맞춤법 교정 모델을 만들었을 법해서 계속 찾아보았지만, 없어서 그냥 내가 주말에 만들었다.
내 교정기가 누군가에게 도움이 되길 바란다.
original | corrected |
---|---|
이런게 눔 ㄱ ㅣ찮아서 ㅠㅠ | 이런 게 넘 귀찮아서 ㅠㅠ |
어쩌다 가게되써 | 어쩌다 가게 됐어? |
이따 얘기하쟈 | 이따 얘기하자 |
ㅋㅋㅋㅋㅋㅋ언넝 맞이해 | ㅋㅋㅋㅋㅋㅋ 얼른 맞이해 |
그냥 일을안가르쳐주고 | 그냥 일을 안 가르쳐 주고 |
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) # 아니 진짜 뭐 하냐고.
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) # 완전 어이없네 진짜 ᄏᄏᄏᄏ.
결론 : 개인적으로 만족할 만한 성능이지만, 아직 교정하지 못하는 case들이 많았다 이런 것들은 따로 저장해 두었다가 나중에 학습데이터에 추가해서 모델을 지속적으로 업데이트 해나가야겠다.
안녕하세요, 종민님.
저는 현재 한 부트캠프에서 데이터 분석 코스를 수강 중인 학생입니다. 최종 프로젝트로 유튜브 댓글 분석을 진행하고 있는데, 이 과정에서 종민님이 공유해주신 Korean typos corrector 모델을 사용하고 있습니다. 진행 중 몇 가지 궁금한 점이 있어 이렇게 문의드리게 되었습니다.
첫째로, 유튜브 댓글의 맞춤법 교정 과정에서 특정 문장이 반복되어 출력되는 현상이 발생했는데, 혹시 이 문제의 원인이 무엇일지 여쭤보고 싶습니다.
둘째로, 일부 댓글이 맞춤법 교정 후 잘리는 현상이 발생하여 기존 댓글의 온점(.)을 모두 삭제한 후 라이브러리를 적용해 보았는데, 이러한 방법으로 진행할 경우 예상되는 문제점이 있을지 궁금합니다.
마지막으로, max_length 옵션의 최대치에 대한 제한이 있는지도 문의드리고 싶습니다.
바쁘시겠지만, 답변 주시면 큰 도움이 될 것 같습니다. 감사합니다.
안녕하세요! 혹시 모델('j5ng/et5-typos-corrector') 은 어디서 다운받나요? 이트리 링크가도 api고 모델파일은 따로 없네요 ㅠ