Project/캡스톤디자인2

[NLP Project] 1-2. 데이터 전처리 - 특수문자 제거하기

sillon 2022. 11. 9. 21:41
728x90
반응형

이전에 구현했던 코드에서 데이터 전처리를 조금 더 진행해보겠다.

data_load.py에서 구현했던 tag_split() 함수에서

해당 문자에서 한글, 영어, 소문자, 대문자 이외의 단어를 제거하는 함수를 작성해보겠다.

 

        cng_sentence = []
        for str in sentence:
            # 한글, 영어, 소문자, 대문자 이외의 단어 제거
             str = re.sub(r'[^ㄱ-ㅣ가-힣0-9a-zA-Z.]', "", str)
             cng_sentence.append(str)

 

# 전처리한 데이터를 바탕으로 단어와 태그 나누기
def tag_split(tagged_sentences):
    sentences, ner_tags = [],[]
    for tagged_sentence in tagged_sentences:
        sentence, tag_info = zip(*tagged_sentence)
        cng_sentence = []
        cng_sentence.append("[CLS]")
        tag_info = list(tag_info)
        tag_info.insert(0,'-')
        for str in sentence:
            # 한글, 영어, 소문자, 대문자 이외의 단어 제거
             str = re.sub(r'[^ㄱ-ㅣ가-힣0-9a-zA-Z.]', "", str)
             cng_sentence.append(str)
             list(tag_info)
             
        cng_sentence.append("[SEP]")
        tag_info.append('-')

        sentences.append(cng_sentence)
        ner_tags.append(tag_info)

    return sentences, ner_tags

 

특수문자 처리 전

 

[['비토리오', '양일', '만에', '영사관', '감호', '용퇴,', '항룡', '압력설', '의심만', '가율'], ['이', '음경동맥의', '직경이', '8', '19mm입니다', '.'], ['9세이브로', '구완', '30위인', 'LG', '박찬형은', '평균자책점이', '16.45로', '준수한', '편이지만', '22⅓이닝', '동안', '피홈런이', '31개나', '된다', '.'], ['7승', '25패는', '상트페테르부르크가', '역대', '월드리그에', '출진한', '분별', '최선의', '성적이다', '.'], ['▲', '퍼거슨', '씨족의', '꾀'], ['[유로2008]', "'공인구가", '변할', '기록', '시정조치는', '죽을', '맛', '?', "'"], ['로마올림픽에서', '육미지황탕', '이남지역으로', '동메달에', '머문', '추경대는', '차년', '파리오픈', '결승전에서', '진', '동영의', '탄셰', '차우세스쿠를', '비롯해', '몽골의', '이창동', '차간바,', '발보나의', '리자루드', '박혜미셔', '좌타자를', '놓고', '추축한다', '.'], ['금반', '명기', '통합우승', '24,', '10회차는', '8일', '상오', '6시', '50분,', '상오', '11시', '50분에', '발태가', '끝마감되며,', '비공식', '적중결과는', '5일', '공표된다', '.'], ['권뢰가', '있는', '곳에', '직경에', '따라', '달라지는데요', '.'], ['때로는은', '귀여운', '가스나기인', '비담,', '세상일에는', '무관심', '.']]

 

특수문자 처리 후 

 

[['비토리오', '양일', '만에', '영사관', '감호', '용퇴', '항룡', '압력설', '의심만', '가율'], ['이', '음경동맥의', '직경이', '8', '19mm입니다', '.'], ['9세이브로', '구완', '30위인', 'LG', '박찬형은', '평균자책점이', '16.45로', '준수한', '편이지만', '22이닝', '동안', '피홈런이', '31개나', '된다', '.'], ['7승', '25패는', '상트페테르부르크가', '역대', '월드리그에', '출진한', '분별', '최선의', '성적이다', '.'], ['', '퍼거슨', '씨족의', '꾀'], ['유로2008', '공인구가', '변할', '기록', '시정조치는', '죽을', '맛', '', ''], ['로마올림픽에서', '육미지황탕', '이남지역으로', '동메달에', '머문', '추경대는', '차년', '파리오픈', '결승전에서', '진', '동영의', '탄셰', '차우세스쿠를', '비롯해', '몽골의', '이창동', '차간바', '발보나의', '리자루드', '박혜미셔', '좌타자를', '놓고', '추축한다', '.'], ['금반', '명기', '통합우승', '24', '10회차는', '8일', '상오', '6시', '50분', '상오', '11시', '50분에', '발태가', '끝마감되며', '비공식', '적중결과는', '5일', '공표된다', '.'], ['권뢰가', '있는', '곳에', '직경에', '따라', '달라지는데요', '.'], ['때로는은', '귀여운', '가스나기인', '비담', '세상일에는', '무관심', '.']]

data_load.py

import os
import re
from transformers import BertTokenizer

# 파일 로드하고 텍스트파일 전처리하기
def file_load(file_path):
    tagged_sentences = []
    sentences = []
    with open(file_path,"r") as f:
        for line in f:
            if len(line) == 0 or line[0] == "\n":
                if len(sentences) > 0:
                    tagged_sentences.append(sentences)
                    sentences = []
            splits = line.rstrip('\n').split('\t')
            if len(splits) == 3:
                sentences.append([splits[1],splits[-1]])
    return tagged_sentences

# 전처리한 데이터를 바탕으로 단어와 태그 나누기
def tag_split(tagged_sentences):
    sentences, ner_tags = [],[]
    for tagged_sentence in tagged_sentences:
        sentence, tag_info = zip(*tagged_sentence)
        cng_sentence = []
        cng_sentence.append("[CLS]")
        tag_info = list(tag_info)
        tag_info.insert(0,'-')
        for str in sentence:
            # 한글, 영어, 소문자, 대문자 이외의 단어 제거
             str = re.sub(r'[^ㄱ-ㅣ가-힣0-9a-zA-Z.]', "", str)
             cng_sentence.append(str)
             list(tag_info)
             
        cng_sentence.append("[SEP]")
        tag_info.append('-')

        sentences.append(cng_sentence)
        ner_tags.append(tag_info)

    return sentences, ner_tags


if __name__ == "__main__":
    file_path = "data/train_data.txt"
    tagged_sentences = file_load(file_path)
    print(tagged_sentences[5000])
    sentences, ner_tags = tag_split(tagged_sentences)
    print(sentences[5000],ner_tags[5000])
# 원본 파일
[['Copyrights', '-'], ['ⓒ', '-'], ['히타치', 'ORG_B'], ['.', '-']]
# 후
['[CLS]', 'Copyrights', '', '히타치', '.', '[SEP]'] ['-', '-', '-', 'ORG_B', '-', '-']
728x90
반응형