이번에는 프로그램으로 뭊낭을 자동으로 생성해 보겠다. 자연 언어 분석을 활용하는 예로 마르코프 체인과 머신러닝으로 문장을 생성하는 LSTM/PNN을 사용해 볼것이다. 정밀도가 높은 문장을 구현하는 것은 아직 어렵겠지만 나름 그럴듯한 문장정도는 구현 할 수 있다.
마르코프 체인
마르코프 체인은 확률을 기반으로 문장을 이어 붙여 나가는 방법이다. 마르코프 성질이란 과거의 상태를 무시하고, 현재의 상태만을 기바능로 다음 상태를 선택하는 것을 의미한다. 문장을 만드는 과정을 정리하면 다음과 같다.
-
문장을 단어로 분할(형태소 분석)한다.
-
단어의 전휴 연결을 딕셔너리에 등록한다.
-
사전을 사용해 임의의 문장을 생성한다.
예를 들어 개와 관련된 속담을 딕셔너리에 등록했다고 해보자.
개|도|닷새|가|되면|주인|을|안다|.
기르던|개|에게|다리|가|물렸다|.
닭|쫒던|개|지붕|쳐다|보듯|한다|.
똥|묻은|개|가|겨|묻은|개|나무란다|.
이 텍스트중 랜덤으로 한 형태소를 뽑아 문장을 시작한다. 예를 들어 '개'라는 단어로 시작할 경우 그 다음으로 올 수 있는 단어는 도,에게,지붕,가 등이 있다. 그 뒤로 '가'가 왔다고 해보면 그뒤는 '되면','겨'가 올 수 있다. 이를 반복하여 "개 + 가 + 되면 +주인 + 을 + 안다+ . " 라는 다소 독특한 문장이 만들어 진것이다.
마르코프 체인 구현하기
파일은 이전에 사용헀던 SF소설을 그대로 사용하겠다.(그 편이 나도 재밌으니깐) 형태소 분석에는 koNLPy를 사용하겠다.
마르코프 체인을 사용해 문장을 만들떄 한국어는 띄어쓰기 규칙이 복잡하다. 따라서 띄어쓰기는 생략하도록 하겠다.
(앞으로 코드는 캡쳐하여 올리기로 하였다. 그이유는 1. 보기 예뻐서 2. 코드를 배껴쓴것이 아닌 직접 작성한것을 알리기위해)
tmp 문장의 시작을 의미하는 "@"을 입력하고 단어가 3개 이상 들어갈 경우 사전에 데이터를 등록한다.
set_word3는 사전에 데이터를 등록하는 함수이다. 앞의 단어에 따라서 뒤에 나올 단어를 뽑는 것을 알 수 있다.
word_choice 함수에서 랜덤으로 하나의 단어를 뽑은후 w1으로 선정한다 w2는 w1에 따라 달라진다.
본 파일은 토지가 아닌 stiens gate라는 소설이다. 구두점을 뺸 나머지 단어들을 딕셔너리에 등록하여 이를 기반으로 새로운 문장을 만들어 낸다.
어설프긴 하지만 나름대로 문장이 완성됬다!
'Machine Learning > 챗봇 만들기' 카테고리의 다른 글
간단한 챗봇 만들기 (0) | 2020.07.14 |
---|---|
RNN 그리고 LSTM 그리고 문장만들 (0) | 2020.07.09 |
레벨슈타인 거리를 계산 & N - gram으로 유사도 구하기 (0) | 2020.07.03 |