일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 순차 컨테이너
- class
- 알고리즘
- list
- Animation
- 2020.04.19
- SWiFT
- UIPanGestureRecognizer
- Reverse Engineering
- 모달인듯 모달 아닌 뷰
- ios
- 컴퓨터구조
- vector
- scroll
- 스택
- Reversing
- 백준 1920
- Constraint
- Swing
- 컴퓨터 구조
- 2020.06.14
- UIView
- stl
- 표준 템플릿 라이브러리
- 백준 10828
- 2020.05.17
- BOJ
- Stack
- struct
- NavigationBar
- Today
- Total
야금야금
한국어 분석(형태소 분석) 본문
형태소 분석
: 자연 언어의 문장을 최소 단위(형태소)로 분할하고, 품사를 판별하는 작업이다.
형태소 분석은 기계 번역, 텍스트 마이닝 등의 여러 분야에서 활용된다.
영어의 경우 띄어쓰기를 통해 형태소를 분석하기 때문에 어렵지 않다. 하지만 아시아 계열의 언어의 경우 품사 사전과 문법 사전을 기반으로 대조하면서 형태소 분석을 진행해야 한다. 문법 규칙에 의한 방법과 확률적 언어 모델을 사용하는 등 방법이 있고 최근 확률적 언어 모델을 사용한 형태소 분석이 많아져 정밀도가 높아졌다.
한국어 형태소 분석
KoNLPy의 트위터 형태소 분석기
from konlpy.tag import Okt
okt = Okt()
malist1 = okt.pos("아버지 가방에 들어가신다." , norm = True, stem = True)
malist2 = okt.pos("그래욬ㅋㅋ?" , norm = True, stem = True)
malist3 = okt.pos("그래욬ㅋㅋ?" , norm = False, stem = True)
malist4 = okt.pos("그래욬ㅋ?" , norm = True, stem =False)
print(malist1)
print(malist2)
print(malist3)
print(malist4)
Okt() : Okt객체 생성 메서드
pos() : 형태소 분석을 진행할 문장을 지정하는 메서드
norm옵션 : 그래욬ㅋㅋ -> 그래요 처럼 변환해주는 옵션
stem옵션 : 원형을 찾아주는 옵션 (그래요 -> 그렇다)
박경리의 "토지"를 사용한 출현 빈도 분석
import codecs
from bs4 import BeautifulSoup
from konlpy.tag import Okt
fp = codecs.open("BEXX0003.txt", "r", encoding="utf=16")
soup = BeautifulSoup(fp, "html.parser")
body = soup.select_one("body > text")
text = body.getText()
okt = Okt()
word_dic ={}
lines = text.split("\n")
for line in lines:
malist = okt.pos(line)
for word in malist:
if word[1] == "Noun":
if not (word[0] in word_dic):
word_dic[word[0]] = 0
word_dic[word[0]] += 1
keys = sorted(word_dic.items(), key=lambda x:x[1], reverse=True)
for word, count in keys[:50]:
print("{0}({1})".format(word, count), end="")
print()
실행 결과
Word2Vec
: 문장 내부의 단어를 벡터로 변환하는 도구이다. 단어의 연결을 기반으로 단어의 연관성을 벡터로 만들어준다. 이를 활용하면 단어의 의미를 파악할 수 있다.
Gensim의 Word2Vec으로 "토지" 읽어보기
다음 코드는 koNLPy의 Okt 형태소 분석기로 형태소를 나누고 Word2Vec으로 읽어 들이는 예제이다
import codecs
from bs4 import BeautifulSoup
from konlpy.tag import Okt
from gensim.models import word2vec
fp = codecs.open("BEXX0003.txt", "r", encoding="utf=16")
soup = BeautifulSoup(fp, "html.parser")
body = soup.select_one("body > text")
text = body.getText()
okt = Okt()
result = []
lines = text.split("\n")
for line in lines:
malist = okt.pos(line, norm=True, stem=True)
r =[]
for word in malist:
if not word[1] in ["Josa", "Eomi", "Punctuation"]:
r.append(word[0])
rl = (" ".join(r)).strip()
result.append(rl)
print(rl)
gubun_file = 'toji.gubun'
with open(gubun_file, 'w', encoding='utf-8') as fp:
fp.write("\n".join(result))
data = word2vec.LineSentence(gubun_file)
model = word2vec.Word2Vec(data, size=200, window=10, hs=1, min_count=2, sg=1)
model.save("toji.model")
print("ok")
프로그램을 실행하면 "toji.model"이라는 모델 파일이 생성되며 아래와 같이 학습에 사용할 텍스트가 출력된다.
"토지" 모델 살펴보기
위에서 생성한 토지 모델을 읽어 들여서 단어를 추출해 보자
먼저 "땅"과 유사한 단어를 추출해보았다.
from gensim.models import word2vec
model = word2vec.Word2Vec.load("toji.model")
print(model.most_similar(positive=["땅"]))
실행 결과는 다음과 같다.
땅과 비슷한 단어로는 "육", "원귀", "일기", "사흘", "누님", "어무님", "커서", "봇짐", "시월", "장차"등이 추출되었다.
'SWING > 머신러닝' 카테고리의 다른 글
문장의 유사도를 N-gram으로 분석하기 (0) | 2020.08.08 |
---|---|
MLP로 텍스트 분류하기 (0) | 2020.08.02 |
베이즈 정리로 텍스트 분류하기 (0) | 2020.07.25 |
머신러닝의 이해와 지도학습을 이용한 분류 (0) | 2020.07.10 |
인공지능 서비스와 기술의 이해 (0) | 2020.07.10 |