ASH84

Software Engineer/Developer, co-founder of Payhere. Ex-Banksalad. Intereseted in iteroperability, bootstrap company, writting.

[Stemming] English-Specific Stemmings Open Source

created:2012-04-19
updated:2012-04-19
edit

최근에 회사에서 아카데미라고 사내 교육 프로그램을 진행하는데 Information Retrieve 에 대한 내용이었다. 그 중에서 하나의 작게는 문장 아니면 어절에서 유의미한 단어를 추출해내는 과정에서 한글은 주로 형태소 분석을 사용하는데 반해서 영어는 형태소의 개념 자체가 없기 때문에 Stmming 이라는 과정을 거친다고 한다. 

한 마디로 말하자면, 특정 단어 뒤에 붙는 접미사들을 분리해 내는 작업이라고 볼수 있다. 처음 이 내용을 들었을때는 이전에 우리나라 영단어집 중에 우선순위와 버금가는 “과학적 암기비결” 이라는 책에 보면 그러한 어근과 접미사를 바탕으로 외우는 방식이 생각났다. 

예를 들면, 아래와 같은 원 문장이 있다고 하자. 

Anders Behring Breivik, who admits killing 77 people in Norway last summer, said his primary objective in bombing a government building in Oslo was to slay the Norwegian government and its prime minister.
그리고 규칙이 ing를 제거한다고 하면 위의 문장내 단어에서 ing 부분은 제거 되는 것이다. 결과를 보면, 
Anders Behring Breivik, who admits killing 77 people in Norway last summer, said his primary objective in bomb a government build in Oslo was to slay the Norwegian government and its prime minister.
이렇게 되는 것이다. 워낙 영어의 경우, 하나의 단어에 ing, tic, ly 등의 접미 단어들을 붙여서 확장하는 경우가 많기 때문에 검색엔진에 넣기 전에 tokenization 과정에서 이렇게 시행하는 것이다. 이러한 내용을 듣고 한번 구현해 보기로 했다. 구현은 순수 JAVA로 구현했으며, 해당 소스코드는 [GITHUB](https://github.com/AhnSeongHyun/Stemmings)에 공개 하였다. 
![](http://ash84.net/wp-content/uploads/1/cfile22.uf.207A2A404F9037EB3782B8.jpg)
일단 기본적으로 규칙사전(Rule Dictionary)를 정의하였는데 다음과 같은 형식으로 정의 하였다. 
-ing
-er
-ion
이런식으로 빼고 싶은 일련의 문자 앞에 대쉬(-)를 쓰게 하였다. 이렇게 한 이유는 수식 연산자를 이용해서 Stemming에 대한 확장성을 열어두기 위해서이다. 현재는 빼는 단계에 대해서만 구현이 되어 있다. 기본적으로 텍스트를 라인별로 읽어와서(readLine()) 띄어쓰기 단위의 term으로 저장을 하는데 저장을 하기 전에 개행문자(newline, ‘\n’)을 삽입해 준다. 삽입해 주는 이유는 일단 Stemming 이후에 좀더 원본과 같은 형식으로 맞추기 위해서이다. 
현재 추가적인 기능에 대한 생각은 좀더 원본 형식과 맞추기 위해서 **특수문자에 대한 처리**이다. 즉, 아래와 같이 나오게 하는 기능이다. 
-ing 규칙
going? => 현재 안됨
going? => go?
“stemming” = > 현재 안됨. 
“stemming” => “stemm”
또한 규칙에 대한 추가인데 현재는 빼는 부분에 대해서만 집중적으로 구현되어 있는데 반해서, 다양한 수식연산자를 통해서 문자를 추가 삭제 할수 있게 하는 것이다. 예를 들면 
-ing+to 규칙 :  뒤에서 ing를 빼고, to를 붙여라. 
going => goto
이렇게 하도록 하는것이다. 해당 이슈에 대한 구현이나 추가적인 이슈를 제기해보고 싶다면, github의 이슈란을 통해서 하기를 바란다. 
링크 : [https://github.com/AhnSeongHyun/Stemmings](https://github.com/AhnSeongHyun/Stemmings)
Commit log
[– 특수문자 처리 ](https://github.com/AhnSeongHyun/Stemmings/commit/22fad66418c3ed0fbcbf4c5b407f75179b3bd774)

#github  #Open Source  #Stemming