기사에서 키워드 추출

내일(아니, 오늘이구나) 아침 machine learning 스터디 때문에 집단지성 책을 보고 있는데, 막상 돌아가는 걸 보니 너무 신기하다. 난 처음에 한글 뉴스 기사에서 명사 단어를 추출하는데 힘을 너무 많이 뺐는데,  이 책 저자는 쿨하게 영어 단어를 빈칸 단위로 나눠서 썼다. 진작 나도 이렇게 할껄-_-

어쨌거나 저쨌거나, 내가 한글 형태소 분석기를 만들 수는 없었던 관계로, 각 단어를 빈칸 단위로 나눈 다음에, 네이버 사전에서 쿼리를 날린 다음, 네이버 사전이 “명사”라고 판단해 준 단어만 사용하였다. 조사가 포함된 단어를 던져도 네이버 사전은 알아서 분석해서 결과를 던져주니 그저 고마울 따름. :) 물론 네이버 사전을 파싱하는 삽집은 좀 했다.

매번 단어를 찾을 때 마다, 네이버 사전에 물어 볼 수가 없어서 DB에 ( 기존에 물었던 단어 / 결과 단어 / 품사 ) 형태로 저장한 다음, 새로운 단어를 찾을 때, 먼저 내 DB를 뒤지고, 해당 단어가 없을 때만 사전에 물어보게 했다. 그런데 이것도 속도가 너무 느리다. 찾아보니 MySQL에서 메모리 DB를 지원하길래, 이걸로 바꿨더니 이제 빨라졌다 :)

그리고 조사의 종류에 따라 단어양이 너무 많아져서 단어 Cache를 위한 DB가 너무 커지는 문제 때문에, 많이 사용되는 조사는 따로 분류한 다음, 단어가 해당 조사로 끝날 경우, 조사를 뺀 단어가 DB에 있을 경우, 그냥 조사를 제거한 단어를 사용하는 꽁수도 추가하였다.

이제 기사를 던지면 명사로 추측되는 단어들만 던져주고, 이 단어들을 사용하여 각 기사와 기사에 사용된 단어들의 count를 저장하는 커다란 matrix를 만든다. 너무 일반적인 단어나, 해당 기사에 조금 나온 단어는 제외하고, document – word count matrix를 만든다.

그리고 이 거대한 matrix를 feature matrix와 weights matrix로 분리하는데 non-negative matirx factorization (NMF) 방법이 사용되고, 여기에서 또 증배 갱신 규칙 (multiplicative update rules)을 사용한다.

뭔지 모를 복잡한 방법을 거치고 나면, 기사 마다 최적의 feature들이 나오고, 이 feature들에 포함된 단어들을 출력하면 해당 기사의 키워드가 된다.

오늘 뽑아본 기사 제목과 핵심 키워드

추신수, '명품어깨' 과시…개인 최다 '12호' 어시스트 : 추신수 어시스트 외야 안타 타구 바깥쪽

'박종윤 개인 최다 5타점' 롯데, 올 시즌 최다 5연승 : 타점 두산 안타 적시타 루타 선발

퍼거슨, "안데르손, 지난 시즌에 팀 떠나려 했다"  : 부상 연패 안데르손 퍼거슨 지난 차두리

이 정도면 며칠 동안 오밤중에 잠 안자고 삽질한 보람이? ㅋㅋㅋ

댓글

Designed by JB FACTORY