마르코프체인을 통해 뒤에 나올 단어 예측해보기

2018. 5. 20. 16:14Python-이론/python-인공지능

마르코프 체인을 통해 뒤에 나올 단어 예측하기



마르코프 체인은 러시아의 수학자 마르코프의 이름을 따서 만든 알고리즘이다. 주로 물리학과 통계학의 기본모델로 사용되고 있다. 간단하게 설명하자면 과거의 상태는 전혀 신경쓰지 않고 현재의 상태만을 고려하여 다음의 값을 추측하는 것을 의미한다.


만들 방법 


1. 각 문장을 한글 형태소로 나눈다. 


2. 각 문장의 세단어씩 딕셔너리에 대입 시켜준다. 

json 파일로 만들어준다. 

3.  json 파일을 참조하여 뒤에 무슨 단어가 나올지 추측할 수 있다. 


import codecs
from bs4 import BeautifulSoup
from konlpy.tag import Twitter
import json
fp = codecs.open('toji.txt','r',encoding='utf-16')

word_dic ={}
def three_dic(words):
    threeDic = ["@"]
    dic = {}
    for word in words:
        threeDic.append(word)
        if len(threeDic) < 3: continue
        if len(threeDic) > 3: threeDic = threeDic[1:]
        setWord_dic(threeDic)
        if word == ".":
            threeDic= ["@"]

def setWord_dic(threeData):
    s1,s2,s3 = threeData
    if s1 not in word_dic: word_dic[s1] = {}
    if s2 not in word_dic[s1]: word_dic[s1][s2]={}
    if s3 not in word_dic[s1][s2]: word_dic[s1][s2][s3]=0
    word_dic[s1][s2][s3] += 1

twitter = Twitter()
bsData = BeautifulSoup(fp,'html.parser')
body = bsData.select_one('body > text')
lines = body.getText()
lines = lines.replace("…","")
words = []
malist = twitter.pos(lines,norm=True)
for word in malist:
    if word[1] not in ["Punctuation"]:
        words.append(word[0])
    if word[0] == ",":
        words.append(word[0])
three_dic(words)
json.dump(word_dic ,open('markov.json','w',encoding ='utf-8'))


import json

text = json.load(open('markov.json','r'))

print(text["걱정"],end="\n")