NLP 모델링을 위한 필수 텍스트 전처리 기법

김승학·2025년 9월 23일
0

스터디

목록 보기
1/5
post-thumbnail

1. 자연어 처리 용어 정리

용어내용
말뭉치(Corpus)텍스트를 가공 · 처리 · 분석할 수 있는 형태로 모아 놓은 자료 집합
토큰(token)문장이나 코드를 분석할 때, 단어나 구문 단위로 쪼개어 나타내는 것
토큰화(tokenization)주어진 텍스트를 원하는 단위(토큰)로 나누는 작업
어간추출(stemming)단어가 활용될 때 변하지 않는 부분, 단어의 기본적인 부분을 추출(Porter 알고리즘사용)
n-gramn개의 연속적인 단어 나열
정제(Cleaning)특수문자, 숫자, HTML 태그 등 자연어 처리에 불필요한것들을 제거하는 과정
정규화(Normalization)같은 의미를 가진 동일한 단어를 하나로 통일시켜 표준단어로 만드는 작업
불용어(Stopword)유의미한 토큰만을 선별하기 위해서 의미가 없는 토큰을 제거하기위한 불필요한 단어
표제어 추출(Lemmatization)‘표제어’ 또는 ‘기본 사전형 단어'를 추출
  1. 어간(stem)
    : 단어의 의미를 담고있는 단어의 핵심 부분
  2. 접사(affix)
    : 단어에 추가적인 의미를 주는부분

2. 언어 전처리 과정

  1. Sentence (문장)

    • 자연어 처리를 위한 문장단위로 입력
    • 예 : I love natural language processing.
  2. Tokenization(토큰화)

    • 토큰의 기준(word)을 했을 경우, 문장을 작은 단위로 나누는 과정
    • 보통 단어, subword, 문자 단위로 나뉠수 있음
    • Example
    1. 단어 기준 토큰화 : [”I”, “love”, “natural”, “language”, “processing”]

      1. 문자 기준 토큰화 : [”I, “ ”, “l”, “o”, “v”, “E”]
      import nltk
      from nltk.tokenize import sent_tokenize, word_tokenize
      # 필요한 nltk 다운로드 
      nltk.download('punkt') # nltk 오류시 필요한 데이터 다운로드 * 에러시 명시 되어있음
      nltk.download('punkt_tab')
      
      para = "Hello everyone. It's good to see you. Let's start our text mining Class!" # 말뭉치 courpus 
      word_tokenize(para) # 토큰화 단어별 
      >> ['Hello', 'everyone', '.', 'It', "'s", 'good', 'to', 'see', 'you', '.', 'Let', "'s", 'start', 'our', 'text', 'mining', 'Class', '!']
      sent_tokenize(para) # 토큰화 문장별  tokenizae
      >> ['Hello everyone.', "It's good to see you.", "Let's start our text mining Class!"]
      
  3. Cleaning & Stemming (정제 및 어간추출)

    • Cleaning(정제) : 특수문자, 숫자, HTML 태그, 불용어(stopwords) 제거 등 —> 자연어 전처리
    • Stemming(어간추출) : 단어의 변형을 기본 형태(root)로 바꾸는 과정
      ● 예 : “running”, “runs”, “ran” —> “run” 
      from nltk.tokenize import word_tokenize
      from nltk.corpus import stopwords
      import re 
      english_stops = set(stopwords.words('english')) # 중복 단어 제거 
      text = "Sorry, I couldn't go to movie yesterday."
      text = text.lower()
      text = re.sub(r'[^a-z]', ' ', text)
      tokens = word_tokenize(text)
      result = [token for token in tokens if token not in english_stops]
      print(result)
      
      >> ['sorry', 'go', 'movie', 'yesterday']
  4. Encoding(인코딩)

    • 텍스트 데이터를 머신러닝 모델이 처리할 수 있도록 숫자 형태로 변환.

    • 주요방식:

        1.  One-hot encoding (원핫 인코딩) 
      
        2. Word2Vec, Glove(단어 임베딩)    —> 원핫 인코딩으로 처리된 텍스트를 벡터(숫자로) 변환
      
        3. TF-IDF (단어 빈도-역 문서 빈도, Term Frequency-Inverse Document Frequency)
        단어의 빈도와 역 문서 빈도를 사용하여 단어들 마다 중요한 정도에 따라 서 가중치를 부여하는 방법 
           

ex ) “a new car, used car, car review”

wordTF
a1/7
new1/7
car3/7
used1/7
review1/7

“a friend in need is a friend indeed”

wordTF
a2/8
friend2/8
in1/8
need1/8
is1/8
indeed1/8
    import pandas as pd 
    from math import log 
    # from sklearn.feature_extraction.text import TfidfVectorizer 
    docs = [
      '먹고 싶은 사과',
      '먹고 싶은 바나나',
      '길고 노란 바나나',
      '저는 과일이 좋아요',
    ]

    # 1. 단어 집합(vocabulary) 구성 
    vocab = list(set(w for doc in docs for w in doc.split()))
    vocab.sort()

    # 2. 단어 빈도(Term Frequency, TF) 계싼
    def compute_tf(doc):
    		tf = {}
    		words = doc.split()
    		for term in vocab:
    			tf[term]  = words.count(term) / len(words)
    		return tf 

    # 3. 역문서 빈도(Inverse Document Frequency, IDF) 계산
    def compute_idf(docs):
        idf = {}
        N = len(docs) # 총문서의 개수 
        for term in vocab:
    	    df = sum(term in doc.split() for doc in docs)
    	    idf[term] = log(N / (df + 1 )) + 1 # 스무딩 처리 divide zero 에러 제거 
    	  return idf 

    # 4. TF-IDF 계산
    tf_list = [compute_tf(doc) for doc in docs]
    idf = compute_idf(docs)

    tfidf_list = []
    for tf in tf_list:
        tfidf = {}
        for term in vocab:
            tfidf[term] = tf[term] * idf[term]
        tfidf_list.append(tfidf)

    df_tfidf = pd.DataFrame(tfidf_list)
    print(df_tfidf.round(3))
  1. Sorting(정렬 : 분류작업)
    • RNN 계열 모델에서 입력 시퀀스 길이 기준으로 데이터를 정렬
    • 배치 처리 속도 향상 및 효율적인 패딩 처리
    • 예 : 길이가 짧은 문장부터 긴 문장 순으로 정렬 처리
  2. Padding & Similarity(패딩 & 유사도)
    • Padding(패딩) : 길이가 전부 동인할 문서들을 만들기 위해 하는 작업
      • Zeropadding : 숫자 0으로 패딩하는 작업
    • Smilarity(유사도) : 문서들 간에 동일한 단어 또는 비슷한 단어가 얼마나 공통적으로 많이 사용되어있는지 수치화하여 표현했는지(DTM, Word2Vec)
      • 예) 유클리드 거리, 코사인 유사도등

3. 정규 표현식(Regular Expression)

1) 정규 표현식 문법

특수 문자설명
.한개의 임의의 문자를 나타낸다.
?앞의 문자가 존재할 수 도 있고, 존재하지 않을수도 있다.(문자가 0개 또는 1개)
*앞의 문자가 무한개로 존재할 수도 있고, 존재하지 않을수 도 있다. (문자가 0개이상)
+앞의 문자가 최소한개이상 존재한다.(문자가 1개이상)
^뒤의 문자열로 문자열이 시작된다
$앞의 문자열로 문자열이 끝난다.
{숫자}숫자 만큼 반복
{숫자1, 숫자2}숫자1 이상 숫자2 이하만큼 반복한다. ?, *,+를 이것으로 대체 가능
{숫자,}숫자 이상만큼 반복한다.
[]대괄호 안의 문자들 중 한개의 문자와 매치
[^문자]해당 문자를 제외한 문자를 매치
lAlB 와 같이 쓰이며 A 또는 B의 의미를 갖음

2) 역슬래쉬()를 이용한 문자 규칙

문자규칙설명
\\역 슬래쉬 문자 자체를 의미함
\d모든 숫자를 의미함 [0-9] 와 동일
\D숫자를 제외한 모든 문자를 의미한다 [^0-9] 와 동일
\s공백을 의미함 [\t\n\r\f\v] 와 동일
\S공백을 제외한 문자를 의미 [^\t\n\r\f\v]와 동일
\w문자 또는 숫자를 의미함 [a-zA-Z0-9] 와 동일
\W문자 또는 숫자가 아닌 문자를 의미함 [^a-zA-Z0-9]와 동일

3) 정규표현식 모듈 함수

모듈 함수설명
re.compile()정규표현식을 컴파일 하는 함수, 파이썬에 미리 컴파일을 해놓고 사용하여 속도 측면에서 유리함
re.search()문자열 전체에 대해 정규표현식과 매치되는지 검색한다.
re.match()문자열의 처음이 정규표현식과 매치되는지 검색
re.split()정규 표현식을 기준으로 문자열을 분리하여 리스트로 리턴
re.findall()문자열에 정규 표현식과 매치되는 모든 경우의 문자열을 찾아서 리스트로 리턴 만약 리턴되는 값이 없을 경우 빈 리스트로 리턴
re.finditer()문자열에서 정규 표현식과 매치되는 모든 경우의 문자열에 대한 이터레이터 객체를 리턴 ex) a= re.finditer() —> next(iter(a))
re.sub()문자열에서 정규 표현식과 일치하는 부분에 대해서 다른 문자열로 대체
  • r prefix : 문자열 앞에 붙이는 rraw string 의 의미를 가지며 역슬래쉬 \ 을 탈출 문자로 보지 않고, 아무 역할도 하지 않는 평범한 문자열로 간주한다. \s 는 탈출문자에 해당하지 않기 때문에 추가적인 pattern에 넣어줘야함

예시 )

print("Hello World!\n")
print(r"Hello World!\n")
>> Hello World!
>> 
>> Hello World!\n

연습용 사이트(정규식표현) —> https://regexr.com/5mhou

-필수 패키지 설치

pip install nltk konlpy pandas numpy matplotlib seaborn scikit-learn torch 
pip install JPype1-0.6.3-cp36-cp36m-win_amd64.whl # 설치 주소 https://github.com/jpype-project/jpype/releases * 디렉토리에 파일이 있어야 설치 가능 
profile
매일 1%씩 성장하는 개발자의 이야기

0개의 댓글