1. 들어가기전


3부 1편에 다뤘던내용에서 오타교정 편에 대해서 추가 견해를 남기고 싶어졌다.

왜냐고 묻는다면, 작성한지 4달이나 지났고, 추가적으로 sada9라는 특가모음서비스를 운영하다보니 몇마디 더 하고 싶었다고 해야할까? 


설명의 이해를 돕기위해 잠깐, 우리 부모님 이야기를 하겠다. 우리 부모님은 부르는 호칭이 다양하다.

 1) 시골에서 친구들이 부르던 별명

 2) 호적상 존재하는 이름

 3) 주민등록에 있는 이름


물론, 금융거래나 대부분의 업무는 주민등록상있는 이름을 사용한다. (=당연하지만)

즉, 아무리 별칭(alias)가 많더라도 대표되는 하나가 존재하기 마련이다.


텍스트 데이터 분석에서, 이렇게 다양한 "별칭"을 대표되는 하나의 단어로 통일해야 품질이 높아진다.

이런 데이터 정제 입장에서 본다면 오타교정이나 동의어는 차이가 없어 보인다. 

비슷해 보이면서도 두 개념의 차이는 모호한거같다. @_@

이런 차이에 대해서 개인적인 의견을 풀어보려고 한다.




2. 오타교정 (or 유음어)


2.1 오타교정과 동의어다른점은?

오타교정 데이터는 어떻게 만들수 있을까? 사용자의 검색어 log를 기반으로 해서 만들수 있다. 

이런 접근법은 사용자가 "옾지프로" 라고 검색했다가 검색결과가 없으면 "옵지프로"와 같이 사용자가 오타를 수정해서 재검색 할것이라는 가정을 통해 추출이 가능하다. 재밌는건 이 방법은 "동의어"나 "연관키워드"의 추출방식에서도 동일하게 사용할 수 있는 구현방법이다.


오타교정데이터의 경우는 다른 두개와 가장 다른점은 무엇일까?

그건, 모양이 비슷하다. 말그대로 아래와 같이 비교하면 한음절만 차이가 난다.


"옵지프로"  => ㅇㅗㅈㅣㅍㅡㄹㅗ

"옾지프로"  => ㅇㅗㅈㅣㅍㅡㄹㅗ


즉, "옾지프로"가 "옵지프로"가 되기위해서는 몇번의 수정이 이루어 져야 하는가를 수치화 한다면 단어간 유사도를 알수 있다는 말이된다.  이걸 edit_distance 알고리즘이라고 부른다. (추가자료: 한글에 대한 편집거리 문제 , 박근수)

재밌는건, 아이디어는 비슷하지만 알고리즘명은 여러가지 이름으로 존재하는듯하다.  오타 수정/편집 키보드앱관련 deview세션에서는 "Levenshtein Distance알고리즘"을 사용했다고 했다. (추가자료: 오타 수정과 편집기능을 가진 android keyboard service개발기(데뷰2014))

각 알고리즘별 차이가 있는건지는 나도 잘 모른는건 함정 


2.2 word2vec

텍스트의 유사성을 구하는건 관련 알고리즘의 구현체를 찾아보면 이미 능력자들이 구현을 해두었다. 

참고로 python에는 word2vec 구현체가 있는데sada9에서의 검색어데이터를 토대로 특정 점수 이상인 데이터를 추려보면 이런 결과가 나온다. 현재 "검색어" 키워드를 입력파일로 해서 얻어낸 결과인데 생각보다 품질도 상당한 수준이다.

(물론, 삼성전자가 주전자와 유사하다고 뽑히는 문제도 있었지만, 기계적인 분석으로 이정도를 뽑았다는건 놀랍다)


스테레오        카스테레오

남성가방        남성용가방      남자가방
베기팬츠        배기팬츠        베기펜츠
블르투스        블루투스
블루투스키보드  블루투스헤드셋
매트리스        매트릭스        메트리스        퀸매트리스
유아동 자전거   아동자전거      유아용 자전거   유아자전거      전동자전거
루이비통        루이뷔통
케리비안베이    캐리비안 베이   캐리비안베이    케리비암베이
옥스포드        옥스퍼드

자동차악세사리  유모차악세사리
삼성전자  주전자




3. 동의어


우렁쉥이가 뭔지 아는가? 옛날에 '멍게'의 표준어가 우렁쉥이었다.

동의어의 경우 텍스트의 유사도가 거의 없다. 그렇기 때문에 단순한 텍스트의 모양의 유사도를 통해 유도할수 없다는 의미이다. 


3.1 사전적 의미

동의어는 사전적으로 정리된 데이터가 이미 존재한다. 

이미 언어적으로 같거나 유사한 단어라는것이 정의되어 있다. 이건 이미 정제되어 사전에 등재되어 있어서 기술적으로 어렵다기보다는 관련 데이터는 편찬하는곳에서 바뀌면 반영되는 수동적인 대응을 해야 한다.

(=이건 학회나 학계에서 정해주는것이니 개발자가 크게 관여할것 없이 가져다 쓰기만 하면될듯)





3.2 비표준어의 유의어 등장 (=대표적인건 '축약어')

학계에서 만들어주는 사전적인 관리는 단점이, 표준어로 승인되거나 이런 자체적인 약속(?)과 결정이 되야 반영이 된다. 요즘은 인터넷과 스마트폰 보급에 따라 새로운 단어가 등장하고 대중적으로 많이 쓰지만 사전에 등재되지 않은 단어들이 존재하기 시작한다.

특히 스마트폰에서 타이핑이 불편하다보니 축약어들이 대량으로 생기기 시작했고, 이런것에 대한 처리가 필요해졌다.

초등학교 학생, 초등생, 초딩 ...




4. 연관단어, 제언단어?


모양이 비슷한 단어(유음어, 오타)와 사전적으로 의미가 같은 단어(동의어)에서 찾아낼수 없는, 중간에 있는 못찾는 영역을 연관성을 통해 찾는것이라고 이야기 하고 싶다. 대충 그림판으로 그려서 표현하면 아래와 같다고 할까?

저 붉은 영역을 커버하기위한 방법이랄까?


요즘은 스마트폰과 인터넷의 발전으로 축약어도 많아져서, 대표대는 단어와의 관계를 찾기가 어려워지고 있다.

예를 들어 "문상"이라고 했을때 이것이 "문화상품권" 의미하는것인지 "조문"을 의미하는건가?

국어사전에도 등록안되어 있고, 축약어이다보니 word2vec같은걸 돌려도 연관점수가 낮게 나올테고 지금까지 두개의 방법만으로는 찾기가 어렵다.



이런 데이터는 사용자의 검색패턴(검색로그)에서 연관성을 통해 찾을수 밖에 없다.


예를 들면,

문상으로 검색해서 내가 원하는 결과가 안나왔다면, 유사한 다른 단어로 검색을 시도할 것이고 만족스러운 결과가 나올때까지 이런 사용을 반복할 것이다. 이런 유저의 연속된 단어의 패턴을 가진 유저가 수천만명이라면?


간단히 말하면, 단어에서 찾을수 없는걸, 반대로 생각해서 사용자의 사용성의 관계통해 유추한다는 의미이다.

기준을 바꿔서 생각하면 새로운 해결책을 찾을수 있는것 같다.


농담삼아 비유하자면, 전교 40명인 학교에서 내가 1등을 하는방법은 

내가 공부를 열심히 하지 않고, 39명의 학생의 시험을 망치게 하면 내가 1등이 되는 접근방법이랄까 (ㅡ,,ㅡ)a




5. 마치며...


검색에 대한 이야기를 하고 있지만, 텍스트 분석에서 본다고 해도 비정형 데이터를 정제하는 작업은 품질을 올리기 위해서는 필요한 작업이다. 개인적으로 트위터 데이터에서 사람들이 먹고 싶은 음식이나 가게에 대한 분석을 시도한적이 있는데, 축약어 오타 등을 해결못하다보니 품질이 좋지 않았아 멘붕에 빠진적이 있다.

예를 들어볼까? 가게 이름에서 가장 문제가 되었던 사례는 "파리바게뜨" 

<빠리바게트, 빠리바게트, 빠바, 파리바게트, 파리바게뜨 ...> 뭐 이리 파생될수 있는 조합이 많은건지 ㅠ_ㅠ

이런 난항을 겪고 혼자서 하긴 버겁다고 생각해서 indf의 실험적인 프로젝트를 무한홀딩해 버렸는데, 이건 아마 덱스트 데이터 분석을 하려고 한다면 많은 사람이 겪을것이다. (텍스트 처리에서 품질이라는 단계로 넘어가면 사람의 수작업이 들어갈수 밖에 없는듯 하다)


deview2014에서 "Web&Health 2.0 회사에서의 data science란?" 세션에서도 맥도날드 사례를 들때 나는 깊은 공감을 했었다. (영문맥도날드, 맥도날드, mc도날드 등등)


사족으로 "검색 그리고 프로젝트 이야기" 편은 작성할때마다 내몸의 에너지가 빠져나가는 느낌이다. 책임감을 느끼고 열심히 쓰고있고 2015년에는 관련글을 마무리 지어야 할텐데... 걱정이 조금 앞선다.


그러면, 다음에는 외전이 아닌 기존에 쓰던글을 이어서 쓰려고 한다.


+ Recent posts