1. 자연어란?
- Natural Language를 뜻합니다.
- 프로그래밍 언어와 같이 인공적으로 만든 기계 언어와 대비되는 단어로, 우리가 일상에서 주로 사용하는 언어를 말합니다.
1-1. 자연어 처리
- 컴퓨터가 한국어나 영어와 같은 인간의 자연어를 읽고 이해할 수 있도록 돕는 인공지능의 한 분야를 말합니다.
- 자연어에서 의미 있는 정보를 추출하여 활용을 합니다.
- 기계가 자연어의 의미를 이해하고 사람의 언어로 소통할 수 있게 합니다.
1-2. 자연어 처리의 활용
- 문서 분류, 스팸 처리와 같은 분류 문제에 주로 활용됩니다.
- 검색어 추천
- 음성인식, 질의 응답, 번역
- 소셜 미디어 분석 등 많은 분야에 활용되고 있습니다.
1-3. 자연어 처리의 용어
- 자연어 이해(NLU)
- 자연어 처리의 하위 집합
- 일반적으로 기계가 자연어의 실제 의미, 의도나 감정, 질문 등을 사람처럼 이해하도록 돕는 것을 뜻합니다.
- 기계가 다양한 텍스트의 숨겨진 의미를 해석하려면 사전 처리 작업들과 추가 학습이 필요합니다.
- 비 언어적 신호(표정, 손짓, 몸짓)도 힌트로 사용될 수 있습니다.
- 텍스트에서 의미 있는 정보를 추출하는 기술과 상황을 통계적으로 학습시킬 수 있는 다량의 데이터가 필요합니다.
- 자연어 생성(NLG)
- 기계가 사람의 언어를 직접 생성하도록 돕는 기술을 말합니다.
- 기계가 일련의 계산 결과를 사람의 언어로 표현하도록 도와줍니다.
2. 토크나이징
- 문장을 의미가 있는 가장 작은 단어들로 나눈것
- 나눠진 단어들을 이용해 의미를 분석합니다.
- 가장 기본이 되는 단어들을 "토큰"이라고 부릅니다.
- 문장 형태의 데이터를 처리하기 위해 제일 처음 수행해야 하는 기본적인 작업입니다.
- 토크나이징을 어떻게 하느냐에 따라 성능의 차이가 날 수 있습니다.
3. 형태소 분석
- 자연어의 문장을 "형태소"라는 최소 단위로 분할하고 품사를 판별하는 작업을 말합니다.
- 영어 형태소 분석은 형태소마다 띄어쓰기를 하여 문장을 구성하는 것이 기본(분석이 쉬운편)입니다.
- 아시아 계열의 언어분석은 복잡하고 많은 노력이 필요합니다.
- 한국어 형태소 분석 라이브러리 : KoNLPy
실습
1. 코렙에서 한국어 형태소 분석 라이브러리 설치
!pip install KoNLPy
2. 임포트
from konlpy.corpus import kolaw
# konlpy에 kolaw(대한민국 헌법 텍스트 파일)을 제공합니다.
3. 파일 확인
kolaw.fileids()
# 결과값 :
['constitution.txt']
# fileids() : 어떤 파일이 있는지 확인하는 함수 입니다.
4. 파일 불러오기
law = kolaw.open('constitution.txt').read()
law
5. kobill 임포트
from konlpy.corpus import kobill
# konlpy에는 kobill(국회법안 파일)을 제공합니다.
6. 파일 확인
kobill.fileids()
# 결과값 :
['1809896.txt',
'1809895.txt',
'1809894.txt',
'1809892.txt',
'1809897.txt',
'1809898.txt',
'1809899.txt',
'1809893.txt',
'1809891.txt',
'1809890.txt']
7. 파일 읽기
bill = kobill.open('1809895.txt').read()
bill
내용
- 명사, 대명사, 수사, 동사, 형용사, 관형사, 부사, 조사, 감탄사 총 9가지를 분석합니다.
- 분석기의 종류
- Hannanum : 한나눔, KAIST Semantic Web Research Center에서 개발하였습니다.
- Kkma : 꼬꼬마, 서울대학교 IDS 연구실에서 개발하였습니다.
- Komoran : 코모란, Shineware에서 개발하였습니다.
- Okt(Open Korean Text) : 오픈소스 한국어 분석기. 과거 트위터 형태소 분석기 입니다.
분석기 테스트
1. 모듈 전체 임포트
from konlpy.tag import *
2. 활성화
hannanum = Hannanum()
kkma = Kkma()
komoran = Komoran()
okt = Okt()
3. law에서 50글자만 뽑기
law[:50]
# 결과값 :
대한민국헌법\n\n유구한 역사와 전통에 빛나는 우리 대한국민은 3·1운동으로 건립된 대한민국임
4. hannanum을 이용하여 명사만 뽑기
hannanum.nouns(law[:50])
# 결과값 :
['대한민국헌법', '유구', '역사', '전통', '빛', '우리', '대한국민', '3·1운동', '건립', '대한민국임']
# nonus : 명사만 뽑는 함수입니다.
5. Kkma을 이용하여 명사만 뽑기
kkma.nouns(law[:50])
# 결과값 :
['대한',
'대한민국',
'대한민국헌법',
'민국',
'헌법',
'유구',
'역사',
'전통',
'우리',
'국민',
'3',
'1',
'1운동',
'운동',
'건립',
'대한민국임',
'임']
6. komoran을 이용하여 명사만 뽑기
komoran.nouns(law[:50])
# 결과값 :
['대한민국', '헌법', '역사', '전통', '국민', '운동', '건립', '대한민국', '임']
7. okt을 이용하여 명사만 뽑기
okt.nouns(law[:50])
# 결과값 :
['대한민국', '헌법', '유구', '역사', '전통', '우리', '국민', '운동', '건립', '대한민국', '임']
8. hannanum을 사용하여 모든 품사 추출
hannanum.morphs(law[:50])
# 결과값 :
['대한민국헌법',
'유구',
'하',
'ㄴ',
'역사',
'와',
'전통',
'에',
'빛',
'나는',
'우리',
'대한국민',
'은',
'3·1운동',
'으로',
'건립',
'되',
'ㄴ',
'대한민국임']
# morphs() : 모든 품사를 추출하는 함수 입니다.
9. hannanum을 사용하여 품사를 부착 후 확인
hannanum.pos(law[:50])
# 결과값 :
[('대한민국헌법', 'N'),
('유구', 'N'),
('하', 'X'),
('ㄴ', 'E'),
('역사', 'N'),
('와', 'J'),
('전통', 'N'),
('에', 'J'),
('빛', 'N'),
('나는', 'J'),
('우리', 'N'),
('대한국민', 'N'),
('은', 'J'),
('3·1운동', 'N'),
('으로', 'J'),
('건립', 'N'),
('되', 'X'),
('ㄴ', 'E'),
('대한민국임', 'N')]
# pos() : 모든 품사를 부착 후 확인하는 함수 입니다.
10. okt을 사용하여 품사를 부착 후 확인
okt.pos(law[:50])
# 결과값 :
[('대한민국', 'Noun'),
('헌법', 'Noun'),
('\n\n', 'Foreign'),
('유구', 'Noun'),
('한', 'Josa'),
('역사', 'Noun'),
('와', 'Josa'),
('전통', 'Noun'),
('에', 'Josa'),
('빛나는', 'Verb'),
('우리', 'Noun'),
('대', 'Modifier'),
('한', 'Modifier'),
('국민', 'Noun'),
('은', 'Josa'),
('3', 'Number'),
('·', 'Punctuation'),
('1', 'Number'),
('운동', 'Noun'),
('으로', 'Josa'),
('건립', 'Noun'),
('된', 'Verb'),
('대한민국', 'Noun'),
('임', 'Noun')]
※ okt의 좋은 함수
okt.tagset
# 결과값 :
{'Adjective': '형용사',
'Adverb': '부사',
'Alpha': '알파벳',
'Conjunction': '접속사',
'Determiner': '관형사',
'Eomi': '어미',
'Exclamation': '감탄사',
'Foreign': '외국어, 한자 및 기타기호',
'Hashtag': '트위터 해쉬태그',
'Josa': '조사',
'KoreanParticle': '(ex: ㅋㅋ)',
'Noun': '명사',
'Number': '숫자',
'PreEomi': '선어말어미',
'Punctuation': '구두점',
'ScreenName': '트위터 아이디',
'Suffix': '접미사',
'Unknown': '미등록어',
'Verb': '동사'}
# tagset : 영단어의 뜻을 한국어로 보여줍니다.
okt 활용
1. okt만 임포트 후 객체 활성화
from konlpy.tag import Okt
okt = Okt()
2. 예제생성 및 pos로 품사 확인
text = '아버지가방에들어가신다'
okt.pos(text)
# 결과값 :
[('아버지', 'Noun'), ('가방', 'Noun'), ('에', 'Josa'), ('들어가신다', 'Verb')]
3. 띄어쓰기 후 다시 테스트
text = '아버지가 방에 들어가신다'
okt.pos(text)
# 결과값 :
[('아버지', 'Noun'),
('가', 'Josa'),
('방', 'Noun'),
('에', 'Josa'),
('들어가신다', 'Verb')]
4. 다른 버전 테스트
okt.pos('오늘 날씨가 참 춥네욬ㅋㅋㅋ')
# 결과값 :
[('오늘', 'Noun'),
('날씨', 'Noun'),
('가', 'Josa'),
('참', 'Verb'),
('춥네욬', 'Noun'),
('ㅋㅋㅋ', 'KoreanParticle')]
5. norm옵션 추가 후 테스트
okt.pos('오늘 날씨가 참 춥네욬ㅋㅋㅋ', norm=True)
# 결과값 :
[('오늘', 'Noun'),
('날씨', 'Noun'),
('가', 'Josa'),
('참', 'Verb'),
('춥네요', 'Verb'),
('ㅋㅋㅋ', 'KoreanParticle')]
# norm = True : 각 형태소에 대한 원형으로 처리
6. stem옵션 추가 후 테스트
okt.pos('오늘 날씨가 매우 좋네욬ㅋㅋㅋ', norm=True, stem=True)
# 결과값 :
[('오늘', 'Noun'),
('날씨', 'Noun'),
('가', 'Josa'),
('매우', 'Noun'),
('좋다', 'Adjective'),
('ㅋㅋㅋ', 'KoreanParticle')]
# stem = True : 원형 글자로 변경
'Study > 자연어처리[NLP]' 카테고리의 다른 글
[자연어처리(NLP)] 3. 임베딩_1(이론) (0) | 2024.01.18 |
---|---|
[자연어처리(NLP)] 2. 자연어 처리 진행 순서_2(실습) (0) | 2024.01.17 |
[자연어처리(NLP)] 2. 자연어 처리 진행 순서_1(이론) (0) | 2024.01.17 |
[자연어처리(NLP)] 1. 자연어 처리 개요_2(워드 클라우드, Task) (0) | 2024.01.16 |