onnnzeoz

🌐 해당 카테고리에 작성하는 글은 모두 안상준, 유원준 <딥 러닝을 이용한 자연어 처리 입문> 를 요약했습니다.

🌐 비전공자 개발자가 자연어 처리 대학원에 가고싶어 공부한 기록들입니다.

🌐 해당 실습은 구글의 collab을 통해 실시했습니다.

🌐 전 내용과 이어집니다.

https://onnnzeoz.tistory.com/102

 

텍스트 전처리 기법(정규화, 어간 추출, 표제어 추출)

🌐 해당 카테고리에 작성하는 글은 모두 안상준, 유원준  를 요약했습니다.🌐 비전공자 개발자가 자연어 처리 대학원에 가고싶어 공부한 기록들입니다.🌐 해당 실습은 구글의 collab을 통해

onnnzeoz.tistory.com

 

02-04 불용어(Stopword)

문장에서는 자주 등장하지만 실제 의미 분석을 하는데는 거의 기여하는 바가 없는 단어 토큰을 제거하는 작업

from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize 
from konlpy.tag import Okt

stop_words_list = stopwords.words('english')
print('불용어 개수 :', len(stop_words_list))
print('불용어 10개 출력 :',stop_words_list[:100])

 

02-05 정규 표현식(Regular Expression)

정규표현식 모듈 함수

정규표현식 모듈에서 지원하는 함수

모듈 함수 설명

re.compile() 정규표현식을 컴파일하는 함수입니다. 다시 말해, 파이썬에게 전해주는 역할을 합니다. 찾고자 하는 패턴이 빈번한 경우에는 미리 컴파일해놓고 사용하면 속도와 편의성면에서 유리합니다.
re.search() 문자열 전체에 대해서 정규표현식과 매치되는지를 검색합니다.
re.match() 문자열의 처음이 정규표현식과 매치되는지를 검색합니다. search()가 정규 표현식 전체에 대해서 문자열이 매치하는지를 본다면, match()는 문자열의 첫 부분부터 정규 표현식과 매치하는지를 확인합니다.
re.split() 정규 표현식을 기준으로 문자열을 분리하여 리스트로 리턴합니다.
re.findall() 문자열에서 정규 표현식과 매치되는 모든 경우의 문자열을 찾아서 리스트로 리턴합니다. 만약, 매치되는 문자열이 없다면 빈 리스트가 리턴됩니다.
re.finditer() 문자열에서 정규 표현식과 매치되는 모든 경우의 문자열에 대한 이터레이터 객체를 리턴합니다.
re.sub() 문자열에서 정규 표현식과 일치하는 부분에 대해서 다른 문자열로 대체합니다.

 

02-06 정수 인코딩(Integer Encoding)

위의 단계들이 전처리 단계였다면 여기서부터는 본격적으로 텍스트를 수치화 함.

텍스트를 숫자로 바꾸는 기법 중 첫 단계.

각 단어를 고유한 정수에 맵핑시키기

정수(인덱스)를 부여하는 방법은 여러가지가 있지만 보통은 단어 등장 빈도수를 기준으로 정렬함

from nltk.tokenize import sent_tokenize
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords

raw_text = "A barber is a person. a barber is good person. a barber is huge person. he Knew A Secret! The Secret He Kept is huge secret. Huge secret. His barber kept his word. a barber kept his word. His barber kept his secret. But keeping and keeping such a huge secret to himself was driving the barber crazy. the barber went up a huge mountain."

# 문장 토큰화
sentences = sent_tokenize(raw_text)
print(sentences)

vocab = {}
preprocessed_sentences = []
stop_words = set(stopwords.words('english'))

for sentence in sentences:
    # 단어 토큰화
    tokenized_sentence = word_tokenize(sentence)
    result = []

    for word in tokenized_sentence: 
        word = word.lower() # 모든 단어를 소문자화하여 단어의 개수를 줄인다.
        if word not in stop_words: # 단어 토큰화 된 결과에 대해서 불용어를 제거한다.
            if len(word) > 2: # 단어 길이가 2이하인 경우에 대하여 추가로 단어를 제거한다.
                result.append(word)
                if word not in vocab:
                    vocab[word] = 0 
                vocab[word] += 1
    preprocessed_sentences.append(result) 
print(preprocessed_sentences)

 

좀 더 쉽게 하기 위해서 Counter, FreqDist, enumerate를 사용하거나, 케라스 토크나이저를 사용하는 것을 권장합니다.

문장토큰화→단어토큰화(소문자, 불용어, 길이 2이하 제거)→빈도수 리턴→빈도수 높은 순으로 정렬→높은순으로 1부터 부여→ 5번인덱스까지만 씀, 그 이상 인덱스 제거 →이 인덱스에 포함되지 않는 단어를 넣을 OOV라는 단어 추가 → 단어들 인덱스로 맵핑

이런 단계로 어마어마하게 돌아 돌아 가던 걸 Counter을 사용하면 한방에

 

from collections import Counter

all_words_list = sum(preprocessed_sentences, [])
print(all_words_list)
vocab = Counter(all_words_list)
print (vocab)

 

enumerate()는 순서가 있는 자료형(list, set, tuple, dictionary, string)을 입력으로 받아 인덱스를 순차적으로 함께 리턴한다는 특징

profile

onnnzeoz

@onnnzeoz

비전공자의 개발 공부 일지입니다 💦 국비 풀스택 과정 수강중