Coder Social home page Coder Social logo

ko_restoration's Introduction

ko_restoration

형태소분석기 KomoranPy과 연동되는 한국어 원형복원 로직입니다. Komoran은 자바 기반 한국어 형태소 분석기로, 파이썬 버전은 자연어처리 모듈인 konlpy에도 포함되어 있으며 기본 사전의 엔트리 수가 많고 이용자 추가 사전 기능을 지원하고 있어 성능이 상당히 좋습니다. (KomoranPy github: https://github.com/shineware/komoranPy_2.0)

일반적으로 형태소분석 결과는 어미가 잘린 형태로 반환되어 이후 후처리에 어려움이 많습니다. 기초적인 텍스트 분석 프로젝트에서는 형태소분석 후 후처리 없이 명사, 동사, 형용사 등 특정 pos tag를 가진 단어들만 이후 분석에 사용하는 경우가 많은데 이 경우 단어가 지나치게 분할되어 의미를 파악하기 어렵게 됩니다.

  • 본 원형복원 로직은 이러한 문제를 해결하고자 아래 다섯 가지 측면에 초점을 맞추어 제작되었습니다.

    1. 용언의 어미 복원

      • ex. 들다: '들/VV' -> 원형복원 결과 '들다'
    2. 복합명사, 복합동사 등이 잘리지 않도록 병합

      • ex. 들어올리다: '들/VV + 어/EC + 올리/VV + 다/EC'(들, 올리) -> 원형복원 결과 '들어올리다'
      • ex. 기상전문기자: '기상/NNG + 전문/NNG + 기자/NNG'(기상, 전문, 기자) -> 원형복원 결과 '기상전문기자'
      • 복합단어의 경우 중간에 띄어쓰기가 있는 경우에도 규칙을 통해 동일하게 합쳐지도록 함. 즉 '들어올리다'와 '들어 올리다'의 원형복원 결과가 동일함
    3. 한국어 불규칙 변형 규칙을 적용

      • 형태소분석 결과 자체가 제대로 나오지 않는 'ㅎ 탈락' 규칙을 제외하고 'ㅅ, ㅂ, ㄷ 탈락', 'ㅡ' 불규칙 등을 반영하여 복합단어를 병합
      • ex. 구워주었다: '굽/VV + 어/EC + 주/VX + 었/EP + 다/EC'(굽, 주) -> 원형복원 결과 '구워주다'
    4. '수', '지', '때문'의 연결

      • '~ 수 없다', '지 모르다', ' 때문이다' 등의 표현이 잘리지 않도록 '_'를 이용하여 연결
      • ex. 날씨 때문이다: '날씨/NNG + 때문/NNB + 이/VCP + 다/EC'(날씨) -> 원형복원 결과 '날씨_때문'
    5. 부정어의 연결

      • ~ 아니다, ~없다 등의 부정 표현이 잘리지 않도록 '_'를 이용하여 연결
      • ex. 애정이 없다: '애정/NNG + 이/JKS + 없/VA + 다/EC'(애정, 없) -> 원형복원 결과 '애정_없다'
  • 한국어 전공자 지인의 검수를 받았으며, 수정 의견이나 오류 지적은 언제든지 환영입니다.

  • 개별 형태소의 순서에 따라 원형이 복원되므로 input text의 문법이 잘 지켜질수록 복원 성능이 좋아집니다.(다양한 텍스트로 테스트한 결과, 문어체의 글이나 뉴스기사는 거의 완벽하고 트윗이나 댓글은 문법 파괴가 심할수록 성능이 내려갑니다. 그러나 텍스트 corpus 전체의 양이 많으면 복원 오류 단어들은 큰 영향이 없었습니다.)

  • 문법의 오류보다 복원 성능에 더 영향을 미치는 것은 신조어인 듯합니다. 복원 오류 단어들의 대부분이 형태소분석기 자체에서 제대로 parsing하지 못하는 경우입니다. 결과를 여러 번 확인하며 이용자 사전에 충분한 단어를 추가하는 것을 추천드립니다.

  • Komoran 형태소 분석기는 2016년 중순 3.0 베타 버전이 배포되었습니다. 본 코드는 2.0에서 테스트하였지만 형태소분석기의 return값 타입이 변하지 않았다면 그대로 적용 가능할 것으로 보입니다. restoration.py 스크립트의 komoran_processing 함수만 따로 떼어 input을 Komoran 분석 결과로 넣으면 됩니다.

Requirements

  • This module supports >= python3.4
  • Python -- all of the following::

Additional files

  • complex_verb.txt: 복합단어 처리 시 후순에 올 수 있는 용언 목록
  • ko_ascii_code.txt: 한국어로 가능한 글자의 아스키 코드 목록
  • original_userdic.txt, proper_noun.txt: 단어만 넣어 두면 자동으로 main.py 실행 시 Komoran의 이용자 사전에 추가됨. 현재는 제가 사용하던 사전의 일부가 추가되어 있으며 무시하셔도 무방합니다.
    • 'original_userdic.txt': 해당 단어의 품사를 함께 추가할 수 있음(탭 구분)
    • 'proper_noun.txt': 단어만 추가하면 모두 고유명사 품사로 추가됨(단어가 잘리지 않도록 하려면 고유명사 처리가 가장 쉽습니다)

Quick start

main.py를 열고 KomoranPy 라이브러리의 모델 경로를 수정합니다(pip로 설치하신 분들은 필요없을 듯합니다.)

    $ sys.path.append('<KomoranPy의 모델 path>')

script는 텍스트 파일을 읽어들여 처리하는 경우와 바로 테스트용 텍스트를 넣어 처리하는 두 종류의 input을 받습니다. 테스트의 경우는 아래 라인만 원하는 텍스트로 변경하면 됩니다.

    txt = ["지구를 들어올린다"]     # <<<<<<< string list or string

main.py를 실행시키면 테스트가 가능합니다.

    $ python3 main.py

Example result

원형복원 로직으로 복원한 결과는 input, output은 아래와 같습니다.

input(http://news.naver.com/main/read.nhn?mode=LSD&mid=shm&sid1=103&oid=055&aid=0000434671):

올여름 유난히 덥다 하시는 분들이 참 많습니다. 
그런데 올 7월, 서울의 낮 최고기온이 폭염주의보 기준인 33도를 넘어선 날, 그러니까 '폭염 일수'는 단 3일에 불과합니다. 
지난해 7월 서울의 폭염 일수는 5일, 재작년에는 무려 일주일이나 됐습니다. 
이렇게 올여름 폭염 일수는 적은데 유난히 더 덥다고 느껴지는 이유는 뭘까요? 기상전문기자가 분석했습니다. 
점심시간, 청계천 물가를 걸으며 더위를 식혀 봅니다. 무더운 날씨에도 중복을 맞아 삼계탕집엔 건물 바깥까지 긴 줄이 섰습니다. 
중복이고 날이 흐린데도 엄청 더워서, 삼계탕 생각이 나서 맛있다 해서 왔어요. 
올 7월이 실제 기온보다 더 덥게 느껴지는 것은 우선 습도의 영향이 큽니다. 
보통 습도가 8% 높아지면 몸으로 느끼는 온도는 1도 정도 올라갑니다. 
이번 달 전국의 평균습도는 82.2%로 최근 6년 가운데 가장 높았습니다. 
구름이 낮에는 햇빛을 가려주지만, 밤에는 구름이 끼면 더위는 더 심해집니다. 
구름이 지상의 열기가 빠져나가는 것을 막아주는 이불 역할을 하기 때문입니다. 
더워서 늦게까지 잠도 잘 안 오고 씻고 나서도 바로 다시 습한 거 때문에 불쾌하더라고요. 
올해 폭염 일수가 적은 서울에서 6일 연속 열대야가 이어진 것은 구름의 영향이 큽니다. 
열대야가 이어진 최근 6일 동안 서울 하늘은 평균 75%가 구름으로 덮여 있었습니다. 
열대야가 발생하지 않은 날보다 20% 정도 구름이 많았습니다. 
북태평양고기압 가장자리를 따라 고온의 수증기가 다량 유입되고, 
밤에는 넓게 분포하는 구름으로 인해 지면에 냉각이 저지되면서 열대야가 자주 나타나고 있습니다. 
오늘(27일) 빗방울이 떨어지면서 서울의 최고 기온은 28.9도에 머물렀지만, 
습도가 높고 구름이 많이 끼어 있어 오늘 밤에도 열대야가 나타날 가능성이 높습니다.

output:

올여름 덥다 들 많다 서울 낮 최고기온 폭염주의보 기준 넘어서다 날 폭염 일수 늘다 
불과하다 지난해 서울 폭염 일수 재작년 일주일 되다 이렇다 올여름 폭염 일수 적다 
덥다 느껴지다 이유 기상전문기자 분석하다 점심시간 청계천 물가 걷다 더위 식혀보다 
무덥다 날씨 중복 맞다 삼계탕 집 건물 바깥 길다 서다 중복 날 흐리다 덥다 삼계탕 
생각 나서다 맛있다 하다 오다 실제 기온 덥다 느껴지다 습도 영향 크다 습도 높아지다 
몸 느끼다 온도 정도 올라가다 이번 달 전국 평균습도 로 최근 가운데 높다 구름 낮 
햇빛 가려주다 밤 구름 끼다 더위 심해지다 구름 지상 열기 빠져나가다 막아주다 이불 
역할 하다_때문 덥다 늦다 잠 안오다 씻다 나서다 습하다 때문 불쾌하다 올해 폭염 
일수 적다 서울 연속 열대야 이어지다 구름 영향 크다 열대야 이어지다 최근 동안 
서울 하늘 평균 가다 구름 덮이다 있다 열대야 발생하다_않다 날 정도 구름 많다 
북태평양고기압 가장자리 따르다 고온 수증기 다량 유입되다 밤 넓다 분포하다 구름 
인하다 지면 냉각 저지되다 열대야 나타나다 있다 오늘 빗방울 떨어지다 서울 최고 기온 
머무르다 습도 높다 구름 끼다 있다 오늘 밤 열대야 나타나다 가능성 높다

ko_restoration's People

Contributors

lynn-hong avatar

Watchers

James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.