NounX: 한국어 명사 추출기 프로젝트

by SL

동기

한국어로 쓰인 텍스트를 가지고 뭔가를 하려고 할 때마다 부딪치는 문제는 형태소 분석기였다. 그동안은 강승식 교수님의 형태소 분석기를 갖다 썼고, 최근에는 KoNLP라는 R 패키지도 알게 되었지만, 주로 사용하는 언어인 파이썬으로 쉽게 쓸 수 있는 방법이 있었으면 했다.

생각해보니 오피니언 마이닝이나 감정 분석(Sentimental Analysis)처럼 부사나 형용사가 중요한 작업을 하는 게 아니라면, 특히 내용의 주제 분석을 주로 할 것이라면, 텍스트에서 명사만 잘 추출해도 충분하겠다는 생각이 들었다. 명사만 뽑아낸다라.. 갑자기 해볼만한 일로 보이기 시작했다.

아이디어

단순하게 생각하면, ‘은(는)’/’이(가)’/’을(를)’/’의’ 따위의 조사 앞에 나오는 단어는 명사일 것이다. 그러나, 좀더 생각해보면 ‘에서는’처럼 조사 앞에 명사 외의 품사가 나오는 경우도 있고, ‘고양이’처럼 명사+조사 형태로 보이지만 실은 그냥 명사인 경우도 많다. 그러면 어떻게 할까?

진짜 명사는 그 뒤에 따라오는 조사의 종류가 다양할 것이다. (ex. ‘사람은’, ‘사람을’, ‘사람이’, ‘사람의’) 그러니 조사로 끝나는 단어를 뽑은 뒤에, 실제로 그 단어 뒤에 나오는 조사의 분포를 살펴보자. 가령, ‘고양이’의 경우, ‘고양’이 명사 후보지만, ‘고양은’, ‘고양이’, ‘고양을’, ‘고양의’가 골고루 나오지 않을 테니 ‘고양’은 명사가 아니라는 것을 알 수 있을 것이다.

값의 분포가 얼마나 퍼져있는지를 측정하는 척도로 엔트로피가 있다. 텍스트에서 조사로 끝나는 명사 후보들을 뽑은 뒤, 각 후보의 조사 엔트로피를 구해서 이게 일정 이상인 것만 추리면 명사만 추출할 수 있지 않을까?

구현 및 평가

파이썬으로 프로토타입을 만들어서 내 블로그 문서를 대상와 취미삼아 수집 중인 트위터 타임라인에 적용해보기로 했다. 명사(Noun)를 추출(eXtract)한다고 해서 이름은 NounX로 지었고, 소스코드는 요즘 유행을 따라 github에 올렸다. 여기에 가면, 코드 뿐만 아니라 테스트에 썼던 텍스트와 만들어진 (작은) 사전까지 모두 올려놓았다.

실제 텍스트에 적용해보고 얻은 첫 번째 발견은, 조사 외에 ‘하다’, ‘하는’, ‘하고’, ‘한’, ‘할’, ‘적인’, ‘적으로’ 같은 어미를 추가할 필요가 있겠다는 것이었다. 그리고, ‘에서도’처럼 조사가 여러 개 이어지는 경우를 처리하는 로직이 필요하다는 것도 알게 됐다. 특히 복수형을 나타내는 ‘들’이 붙어 ‘사람들이’ 같은 표현이 많았다. 마지막으로, 조사 엔트로피가 높으면 무조건 명사일 것이라는 예상과 달리 ‘그러’, ‘있는지’, ‘이렇게’, ‘앞에서’ 같은 표현 뒤에도 다양한 조사가 따라온다는 사실을 깨달았다.

계획

현재는 첫 번째만 코드에 적용한 상태이다. 두 번째, 세 번째는 아직 기약이 없고, 또 데이터를 보니까 그외에도 해보고 싶은 게 자꾸 생겨서 틈날 때마다 조금씩 작업해볼 생각이다.