Yours Ever, Data Chronicles

파이썬 자연어 처리(NLP) - 코사인 유사도를 활용해 유사한 문장 찾기 & 책 마무리 본문

Data Science/Analysis Study

파이썬 자연어 처리(NLP) - 코사인 유사도를 활용해 유사한 문장 찾기 & 책 마무리

Everly. 2022. 5. 19. 13:34

안녕하세요, Everly입니다 :)

오늘은 [파이썬 데이터 분석 실무 테크닉 100] 책의 가장 마지막 부분입니다.

저번 포스팅에서 원핫 인코딩을 활용해 문장을 숫자로 수치화했습니다. 이렇게 수치화한 데이터를 활용하여 유사한 문장을 찾아보겠습니다.

 

✔Table of Contents

     

    Tech 100. 비슷한 설문응답을 찾아보자. (코사인 유사도, cosine similarity)

    마지막 100번째 테크닉입니다! 거의 다 왔습니다 😉

    바로 직전 테크닉인 Tech 99에선 각 인덱스 문장에 들어있는 단어들로 단어가 포함되면 1, 아니면 0으로 나타내는 데이터프레임 'all_word' 를 만들었는데요.

     

    여기서 특정 문장 A와 비슷한 문장 B를 찾아봅시다. 

    여기서 사용하는 것은 코사인 유사도(cosine similarity) 인데요!

    코사인 유사도(출처: 위키백과)

     

    코사인 유사도란 내적공간의 두 벡터 간 각도의 코사인값을 이용해, 측정된 벡터 간 유사한 정도를 의미합니다.

    우리가 지금 하고 있는 자연어 처리(NLP) 분야에서 굉장히 자주 쓰이는 방법인데요, 이 코사인 유사도를 이용하면 두 문장 간 코사인값을 이용해 유사도(similarity)를 계산할 수 있습니다.

     

    코사인 유사도 값은 위에 나온 수식을 그대로 코드로 변환하여 계산합니다. 

     

    우선, 타깃이 되는 타깃 의견을 선정해봅시다. 저번 포스팅에서 '육아' 라는 단어가 들어간 의견은 만족도가 높았습니다. 

    그래서 '육아' 키워드를 포함하는 의견을 타깃(target)으로 선정하겠습니다.

     

    sur.head()

     

    2번 인덱스 의견인 "육아 지원이 좋다" 를 target으로 설정합니다. 이 문장을 숫자로 나타내면 어떻게 나올까요?

     

    #두번째 인덱스 '육아 지원이 좋다'를 위 all_word에서 뽑아보자.
    target_text = all_word.iloc[2]
    print(target_text)

     

    all_word 데이터프레임에서 2번째 인덱스를 뽑아보면 위와 같이 나오게 됩니다.

    이제, 이 2번째 인덱스 문장과 가장 유사한 문장을 뽑아봅니다.

    all_word 데이터 프레임에서 2번째 문장과의 코사인 유사도를 계산하고, 이를 새로운 열 'cos_sim'에 넣겠습니다.

     

    #유사도 검색: 대표적인 기법 코사인 유사도를 사용
    import numpy as np
    cos_sim = []
    
    for i in range(len(all_word)):
        cos_text = all_word.iloc[i] 
        #코사인 유사도의 식 활용
        cos = np.dot(target_text, cos_text) / (np.linalg.norm(target_text) * np.linalg.norm(cos_text))
        cos_sim.append(cos)
        
    all_word['cos_sim'] = cos_sim
    all_word.head()

     

    2번 문장(target_text)과 all_word의 모든 문장(cos_text)에 대해 코사인 유사도를 계산합니다.

    계산한 값은 'cos' 이며, 리스트 'cos_sim'에 담깁니다.

    이 리스트를 all_word의 새로운 컬럼으로 넣었는데, 결과는 어떻게 나올까요?!

     

     

    우선 2번 문장은 자기 자신과의 유사도이므로 당연히 cos_sim 값이 1이죠.

    2번 문장 주변의 문장들은 유사도가 0이므로, cos_sim 값을 정렬해봅시다.

     

    #cos_sim 기준으로 sorting
    all_word.sort_values(by = 'cos_sim', ascending= False)

     

    2번 문장과 가장 유사도가 높은 문장은 15번(유사도 0.7), 24번(유사도 0.5) 입니다.

    이 의견들이 뭔지 궁금하네요! 인덱싱을 해보면:

     

    #각각 15번, 24번 의견
    print(sur['comment'].iloc[15])
    print(sur['comment'].iloc[24])

     

    이렇게 해서 타겟 의견이었던 "육아 지원이 좋다" 와 유사도가 높은 의견은

    "육아가 쉽다"와 "육아하기에는 최고" 이 2가지 의견이었습니다.

    다양한 유사도 계산법이 있는데, 가장 간단한 유사도인 코사인 유사도를 썼는데도 어느정도 비슷한 문장을 추출하였네요! 

     


    마무리하며

    이렇게 해서 [파이썬 데이터 분석 실무 테크닉 100]의 Tech 1부터 Tech 100까지 모든 기술을 마무리하였습니다!

    데이터 분석을 실무에서 어떻게 분석하는지에 대한 감이 없으신 분들(처음 데이터 분석 직무를 시작하시는 분들)께 강력하게 추천해드리고 싶은 책입니다 😀

    저는 개인적으로 정말 잘 샀다고 생각합니다,, 제 포스팅을 보고 이 책 괜찮은데? 싶으면 구매하는거 강추드립니다! 🙌

     

    책의 예제를 그대로 따라하시는 것도 좋지만, 어느 정도 실력이 있으시면 책에 나온 코드를 따라하지 않고 직접 짜본다거나, 책에 나온 분석 그 이상까지도 해보시면 좋겠다는 생각이 듭니다. (저자분도 이런 걸 장려하기 위해 일부러 코드를 장황하게 짠 경우도 있다고 책에서 말씀하시더라구요!ㅋㅋ 저도 책에 나온 그대로 하지 않고 더 심화해보기도 했고, 책에 나오지 않은 부분까지 공부하면서 실력향상에 도움이 많이 되었던 것 같아요!)

    더 디테일한 설명 + 부록으로 제공되는 추가 내용 등은 책에서 찾아보면 좋을 것 같습니다. (예제 데이터 분석 코드는 깃허브로 무료로 제공되고 있습니다. 밑에 첨부해둘게요!)

     

     

    책의 1장~8장까지는 딱 실무 위주의 데이터 분석(Data Analysis)으로, 여러 분석 기법(전처리, groupby, plotting(시각화), 머신러닝(회귀, 분류), 최적화, 시뮬레이션)을 다뤄보았습니다.

     

    나머지 9장과 10장은 각각 이미지/동영상 처리, 자연어 처리(NLP)로 AI 기술과 관련한 내용을 다뤘습니다.

    9,10장의 내용은 기초적인 내용이므로 흥미가 생기셨다면 더 전문성있는 책이나 강의로 공부해보시길 추천드려요!! (4, 5장의 머신러닝 부분도요!)

     


    책에서 사용한 데이터와 예제 코드는 저의 깃허브(Github)에서 확인하실 수 있습니다.

     

    GitHub - suy379/Python_tech100: Summarize what I learned after studying the book, 『Python Data Analysis Practice Tech 100』

    Summarize what I learned after studying the book, 『Python Data Analysis Practice Tech 100』 - GitHub - suy379/Python_tech100: Summarize what I learned after studying the book, 『Python Data Analysis ...

    github.com

     

    코드는 주피터 노트북(Jupyter Notebook)으로 작성하였으며, 여기에도 설명을 함께 덧붙여 놓았습니다.

    하지만 블로그에 쓴 포스팅이 더 자세하므로 설명이 빈약한 것 같으면 제 블로그 게시글을 참고하시면 좋을 듯 합니다 :)

     

    책에서 나온 데이터와 예제 코드는 위키북스에서 [pyda100] 깃허브로도 제공하고 있습니다!

     

    GitHub - wikibook/pyda100: 《파이썬 데이터 분석 실무 테크닉 100》 예제 코드

    《파이썬 데이터 분석 실무 테크닉 100》 예제 코드. Contribute to wikibook/pyda100 development by creating an account on GitHub.

    github.com

     

    포스팅 읽어주신 모든 분들께 감사드립니다.

    오늘도 즐거운 코딩 & 분석 하시길 🎈

    반응형