working_helen

[text 감정 추출 모델] 텍스트 전처리 / Goolgetrans 번역 API 본문

deep daiv./추천시스템 project

[text 감정 추출 모델] 텍스트 전처리 / Goolgetrans 번역 API

HaeWon_Seo 2023. 9. 18. 22:05

text 감정 추출 모델 훈련 과정에서 진행한 텍스트 전처리와 구글 번역 API에 대해 공부해본다.

 

 

1. 텍스트 전처리
2. 토큰화
3. 정제
4. 정규화

5. Goolgetrans 번역 API

 


1. 텍스트 전처리 (Text preprocessing)

- 자연어 처리 문제에서 분석 목적에 맞게 텍스트 데이터를 사전에 전처리하는 작업

- 토큰화(tokenization) & 정제(cleaning) & 정규화(normalization) 3가지 과정으로 이루어진다.

- NLTK (Natural Language Toolkik) : 영어 텍스트 전처리를 위한 Python의 자연어 처리 패키지

 

 

2. 토큰화

1) 토큰화(tokenization)

- 주어진 코퍼스(corpus, 말뭉치)를 어떠한 작은 단위 토큰(token)으로 나누는 작업

- 토큰은 상황마다 다르게 지정할 수 있는데, 토큰의 기준을 단어(word)로 하는 경우를 단어 토큰화(word tokenization), 

토큰의 기준을 문장(sentence)으로 하는 경우 문장 토큰화(Sentence Tokenization)가 된다.

 

 

2) 토큰화시 주의해야하는 부분

 

  • 구두점이나 특수 문자가 의미있는 경우 : $45.55(가격), Ph.D(학위) 등
  • 줄임말 표현인 경우 : we're, I'm, don't 등
  • 하나의 단어이지만 띄어쓰기가 있는 경우 : New York, rock n roll 등
  • 공백로 구분되지 않는 경우: 's (소유격) 

 

 

3) nltk를 이용한 토큰화 : word_tokenizeWordPunctTokenizer

## word_tokenize
from nltk.tokenize import word_tokenize
word_tokenize(text)

## WordPunctTokenizer
from nltk.tokenize import WordPunctTokenizer
punct_tokenizer = WordPunctTokenizer()
punct_tokenizer.tokenize(text)

 

 

 

3. 정제

1) 정제(cleaning)

- 노이즈 데이터를 제거하는 작업

- 분석 목적에 맞지 않는 불필요한 단어들을 제거

 

  • 불필요한 특수문자 제거 : re.sub 함수와 정규표현식 이용
  • 등장 빈도가 적은 단어를 삭제
  • 불용어 제거

 

 

2) 불용어 Stopword

- 자주 등장하지만 분석을 하는 것에 있어서는 큰 도움이 되지 않는 단어

- 대명사, 조사, 관사, 접미사, 강조성 부사 등

- NLTK의 경우 179여 개 단어로 구성된 불용어 사전을 사용한다. 이때 NLTK 불용어 사전은 소문자 기준으로 등록되어 있으므로 모든 단어를 소문자로 바꾼 후 불용어를 제거를 진행한다.

 

 

 

4. 정규화

1) 정규화(normalization)

- 동일한 의미이지만 표현 방법이 다른 단어를 하나로 통합하는 작업

- 특히 표제어 추출과 어간 추출의 경우 서로 달라보이는 단어들을 하나로 일반화함을써 문서 내 단어 수를 줄이는 효과를 준다.

 

  • 대소문자 통합 : 다만 미국 US와 대명사 us는 통합되지 말아야하는 등 주의가 필요
  • 어간 추출 (Stemming)
  • 표제어 추출 (Lemmatization)

출처 : https://www.linkedin.com/pulse/stemming-lemmatization-ashik-kumar/

 

 

2) 어간 추출 (Stemming)

- 단어의 어간을 추출하는 작업

- 문맥을 고려하지 않고, 사전에 정해진 규칙에 따라 단어의 어미를 자르기 때문에, 어간 추출 결과 전에 존재하지 않는 단어일 경우가 많다.

 

- nltk를 이용한 어간 추출

: nltk에는 Porter, Lancaster, Snowball Stemmer 여러가지 어간 추출 Stemmer가 존재

## Porter Stemmer 사용

from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
words = [단어 list]
result = [stemmer.stem(word) for word in words]

 

 

3) 표제어 추출(Lemmatization)

- 단어의 표제어를 찾아가는 과정 ex) know, knows, known → know

- 문맥을 고려하면서 진행되기 때문에 Stemming에 비해 시간은 더 오래 걸리지만, 대신 단어의 원형이 더 잘 보존된다.

 

- nltk를 이용한 표제어 추출 : WordNetLemmatizer

from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
words = [단어 list]
result = [lemmatizer.lemmatize(word) for word in words]

 

 

4) 품사 태깅 (Part-Of-Speech Tagging ; POS Tagging)

- 단어 토큰화시 각 단어가 주어진 문맥에서 어떤 품사로 쓰였는지 라벨링하는 방법 

- Lemmatization은 Stemmin에 비해 문맥을 고려하지만, 여전히 적절하지 않게 분리되는 경우가 발생할 수 있다. 이 경우 표제어 추출기(lemmatizer)에게 단어의 품사 정보를 입력함으로써 성능을 개선할 수 있다.

 

- nltk를 이용한 토큰화 + POS 태깅 : nltk.pos_tag 함수

from nltk.tokenize import word_tokenize
text= "주어진 문장"
tokens=word_tokenize(text)		#단어로 토큰화
pos_tokens=nltk.pos_tag(tokens)		#품사 태깅

## 품사 지정해서 표제어 추출
lemmatizer = WordNetLemmatizer()
lemmatizer.lemmatize('dies', 'v')

 

- WordNetLemmatizer 객체에 POS Tagging까지 완료된 상태의 input를 입력해준다.

- 이때 nltk.pos_tag 함수의 품사 Tag 종류와 wordnet 객체의 품사 Tag 종류가 일치시켜주는 과정이 필요하다.

- 단어 토큰화 + POS 정보 태깅 → lemmatizer 입력 형식에 맞게 조정 → lemmatization

## Tag 대응시켜주는 함수
# return WORDNET POS compliance to WORDENT lemmatization (a,n,r,v)

def get_wordnet_pos(treebank_tag):
    if treebank_tag.startswith('J'):
        return wordnet.ADJ
    elif treebank_tag.startswith('V'):
        return wordnet.VERB
    elif treebank_tag.startswith('N'):
        return wordnet.NOUN
    elif treebank_tag.startswith('R'):
        return wordnet.ADV
    else:
        return wordnet.NOUN

 

 

 

 

 

5. 구글 번역 API

- 구글은 번역 API로 무료로 사용 가능한 googletrans와 유료인 Google Could Translation을 제공하고 있다.
- 본 프로젝트에서 사용한 googletrans의 경우 별도의 인증 key 없이 패키지 설치를 통해 사용할 수 있다.
- 언어 감지 및 번역 기능을 수행한다.

구글 번역기가 지원하는 언어 종류

#적절한 파이썬 버전을 사용해야 error가 발생하지 않음
!pip install googletrans==4.0.0-rc1

from googletrans import Translator
translator = Translator()
text = "번역 전 문장"

#언어 감지
translator.detect(text)

#번역하기
translator.translate(번역할 문장, 번역할 언어, 번역 전 언어)
text_t = translator.translate(text)	#default는 영어로 번역
text_t = translator.translate(text, dest='ko')

 

 

 

 

Jupyter Notebook

 

 

 

 

 

 

 

Reference

[토큰화]
https://wikidocs.net/21698
https://velog.io/@nkw011/nlp-tokenizer

[정제 & 정규화]
https://wikidocs.net/22530
https://wikidocs.net/21707
https://didu-story.tistory.com/71
https://cheris8.github.io/data%20analysis/TP-POS-Tagging/
https://velog.io/@limelimejiwon/Stemming%EC%96%B4%EA%B0%84-%EC%B6%94%EC%B6%9C-vs-Lemmatization%ED%91%9C%EC%A0%9C%EC%96%B4-%EC%B6%94%EC%B6%9C-in-%EC%9E%90%EC%97%B0%EC%96%B4-%EC%B2%98%EB%A6%AC

[텍스트 전처리]
https://wikidocs.net/21694
https://myjamong.tistory.com/77
https://yanoo.tistory.com/28
https://hitomis.tistory.com/68
https://americanoisice.tistory.com/49

[구글 번역 API]
https://www.dinolabs.ai/386
https://coding-kindergarten.tistory.com/98