본문 바로가기

Project Log/CommentTeller

배포 재도전기 - ETRI 형태소 분석 API사용

배포해보려고 heroku에서도 시도해봤지만 역시나 같은 라이브러리 문제(라이브러리 자체 문제는 아니고 찾아보니 동적로드 라이브러리 관련한 문제인 것 같다.)로 실패했다.

어떻게 방법이 없을까 하다가 한국전자통신 연구원에서 제공하고 있는 형태소 분석을 API를 사용해보기로 했다. 하루에 5000건만 호출할 수 있으며, 1회 호출 시 입력이 1만 글자 미만까지만 요청이 가능하다.

사용방법은 홈페이지에 자세하게 가이드가 나와있다. 먼저 API key발급 요청을 하면 메일로 보내주시는데, API 요청할 때 request body에 json형태로 보내면 된다. 나 같은 경우에는 형태소 분석 서비스를 이용할 것이기 때문에 analysis_code에 morp를 넣어주었다.

 

{
  "access_key": "YOUR_APP_KEY",
  "argument": {
  "analysis_code": "morp",
  "text": "윤동주(尹東柱, 1917년 12월 30일 ~ 1945년 2월 16일)는 한국의 독립운동가, 시인, 작가이다."
  }
}

시험 삼아 위의 텍스트로 테스트를 해보았다. 

"morp": [
  {
    "id": 0.0,
    "lemma": "윤동주",
    "type": "NNP",
    "position": 0.0,
    "weight": 0.9
  },
  {
    "id": 1.0,
    "lemma": "(",
    "type": "SS",
    "position": 9.0,
    "weight": 1.0
  },
  {
    "id": 2.0,
    "lemma": "尹東柱",
    "type": "SH",
    "position": 10.0,
    "weight": 1.0
  },
  {
    "id": 3.0,
    "lemma": ",",
    "type": "SP",
    "position": 19.0,
    "weight": 1.0
  },
  {
    "id": 4.0,
    "lemma": "1917",
    "type": "SN",
    "position": 21.0,
    "weight": 1.0
  },
  {
    "id": 5.0,
    "lemma": "년",
    "type": "NNB",
    "position": 25.0,
    "weight": 0.414343
  },
  {
    "id": 6.0,
    "lemma": "12",
    "type": "SN",
    "position": 29.0,
    "weight": 1.0
  },
  {
    "id": 7.0,
    "lemma": "월",
    "type": "NNB",
    "position": 31.0,
    "weight": 0.408539
  },
  {
    "id": 8.0,
    "lemma": "30",
    "type": "SN",
    "position": 35.0,
    "weight": 1.0
  },
  {
    "id": 9.0,
    "lemma": "일",
    "type": "NNB",
    "position": 37.0,
    "weight": 0.126777
  },
  {
    "id": 10.0,
    "lemma": "~",
    "type": "SO",
    "position": 41.0,
    "weight": 1.0
  },
  {
    "id": 11.0,
    "lemma": "1945",
    "type": "SN",
    "position": 43.0,
    "weight": 1.0
  },
  {
    "id": 12.0,
    "lemma": "년",
    "type": "NNB",
    "position": 47.0,
    "weight": 0.414343
  },
  {
    "id": 13.0,
    "lemma": "2",
    "type": "SN",
    "position": 51.0,
    "weight": 1.0
  },
  {
    "id": 14.0,
    "lemma": "월",
    "type": "NNB",
    "position": 52.0,
    "weight": 0.408539
  },
  {
    "id": 15.0,
    "lemma": "16",
    "type": "SN",
    "position": 56.0,
    "weight": 1.0
  },
  {
    "id": 16.0,
    "lemma": "일",
    "type": "NNB",
    "position": 58.0,
    "weight": 0.126777
  },
  {
    "id": 17.0,
    "lemma": ")",
    "type": "SS",
    "position": 61.0,
    "weight": 1.0
  },
  {
    "id": 18.0,
    "lemma": "는",
    "type": "JX",
    "position": 62.0,
    "weight": 0.00823314
  },
  {
    "id": 19.0,
    "lemma": "한국",
    "type": "NNP",
    "position": 66.0,
    "weight": 0.0448181
  },
  {
    "id": 20.0,
    "lemma": "의",
    "type": "JKG",
    "position": 72.0,
    "weight": 0.0987295
  },
  {
    "id": 21.0,
    "lemma": "독립",
    "type": "NNG",
    "position": 76.0,
    "weight": 0.9
  },
  {
    "id": 22.0,
    "lemma": "운동",
    "type": "NNG",
    "position": 82.0,
    "weight": 0.9
  },
  {
    "id": 23.0,
    "lemma": "가",
    "type": "XSN",
    "position": 88.0,
    "weight": 1.15417E-4
  },
  {
    "id": 24.0,
    "lemma": ",",
    "type": "SP",
    "position": 91.0,
    "weight": 1.0
  },
  {
    "id": 25.0,
    "lemma": "시인",
    "type": "NNG",
    "position": 93.0,
    "weight": 0.530736
  },
  {
    "id": 26.0,
    "lemma": ",",
    "type": "SP",
    "position": 99.0,
    "weight": 1.0
  },
  {
    "id": 27.0,
    "lemma": "작가",
    "type": "NNG",
    "position": 101.0,
    "weight": 0.531481
  },
  {
    "id": 28.0,
    "lemma": "이",
    "type": "VCP",
    "position": 107.0,
    "weight": 0.0177525
  },
  {
    "id": 29.0,
    "lemma": "다",
    "type": "EF",
    "position": 110.0,
    "weight": 0.353579
  },
  {
    "id": 30.0,
    "lemma": ".",
    "type": "SF",
    "position": 113.0,
    "weight": 1.0
  }
]

테스트 문장에는 숫자나 한자, 특수문자가 들어갔지만 실제로 API요청을 보낼 때는 한글을 제외한 문자는 공백으로 바꿔서 순수 한글만 보낼 것이다. 내가 필요한 건 명사이기 때문에 분석된 단어들 중의 NNG(일반명사), NNP(고유명사) 태그만 찾으면 된다. 년, 월, 일 과 같은 NNB(의존 명사)는 제외한다.

 

그런데 한글을 제외한 문자를 모두 공백으로 바꿔서 보내봤더니 형태소 분석이 제대로 되지 않았다.

 

한글을 제외한 문자를 공백으로 바꿔보낸 모습(한식대첩 댓글)


라이브러리 사용할 때는 신조어나 인터넷 용어만 제대로 분석하지 못했는데 이번에는 아예 제대로 인식하지 못하는 것 같다. 일일 요청 제한이 있어서 요청할 때 글자 수도 아낄 겸 바꿔 보냈는데... 그래서 한글 외 문자를 공백으로 처리하는 메서드를 쓰지 않고, 특수문자만 정규식으로 공백 처리한 다음에 배열로 받은 댓글을 문자열로 붙여서 API요청을 보내보았다.

 

적어도 아까보단 '명사'를 보여주기는 하는데 확실히 라이브러리를 썼을 때보다 명사로 분석되는 개수도 훨씬 적고 그마저도 제대로 분석하지 못하는 것 같다. 이번에는 댓글 3,000개가 넘는 동영상으로 돌렸더니 명사 개수가 늘어나긴 함

속도면에 있어서는 라이브러리를 썼을 때 일단 댓글 개수가 1,000개가 넘어가면서부터 굉장히 오래 기다려야했는데, 댓글 3,000개인데도 양호한 것 같다.

 

프로젝트 후기에 썼었던 세계견문록 아틀라스 - 하노이편을 돌려보았다.

눼...?ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 후...댓글의 개수도 위의 동영상에 비해 현저히 적은데다가, 그마저도 제대로 분석하지 못하는 것 같다.

잘은 모르겠지만 라이브러리로 사용한 형태소 분석은 공백 상관없이 어느정도는 사전 데이터로 가지고 있는 명사 데이터에 단어가 일치하면 명사로 인식해서 반환해주고, 지금 사용해본 API는 아무래도 문장의 공백이 형태소분석에 영향을 많이 미치는 것 같다. 궁금해서 문의를 해놓긴 했는데 답변이 오면 확인해봐야겠다. 이걸 배포를 해야하나말아야하나...ㅠㅠ