본문 바로가기

IT

모델링 - 문장과 문장간의 유사도 검색 모델(Gensim)

반응형

환경세팅

# NLP 라이브러리 - 문장과 문장의 유사도를 측정해줌.
import gensim
# 태그해주는 라이브러리 - 문장에 어떤 단어 형식의 태그를 만들어준다.
from konlpy.tag import Twitter
# 외부 라이브러리 설치(Jupyter Notebook 환경)
!pip install gensim
!pip install Twitter
# 내가 추출하고자 하는 단어의 타입 (ex, 명사, 외래어, 알파벳)
possible_type = ['Noun','Foreign','Unknown','Hashtag','Alpha']

# 태깅처리된 object 담을 리스트
tag_data = []
# 말씀과 사용자의 고민을 담아줄 리스트
sentence = [] 

데이터 셋 구축

# 감사
sentence.append(("아침과 저녁마다 서서 여호와께 감사하고 찬송하며","감사"))
sentence.append(("주여 내가 만민 중에서 주께 감사하오며 뭇 나라 중에서 주를 찬송하리이다","감사"))
sentence.append(("감사함으로 그의 문에 들어가며 찬송함으로 그의 궁정에 들어가서 그에게 감사하며 그의 이름을 송축할지어다","감사"))
sentence.append(("우리가 우리 하나님 앞에서 너희로 말미암아 모든 기쁨으로 기뻐하니 너희를 위하여 능히 어떠한 감사로 하나님께 보답할까","감사"))
sentence.append(("의인이여 너희는 여호와로 말미암아 기뻐하며 그의 거룩한 이름에 감사할지어다","감사"))
sentence.append(("항상 기뻐하라 쉬지 말고 기도하라 범사에 감사하라 이것이 그리스도 예수 안에서 너희를 향하신 하나님의 뜻이니라","감사"))
sentence.append(("범사에 우리 주 예수 그리스도의 이름으로 항상 아버지 하나님께 감사하며","감사"))

#건강
sentence.append(("주는 나를 용서하사 내가 떠나 없어지기 전에 나의 건강을 회복시키소서","건강"))
sentence.append(("이르되 큰 은총을 받은 사람이여 두려워하지 말라 평안하라 강건하라 강건하라 그가 이같이 내게 말하매 내가 곧 힘이 나서 이르되 내 주께서 나를 강건하게 하셨사오니 말씀하옵소서","건강"))
sentence.append(("스스로 지혜롭게 여기지 말지어다 여호와를 경외하며 악을 떠날지어다 8 이것이 네 몸에 양약이 되어 네 골수를 윤택하게 하리라","건강"))
sentence.append(("사랑하는 자여 네 영혼이 잘됨 같이 네가 범사에 잘되고 강건하기를 내가 간구하노라 ","건강"))
sentence.append(("너는 알지 못하였느냐 듣지 못하였느냐 영원하신 하나님 여호와, 땅 끝까지 창조하신 이는 피곤하지 않으시며 곤비하지 않으시며 명철이 한이 없으시며 29 피곤한 자에게는 능력을 주시며 무능한 자에게는 힘을 더하시나니 30 소년이라도 피곤하며 곤비하며 장정이라도 넘어지며 쓰러지되 31 오직 여호와를 앙망하는 자는 새 힘을 얻으리니 독수리가 날개치며 올라감 같을 것이요 달음박질하여도 곤비하지 아니하겠고 걸어가도 피곤하지 아니하리로다","건강"))

#게으름
sentence.append(("게으른 자여 개미에게 가서 그가 하는 것을 보고 지혜를 얻으라","게으름"))
sentence.append(("손을 게으르게 놀리는 자는 가난하게 되고 손이 부지런한 자는 부하게 되느니라","게으름"))
sentence.append(("부지런한 자의 손은 사람을 다스리게 되어도 게으른 자는 부림을 받느니라 ","게으름"))
sentence.append(("게으른 자의 길은 가시 울타리 같으나 정직한 자의 길은 대로니라","게으름"))
sentence.append(("문짝이 돌쩌귀를 따라서 도는 것 같이 게으른 자는 침상에서 도느니라 15 게으른 자는 그 손을 그릇에 넣고도 입으로 올리기를 괴로워하느니라 16 게으른 자는 사리에 맞게 대답하는 사람 일곱보다 자기를 지혜롭게 여기느니라 ","게으름"))

#연애
sentence.append(("그런즉 이제 둘이 아니요 한 몸이니 그러므로 하나님이 짝지어 주신 것을 사람이 나누지 못할지니라 하시니","연애"))
sentence.append(("여호와 하나님이 이르시되 사람이 혼자 사는 것이 좋지 아니하니 내가 그를 위하여 돕는 배필을 지으리라 하시니라","연애"))
sentence.append(("그리스도를 경외함으로 피차 복종하라","연애"))
sentence.append(("그러므로 사람이 부모를 떠나 그의 아내와 합하여 그 둘이 한 육체가 될지니 32 이 비밀이 크도다 나는 그리스도와 교회에 대하여 말하노라 33 그러나 너희도 각각 자기의 아내 사랑하기를 자신 같이 하고 아내도 자기 남편을 존경하라","연애"))
sentence.append(("말씀하시기를 그러므로 사람이 그 부모를 떠나서 아내에게 합하여 그 둘이 한 몸이 될지니라 하신 것을 읽지 못하였느냐","연애"))
sentence.append(("남편들아 이와 같이 지식을 따라 너희 아내와 동거하고 그를 더 연약한 그릇이요 또 생명의 은혜를 함께 이어받을 자로 알아 귀히 여기라 이는 너희 기도가 막히지 아니하게 하려 함이라","연애"))

#고난
sentence.append(("그리스도가 이런 고난을 받고 자기의 영광에 들어가야 할 것이 아니냐 하시고","고난"))
sentence.append(("자녀이면 또한 상속자 곧 하나님의 상속자요 그리스도와 함께 한 상속자니 우리가 그와 함께 영광을 받기 위하여 고난도 함께 받아야 할 것이니라","고난"))
sentence.append(("생각하건대 현재의 고난은 장차 우리에게 나타날 영광과 비교할 수 없도다 ","고난"))
sentence.append(("오히려 너희가 그리스도의 고난에 참여하는 것으로 즐거워하라 이는 그의 영광을 나타내실 때에 너희로 즐거워하고 기뻐하게 하려 함이라","고난"))
sentence.append(("만일 그리스도인으로 고난을 받으면 부끄러워하지 말고 도리어 그 이름으로 하나님께 영광을 돌리라","고난"))
sentence.append(("너희 중에 고난 당하는 자가 있느냐 그는 기도할 것이요 즐거워하는 자가 있느냐 그는 찬송할지니라","고난"))
sentence.append(("네가 고난 중에 부르짖으매 내가 너를 건졌고 우렛소리의 은밀한 곳에서 네게 응답하며 므리바 물 가에서 너를 시험하였도다","고난"))
sentence.append(("내가 환난 중에 여호와께 부르짖었더니 내게 응답하셨도다","고난"))

# 고통
sentence.append(("너희는 너희를 모든 재난과 고통 중에서 친히 구원하여 내신 너희의 하나님을 오늘 버리고 이르기를 우리 위에 왕을 세우라 하는도다 그런즉 이제 너희의 지파대로 천 명씩 여호와 앞에 나아오라 하고 ","고통"))
sentence.append(("다윗이 갓에게 이르되 내가 고통 중에 있도다 청하건대 여호와께서는 긍휼이 크시니 우리가 여호와의 손에 빠지고 내가 사람의 손에 빠지지 아니하기를 원하노라 하는지라","고통"))
sentence.append(("여호와여 내가 고통 중에 있사오니 내게 은혜를 베푸소서 내가 근심 때문에 눈과 영혼과 몸이 쇠하였나이다","고통"))
sentence.append(("이에 그들이 근심 중에 여호와께 부르짖으매 그들의 고통에서 건지시고","고통"))
sentence.append(("이에 그들이 그 환난 중에 여호와께 부르짖으매 그들의 고통에서 구원하시되","고통"))
sentence.append(("내가 고통 중에 여호와께 부르짖었더니 여호와께서 응답하시고 나를 넓은 곳에 세우셨도다","고통"))

User Input 값을 "고민"이라는 태그로 배열에 추가

user_input = "요즘 취업준비 하는 것 때문에 너무 두렵도 힘들어요. 이 기간이 언제 끝날지 모르겠지만, 그래도 하나님께서 항상 제 길을 인도해주신다는 것을 믿어요\
저의 이 시간이 빨리 끝났으면 좋겠어여"

sentence.append((user_input,"고민"))

 

말씀 & 고민에 태깅처리를 해주고, tagged 라는 리스트에 담는다.

for record in sentence:
    print(record[0])
    twitter = Twitter()
    twitter_p = twitter.pos(record[0])
    arr_ = []
    for tmp in twitter_p:
        if tmp[1] in possible_type:
            if False == False : arr_.append(tmp[0])
            else : arr_.append(tmp[0]+'/'+tmp[1])
            
    words = arr_
    tag_data.append(gensim.models.doc2vec.TaggedDocument(words,[record[1]]))

사용할 gensim 모델 생성

model = gensim.models.doc2vec.Doc2Vec(vector_size=10, epochs=2)

Gensim 모델 vocabulary 생성(look-up table 느낌으로 해석하면 됨)

model.build_vocab(tag_data)

모델 학습

model.train(tag_data, total_examples=model.corpus_count, epochs=model.epochs)

고민 예측

n = len(model.docvecs)
Score = model.docvecs.most_similar("고민", topn=n)

점수 확인

print(Score)
반응형