CS/NLP

실습2-1. 텍스트 정보 추출 모델 (with. 개체명 인식(NER))

초코chip 2024. 3. 26. 15:12

배경 및 목표

이전에 진행된 작업은 수신된 문자 메시지를 그 내용이 속하는 클래스별로 분류하는 과제였습니다.

https://chocochip125.tistory.com/212

 

종설 분류 모델 api 생성

배경 이전 연구에서 다양한 기계 학습 모델 중에서 문자 데이터를 효과적으로 다중 분류할 수 있는 모델로 랜덤 포레스트를 선택했습니다. https://chocochip125.tistory.com/211 종설 분류 모델 보고서 보

chocochip125.tistory.com

 

이는 다양한 유형의 메시지를 효율적으로 관리하고 필요한 정보에 쉽게 접근할 수 있도록 하는 기반 작업이었습니다. 

그러나, 수신 문자의 모든 내용을 그대로 프롬프트로 활용하는 방식은 효율성이 떨어집니다.

 

만약 각 클래스에 맞는 필요한 도메인 정보만을 선별해 저장하고, 이를 기반으로 프롬프트를 활용해 대화를 진행한다면, 

불필요한 정보의 배제로 내용의 일관성을 유지할 뿐만 아니라, 더 정확한 대화 결과를 도출할 수 있으며, 프롬프트 토큰 사용도 대폭 줄일 수 있습니다.

이에 따라, 다음 목표를 분류된 문자 데이터로부터 필요한 도메인 정보를 식별하고 추출하여 데이터베이스에 보관하는 작업으로 선정하였습니다.

 

예시)

[Web발신] [신한체크승인] 장*진(4384) 08/16 22:47 (금액)1,500원 태평할인마트 {
"결제 방법":"신한체크",
"결제 장소":"태평할인마트",
"결제 시간":"08/16 22:47",
"비용":"1,500원"
}

 

 

각 클래스별 도메인 정보

프로젝트는 주로 금융 관련 텍스트 데이터 처리에 초점을 맞추며,

다음과 같은 다양한 분류(Class)의 텍스트 데이터에서 특정 도메인 정보를 추출하는 것을 목표로 합니다

문자 종류(class) 필요한 도메인 정보
결제 승인, 결제 취소 방법 (Method)
장소 (Location)
시간 (Time)
비용 (Cost)
결제 거절  방법 (Method)
장소 (Location)
시간 (Time)
비용 (Cost)
거절 이유 (Rejection Reason)
미납 납부 대상(Payee)
비용 (Cost)
시간 (Time)
납부 예정 납부 대상 (Payee)
비용 (Cost)
납부예정일 (Time)
납부 이유 (Payment Reason)
계좌 개설 개설 은행(Bank)
계좌 종류(Type)
자동 이체 출금은행(Bank)
기관(Company)

 

방법론 고찰

본 프로젝트의 목표 달성을 위해 다양한 접근 방법을 면밀히 검토하였습니다.

처음에는 정보 추출을 위한 방법으로 정규 표현식을 활용한 규칙 기반 추출을 고려하였습니다.

정규 표현식은 개발자가 직접 정의한 특정 패턴을 사용하여 텍스트로부터 정보를 추출하는 방식입니다.

그러나, 이 방식은 동일한 카테고리의 데이터라도 다양한 기관에서 사용하는 형식이 상이할 수 있어, 확장성과 다양한 시나리오에 대한 처리가 어려운 단점이 있어 이 방법은 배제하였습니다.

이에 대안적인 방안을 탐색하는 과정에서, NER(Named Entity Recognition) 기법에 주목하게 되었습니다. 

NER은 텍스트 내에서 사람, 장소, 기관, 시간, 비용 등과 같은 명명된 엔티티를 식별하는 기술입니다. 

금융 분야의 텍스트에 특화된 NER 모델을 개발하여, 각 분류에 필요한 도메인별 정보를 효율적으로 추출할 수 있다고 판단하였습니다.

이후, NER 작업을 수행할 적합한 모델을 선정하기 위해 고심하였고, Transformer 모델을 주목하게 되었습니다. 

Transformer는 BERT, GPT와 같은 최신 자연어 처리 모델을 포함하며, 복잡한 텍스트 패턴을 인식하고 필요한 정보를 추출하는 데 있어 매우 효과적입니다. 

이러한 모델들은 방대한 양의 데이터로 사전 학습되어 있어, 다양한 도메인에 유연하게 적용될 수 있는 장점을 가지고 있습니다.

특히, GPT는 주로 텍스트 생성에 특화되어 있는 반면, BERT와 같은 양방향 인코더 모델은 텍스트의 양방향 컨텍스트를 이해하는데 유리하다고 판단하여, 본 프로젝트에서는 BERT를 포함한 양방향 인코더 모델을 활용하는 방향으로 결정하였습니다.

 

프로젝트 진행 절차

1.  NER 모델 학습 데이터 준비 With. 프롬프트 엔지니어링

NER 모델을 특정 도메인에 맞게 학습시키기 위해서는, 주어진 텍스트 내에서 중요한 정보(예: 결제 방법, 장소, 시간, 비용 등)를 정확하게 식별하고 그 위치 및 유형을 명시하는 데이터 어노테이션(라벨링) 작업이 필수적입니다.

이는 모델이 텍스트에서 정보를 인식하고 이해하는 데 필요한 학습 데이터를 생성하는 핵심 단계입니다.

 

수동으로 이 작업을 수행하는 것은 시간이 많이 소요되고 비효율적일 수 있기 때문에, 프롬프트 엔지니어링 기법을 활용하여 자동화된 방법으로 데이터 어노테이션 작업을 진행할 계획입니다.

 

예시)

1. 내용 입력

[Web발신] [신한체크승인] 장*진(4384) 01/03 17:24 (금액)5,000원 서부카투사식당

 

2. 데이터 어노테이션 작업

결제 승인 메시지에 대하여, '방법(Method)', '장소(Location)', '시간(Time)', '비용(Cost)'의 4가지 주요 정보 도메인을 식별하고 표시해야 합니다.

[(9, 13, 'METHOD'), (50, 57, 'LOCATION'), (27, 38, 'TIME'), (43, 49, 'COST')]

 

3. 결과를 직관적으로 볼 수 있는 JSON 포맷으로 변환

변환된 데이터는 모델의 정확도 평가 및 디버깅 과정에서 사용될 예정입니다.

{
"Method":"신한체크",
"Location":"서부카투사식당",
"Time":"01/03 17:24",
"Cost":"5,000원"
}

 

프롬프트 구현 방법에 대한 내용은 추후에 작성할 예정

 

2.  NER 모델 학습 진행

위에서 준비한 학습 데이터를 사용하여 NER 모델의 학습을 진행하였습니다.

 

Transformer 기반의 모델 학습 과정에 대한 내용은 추후에 작성할 예정

BERT 기반 NER 모델

문제점 발견

초기에는 BERT 기반의 NER 모델로 학습을 시도하였지만, 결과가 기대에 미치지 못했습니다.

  • 입력 데이터: [Web발신] [신한체크승인] 장*진(8730) 12/28 23:17 (금액)1,000원 네이버페이
  • 예상 결과:
{ 
    "Method": "신한체크", 
    "Location": "네이버페이", 
    "Time": "12/28 23:17", 
    "Cost": "1,000원" 
}
  • 실제 결과:
{
    "Method": "[ ] 신ᄒᆫ체크승인 ] 장 * ᄌ ( 8730 ) 12 / 28 17 ( 금액 ) 1 000원 네이버페이", 
    "Location": "web발신 :", 
    "Time": ",", 
    "Cost": ""
}

 

문제 분석 및 해결책 고찰

위 결과를 확인한 후, 표준 BERT 모델에 사용되는 토크나이저가 한국어 처리에 있어 불안정할 수 있다는 가설을 세웠습니다.

이는 한국어의 구조적 특성과 BERT 토크나이저의 작동 방식 사이에 발생할 수 있는 불일치에서 기인한다고 추정됩니다.

 

추후 해당 가설을 검증하기 위해, 실제로 한국어 텍스트가 BERT 토크나이저에 의해 어떻게 처리되는지 분석할 예정

이와 관련하여, 이번에는 한국어에 특화된 KoBERT 모델을 주목하게 되었습니다.

KoBERT는 한국어 특화 모델로, 한국어의 언어적 특성을 더 잘 반영할 수 있도록 설계되었습니다.

따라서, BERT 기반 모델의 한계를 극복하고 한국어 텍스트 처리의 정확도를 향상시키기 위해 KoBERT 모델을 사용하는 방향으로 연구의 목표를 조정하였습니다.

 

KoBERT 기반 NER 모델

KoBERT 모델 로드 오류 해결

KoBERT 모델을 사용하여 학습을 시도하였으나, 공식 문서대로 진행했을 때 여러 오류가 발생했습니다.

from kobert_tokenizer import KoBERTTokenizer
from transformers import BertModel

# 1. 토크나이저 + vocab 준비
tokenizer = KoBERTTokenizer.from_pretrained('skt/kobert-base-v1')
vocab = nlp.vocab.BERTVocab.from_sentencepiece(tokenizer.vocab_file, padding_token='[PAD]')
tok = nlp.data.BERTSPTokenizer(tokenizer, vocab, lower = False)

# 2. 프리트레인된 모델 준비(KoBERT)
bertmodel = BertModel.from_pretrained('skt/kobert-base-v1', return_dict=False)

https://github.com/SKTBrain/KoBERT/tree/master/kobert_hf

 

KoBERT/kobert_hf at master · SKTBrain/KoBERT

Korean BERT pre-trained cased (KoBERT). Contribute to SKTBrain/KoBERT development by creating an account on GitHub.

github.com

 

해결책 탐색 중, Hugging Face의 transformers 라이브러리를 통해 직접 KoBERT 모델과 토크나이저를 로드하는 방법을 발견하였습니다.

from transformers import AutoModelForTokenClassification, AutoTokenizer

# Hugging Face의 transformers를 통해 KoBERT 모델과 토크나이저 로드
model_name = "monologg/kobert"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForTokenClassification.from_pretrained(model_name, num_labels=len(tag2id))

 

 

결과 확인

KoBERT 기반의 NER 모델로 학습을 진행한 후 결과를 확인하였을때, 만족스러운 결과가 나온 것을 확인하였습니다.

  • 입력 데이터: [Web발신] [신한체크승인] 장*진(8730) 12/28 23:17 (금액)1,000원 네이버페이
  • 예상 결과:
{ 
    "Method": "신한체크", 
    "Location": "네이버페이", 
    "Time": "12/28 23:17", 
    "Cost": "1,000원" 
}
  • 실제 결과:
{
    "METHOD": "신한체크승인",
    "LOCATION": "네이버페이",
    "TIME": "12 / 28 23 : 17",
    "COST": "1 , 000원"
}

 

3. 생성한 NER 모델에 대한 정확도 평가

해당 내용 추후에 진행할 예정