본문 바로가기
분류없음

fasttext with khaiii 학습 리포트 (작성중)

by xenophilius 2019.04.12

시작

 

일단 해 보기

fasttext로 word2vec를 만들어보면 한글은 그저 공백을 단위로 토크나이징 하고 있다는 걸 알 수 있습니다.

형태소 단위로 분리하지 않고 그대로 학습 할 경우 아래와 같은 결과가 나옵니다. '세일'의 Nearest Neighbor를 찾은 것입니다.

 

세일
세일에
세일로
세일할
세일가

사람은 단어를 읽으면 의미를 파악하지만 머신은 '세일에'와 '세일로'를 데이터 관점에서 보기 때문에 두 단어는 분명히 다른 단어입니다. 세일과 비슷한 단어로 '세일에', '세일로'... 등이 나오는 결과는 그다지 바람직하지 못합니다. 아래는 형태소 분석기로 토크나이징 한 뒤 '세일'의 Nearest Neighbor를 찾은 결과입니다.

세일
할인
세일좀
행사
세일때

'세일좀', '세일때'와 같이 토크나이징이 제대로 되지 못해 여전히 이상한 단어가 등장하긴 하지만 '할인'과 '행사'라는 보다 합리적인 키워드가 제시되었습니다. 형태소 분석이 정말로 효과가 있는지 조금 더 실험해 보겠습니다. 

 

형태소 분리

해외
Raw Model Tokenized Model
필오프팩 미국
미니 외국
미니멈 대행
덕후 해외갈때

 

어퓨
Raw Model Tokenized Model
어퓨야 미샤
어퓨를 립플
어퓨로 카모
어퓨에 에뛰드

 

역시 토크나이징한 모델이 더 나은 결과를 보여주고 있습니다. 특히 Raw Model은 약 700만 개의 문장을 학습했고 Tokenized Model은 약 50만 개가량 학습했음에도 불구하고 극명한 차이를 보여주고 있습니다. 특히 화장품 업체 ‘어퓨’의 NN을 찾아보니 동종 업계의 ‘미샤’와 ‘에뛰드’가 나온 결과는 놀라웠습니다. 


물론 제대로 토크나이징이 되지 않았을 경우 Tokenized Model도 ‘해외갈때’와 같은 결과를 보여주는데 이는 아마 학습할 때 리뷰 데이터 자체의 띄어쓰기가 제대로 되어 있지 않아 Khaiii가 Tokenzing을 제대로 못 한 것으로 보였습니다. 

 

한 가지 재미있는 현상은 '냉면'의 NN을 찾아보니 커피, 빵, 햄버거 등의 음식이 나옵니다는 것입니다. 여자들은 화장품 리뷰를 하는 와중에도 먹는 이야길 빼놓질 않는다는 통찰을 얻을 수 있는 부분입니다.(?) 삼겹살, 빵, 과자, 음료수... 다양하게 나오더군요. 또 로맨스 영화의 댓글들을 학습 해 보니 '남자'의 NN은 '미친놈', '여자'의 NN은 '답답함'이라는 재미있는 결과도 얻을 수 있었습니다. 요약하면 사랑에서 남자는 미친놈이고 여자는 답답하다는 것이군요.

 

냉면
커피잔
빵먹
커피
햄버거

 

음소분리

형태소 분리가 분명한 효과를 보인다는 것을 Nearest Neighbor를 찾는 실험을 통해 확인할 수 있었습니다. 더 나아가서 한글을 아예 조각조각 분리해 본다면 어떨까요? 

 

이것은 특히 외국어처럼 표기가 다양한 경우에 좋은 결과를 보입니다. 예를 들어 Youtube를 한글로 표기하면 어떤 사람들은 '유튜브'라고 하지만 또 어떤 사람은 '유투브', '유튭' 등으로 다양하게 씁니다. 국립국어원이 정한 표준이 있지만 어쨌든 사람들은 그걸 다 지켜주지는 않죠. 

 

예를 들면 아래와 같습니다. 문장을 모두 음소 분리하면 이렇게 될 것입니다.

 

원래 문장 Decomposed
이게 순위권에 꽤 많아서 놀람 비추요 ㅇㅣㄱㅔ ㅅㅜㄴㅇㅟㄱㅝㄴㅇㅔ ㄲㅙ ㅁㅏㄶㅇㅏㅅㅓ ㄴㅗㄹㄹㅏㅁ ㅂㅣㅊㅜㅇㅛ
약해서 마무리 감이 찜찜함 ㅇㅑㄱㅎㅐㅅㅓ ㅁㅏㅁㅜㄹㅣㄱㅏㅁㅇㅣ ㅉㅣㅁㅉㅣㅁㅎㅏㅁ

 

 

제발을 오타 하여 '젭라'라고 한 경우가 종종 있을 것입니다. 

젭라
Decomposed Not decomposed
제발ㅠㅠ 걱정했
젭알 의외로
내놔라 기대
제발 실망
  걱정

 

모델 공유

fasttext로 또 재밌게 놀아 보실 분들을 위해 제가 학습한 모델을 공유합니다. 모델은 GlowPick이라는 화장품 리뷰 사이트의 리뷰를 학습한 것입니다.

 

 

rumoarf/ReviewModels

Contribute to rumoarf/ReviewModels development by creating an account on GitHub.

github.com

 

댓글13

  • 라노 2019.06.01 05:14

    제가 지금 페이스북에서 공개한 위키 학습판 한글 벡터를 다운 받고 있는데, 혹시 그게 저런 식으로 공백을 단위로 학습되어 있다는 말씀이신가요?? 이걸로 중요한 프로젝트 하나 뚝딱 해버리려고 했는데 ㅠㅠㅠ 으아아ㅏ
    답글

    • xenophilius 2019.06.01 15:00 신고

      그런 것으로 알고 있습니다. ㄷㄷ. 페이스북에서 공개한 위키 학습판 한글 벡터는 보지 않아서 모르겠습니다만... 같은 ICU 토크나이저를 사용해서 학습했다면 거의 단순한 공백으로 가고 있겠지요?

  • 궁금합니다 2019.06.02 17:07

    hart에 대해서 궁금한게 있어서 이렇게 질문을 올리게됩니다.
    문장에 대한 감성결과를 나타낼때 주어진 문장을 형태소 단위로 나눠서 감성사전과 매칭해서 있는 것은 사전의 감성 점수를 사용하고 사전에 없는 형태소의 경우에는 학습된 모델을 가지고 준지도학습해서 점수를 결정하고 각각 형태소마다 주어진 점수를 바탕으로 감성결과를 내는 것인지 궁금해서 질문을 드리게되었습니다.
    답글

  • 한승호 2019.06.25 15:29

    안녕하세요. 좋은 글 감사합니다. 혹시 자모 단위로 나눈 뒤 ngram을 어떤 방식으로 구성하셨는지 알 수 있을까요?
    그리고 혹시 fasttext모델을 이용하여 NN은 어떻게 찾을 수 있었는지요?
    감사합니다.
    답글

  • 한승호 2019.07.03 03:55

    안녕하세요, 답변 감사드립니다.
    혹시 window size는 몇으로 설정하셨는지요?
    또한 학습 시 다른 hyperparameter tuning은 어떻게 진행하셨는지 궁금합니다
    답글

    • xenophilius 2019.07.03 11:43 신고

      정확히 어땠는지 기록을 해 두지 않아서 잘 모르겠네요... 학습 후 evaluation이 더 높은 결과의 모델이 나올 때 까지 learning curve와 epoch등을 조절 하도록 자동화 했습니다.

    • 한승호 2019.07.04 04:32

      정말 감사합니다. 덕분에 많은 도움 되었습니다. fasttext 학습용 txt파일을 구성하실 때, khaiii에서 분석된 토큰들을 띄어쓰기로 구분하도록 하셨나요? 예를 들어 '안녕하세요' -> '안녕 하 시 어요' 이런 식으로 전처리를 진행하셨나요?

    • xenophilius 2019.07.04 14:23 신고

      글 처음에 소개한 형태소 분리에서는 말씀하신대로 '안녕 하 시 어요'로 처리 했습니다. 이후에 다시 음소로 분리해 'ㅇㅏㄴ+ㄴㅕㅇ+ ㅎㅏ....' 이런식으로 했습니다. 중간의 플러스 기호는 종성임을 구분하기 위해서 제가 임의의 기호를 넣었습니다. 예컨대 'ㅇㅏㄴㄴㅕㅇ'은 '안녕'도 되지만 '아ㄴ녕'으로 해석 될 수도 있기 때문입니다.

    • xenophilius 2019.07.04 14:25 신고

      아직 작성중인 글이라 많이 부족한데 감사합니다.

  • 감사합니다 2019.09.08 17:31

    그럼 음소분리해서 그 걸 텍스트파일로 만들고 그 텍스트 파일을 학습시킨건가요? 음소분리후 학습 진행 과정 등에 대해서 좀만더 추가가능할까요 ㅠㅠ
    답글

    • xenophilius 2019.09.08 20:33 신고

      네 그렇게 됩니다. 시간이 나지 않아 글을 더 추가 할 기회가 없었네요. 윗 댓글에도 비슷한 질문을 주신 분이 있어 답을 달아 두었습니다