본문 바로가기

* [R_Python] 데이터분석 정리/[Python] 텍스트마이닝

[자연어처리] 1. 단어 토큰화

분석 데이터를 수집하였으면 가장 먼저 하게 될 일은

토큰화를 통해 어떤 단어들이 나오는지 보고,

도메인 지식을 통해 누락되거나 빠진 어휘를 살펴보며 추가하는 일일 것입니다.

산업마다 사용하는 단어가 다르며, 이것들이 오픈되어있는 API 소스에는 분명히 누락되어 있을 것이기 때문입니다.

 

그러면 단어 토큰화 하는 과정과 & 어휘 구축에 대한 개념과

분석 시 python으로 사용할 수 있는 패키지에 대해 알아보도록 하겠습니다.

 

 

1. 단어 토큰화

  • 텍스트를 다수의 단어, n-그램(토큰)으로 분할
  • 비표준 문장 부호와 임티 (sns) 다루기
  • 어간 추출, 표제어 추출로 토큰 어휘 단축
  • 문장의 벡터 표현 구축
  • 사람이 직접 지정한 토큰 점수들에 기초한 감정 분석기 구축

 

  1. 어휘 구축
  • [순서] 토큰 → 어간 추출 → 단어 모음(bag of words) 벡터 생성
  • ★ 표제어/어간 기준으로 사전 통합하는 게 좋음

 

(1) 토큰화

토큰화 : 구체적인 정보를 담은 조각들로 쪼개는 텍스트를 쪼개는 것

  • ex) 단순 문자열의 단어로 분할 (토큰, n-그램)

 

1) 토큰화 (공백으로 쪼개기)

 

2) 벡터표현

→ 수치 벡터 표현 (원-핫 인코딩)

  • 열제목은 단어, 행제목은 단어의 위치를 나타냄
  • [장] 정보의 소실이 없음
  • [단] 테이블이 너무 커짐

→ 이진 벡터 표현

  • 열제목은 단어, 행제목은 sentences
  • 내적을 통해서 중복 측정
  • [장] 단어간 거리 등 계산 가능
  • [단] 연산 및 메모리

※ sparse vector : 0이 아닌 성분이 거의 없는 것

 

3) 토큰개선

  • 마침표 등 문장 부호 없애주기
  • (영어) 대/소문자 → 소문자
  • 어간 추출(stemming) ex) housing, houses 등
  • 표제어 추출
# 1. 문장 부호로 인한 변형 약화
import re
tokens = re.split(r'[-\\s.,;!?]+', sentence)
# \\s : 공백, \\t : xoq , \\r : 리턴 , \\n : 새줄, \\f : 폼피드, \\v: 수직 탭 

# 2. 소문자화
[i.lower() for i in tokens]

# 3. 어간추출기
from nltk.stem.porter import PorterStemmer

# 4. 표제어 추출
# 영어
nltk.download('wordnet')
from nltk.stem import WordNetLemmatizer

lemmetizer = WordNetLemmatizer()
lemmetizer.lemmatize("better", pos="a")

# 한글 (형태소 추출)
okt.nouns()
okt.pos()
kkma.nouns()
kkma.pos()

 

4) 토큰화 라이브러리 (토크나이저, 형태소 분석기)

  • 영어
    • spyCy
    • CoreNLP
    • NLTK
      • RegexpTokenizer
      • TreebankWordTokenizer
      • casual_tokenize
  • 한국어 (KoNLPy)
    • Okt(Open Korea Text)
    • Mecab(메캅)
    • Komoran(코모란)
    • Hannanum(한나눔)
    • 꼬꼬마(Kkma)
    ★ KoNLPy 설치 참고 :https://ingu627.github.io/tips/install_konlpy/
 

윈도우10 환경에서 konlpy 설치하는 방법

KoNLPy는 한국어 정보처리를 위한 파이썬 패키지입니다. NLP (자연어 처리)를 할 때 쓰이지만 운영체제가 윈도우같은 경우는 설치 버전을 좀 맞춰야 합니다.

ingu627.github.io

 

5) 어휘 확장 (n그램 사용)

 

  • 복합명사 등 잡아줄 때 사용
    • 희소한 n그램은 거의 사용안한다고 봄
    • 단어 사전 추가 시에 벡터 차원 수가 문서의 길이보다 길어지면 안됨
    • 불용어 삭제할 때, 개별 토큰보다 유용하게 쓸 수 있음
from nltk.util import ngrams

test_sents = list(ngrams(tokens, 2)) # 출력
test_sents

[" ".join(i) for i in test_sents] # 합치기
  • 불용어 : 자주 출현하지만 실질적 의미는 없는 단어들 ex) a, the, of
    • 영어
    • import nltk nltk.download('stopwords') #최초 1회 시행
    • stop_words = nltk.corpus.stopwords.words('english')
    • tokens = [x for x in tokens if x not in stopwords]
    •  
    • 한국어
      • 인터넷 검색 (구글에 치면 잘 나오는 단어를 리스트화해서 사용하기도 합니다)

 

Source : 파이썬으로 배우는 자연어 처리 인 액션