Home [Chatbot] Chapter3 토크나이저
Post
Cancel

[Chatbot] Chapter3 토크나이저

토크나이저

  • 가장 기본이 되는 단어들을 토큰(token)이라고 함
  • 토큰의 단위는 토크나이징 방법에 따라 달라질 수 있지만 일반적으로 일정한 의미가 있는 가장 작은 정보 단위로 결정
  • 주어진 문장에서 토큰 단위로 정보를 나누는 작업을 토크나이징이라고 함
  • 토크나이징은 문장 형태의 데이터를 처리하기 위해 제일 처음 수행해야 하는 기본적인 작업
  • 주로 텍스트 전처리 과정에서 사용
  • 토크나이징을 어떻게 하느냐에 따라 성능 차이

KoNLPy

  • 한국어 자연어 처리 토크아니징을 지원하는 파이썬 라이브러리

1. Kkma

  • Kkma 모듈의 함수 설명
함수설명
morphs문장을 형태소 단위로 토크아니징
nouns문장에서 품사가 명사인 토큰만 추출
pos형태소를 추출한 뒤 품사 태깅
sentences여러 문장들을 분리해주는 역할
  • Kkma 품사 태그
품사설명
NNG일반 명사
JKS주격 조사
JKM부사격 조사
VV동사
EFN평서형 종결 어미
SF마침표, 물음표, 느낌표
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from konlpy.tag import Kkma

kkma = Kkma()
text = '아버지가 방에 들어갑니다.'

# 형태소 추출
print(kkma.morphs(text))

# 형태소와 품사 태크 추출
print(kkma.pos(text))

# 명사만 추출
print(kkma.nouns(text))

# 문장 분리
sentences = '오늘 날씨는 어때요? 내일은 덥다던데.'
print(kkma.sentences(sentences))
1
2
3
4
['아버지', '가', '방', '에', '들어가', 'ㅂ니다', '.']
[('아버지', 'NNG'), ('가', 'JKS'), ('방', 'NNG'), ('에', 'JKM'), ('들어가', 'VV'), ('ㅂ니다', 'EFN'), ('.', 'SF')]
['아버지', '방']
['오늘 날씨는 어 때요?', '내일은 덥다 던데.']

2. Okt

  • Okt 모듈의 함수 설명
함수설명
morphs문장을 형태소 단위로 토크아니징
nouns문장에서 품사가 명사인 토큰만 추출
pos형태소를 추출한 뒤 품사 태깅
normalize문장을 정규화
phrases문장에서 어구 추출
  • Okt 품사 태그 표
품사설명
Noun명사
Verb동사
Adjective형용사
Josa조사
Punctuation구두점
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from konlpy.tag import Okt

okt = Okt()
text = '아버지가 방에 들어갑니다.'

# 형태소 추출
print(okt.morphs(text))

# 형태소와 품사 태그 추출
print(okt.pos(text))

# 명사만 추출
print(okt.nouns(text))

# 정규화, 어구 추출
text = '오늘 날씨가 좋아욬ㅋㅋ'

print(okt.normalize(text))
print(okt.phrases(text))
1
2
3
4
5
['아버지', '가', '방', '에', '들어갑니다', '.']
[('아버지', 'Noun'), ('가', 'Josa'), ('방', 'Noun'), ('에', 'Josa'), ('들어갑니다', 'Verb'), ('.', 'Punctuation')]
['아버지', '방']
오늘 날씨가 좋아요ㅋㅋ
['오늘', '오늘 날씨', '좋아욬', '날씨']

3. Komoran

  • Komoran 모듈의 함수 설명
함수설명
morphs문장을 형태소 단위로 토크아니징
nouns문장에서 품사가 명사인 토큰만 추출
pos형태소를 추출한 뒤 품사 태깅
  • Komoran 품사 태그
품사설명
NNG일반 명사
JKS주격 조사
JKB부사격 조사
VV동사
EF종결 어미
SF마침표, 물음표, 느낌표
1
2
3
4
5
6
7
8
9
10
11
12
13
from konlpy.tag import Komoran

komoran = Komoran()
text = '아버지가 방에 들어갑니다.'

# 형태소 추출
print(komoran.morphs(text))

# 형태소와 품사 태그 추출
print(komoran.pos(text))

# 명사만 추출
print(komoran.nouns(text))
1
2
3
['아버지', '가', '방', '에', '들어가', 'ㅂ니다', '.']
[('아버지', 'NNG'), ('가', 'JKS'), ('방', 'NNG'), ('에', 'JKB'), ('들어가', 'VV'), ('ㅂ니다', 'EF'), ('.', 'SF')]
['아버지', '방']

4. 사용자 사전 구축

  • 형태소 분석기에서 인식하지 못하는 단어들을 직접 추가하는 방법
  • Komoran이 다른 형태소 분석기에 비해 사전을 관리하는 방법이 편리하고 성능과 속도가 괜찮은 편이므로 Komoran 기준으로 챗봇 만들 예정

  • (‘엔’, ‘NNB’), (‘엘’, ‘NNP’), (‘피’, ‘NNG’)
  • 엔엘피라는 단어를 엔, 엘, 피라는 문자로 분리해 명사로 인식함
  • 챗봇의 경우 오류를 낼 확률이 높음
  • 이를 해결하기 위해 Komoran의 사용자 사전에 ‘엔엘피’라는 신규 단어 등록
1
2
3
4
5
6
from konlpy.tag import Komoran

komoran = Komoran()
text = '우리 챗봇은 엔엘피를 좋아해.'

print(komoran.pos(text))
1
[('우리', 'NP'), ('챗봇은', 'NA'), ('엔', 'NNB'), ('엘', 'NNP'), ('피', 'NNG'), ('를', 'JKO'), ('좋아하', 'VV'), ('아', 'EF'), ('.', 'SF')]
1
2
3
4
5
6
from konlpy.tag import Komoran

komoran = Komoran(userdic='C:/Users/USER/Desktop/userdic.txt')
text = '우리 챗봇은 엔엘피를 좋아해.'

print(komoran.pos(text))
1
[('우리', 'NP'), ('챗봇은', 'NA'), ('엔엘피', 'NNG'), ('를', 'JKO'), ('좋아하', 'VV'), ('아', 'EF'), ('.', 'SF')]
  • userdic='C:/Users/USER/Desktop/userdic.txt'
  • 메모장을 활용해 다음과 같은 txt 파일을 생성하여 userdic에 설정
  • 단어와 품사 사이 간격은 반드시 탭(Tab)으로 구분할 것

image

This post is licensed under CC BY 4.0 by the author.