근 1년만에 다시 약속했던(?) 글을 이어가려고 한다.

원래는 싸다구 서버쪽 개발스택에 대한 이야기를 쓰려고 접속한건데... 왜 이걸 쓰고 있는지는 잘 모르겠다. ㄱ-)



1. 들어가기전 잡담


재현률과 정확도를 간단히 설명하자면 재현률은 얼마나 검색결과가 많이 나오게 하느냐이고, 정확도는 얼마나 정확하게 나오느냐고 할수 있다. 정확하다는건 다르게 말해 검색결과가 적게 나오므로 재현률은 떨어진다고 말할수 있다.

복잡하게 생각하지말고  검색결과에 영향을 주는 개념이라고 생각하고 일단 넘어가자.


재현률과 정확도는 상반되는 개념이지만, 또 전혀 상관없다고 보기도 뭐한 모호한 개념이다. 뭔 알수없는 소리냐고 할텐데, 이해를 돕고자 비유하자면 "섹시하면서 귀여운여자"와 같은 느낌이다. (??!!)



사족으로 '귀여우면서도 섹시한 여자 사진' 으로 검색했더니 나온사진이다. 

사진속 주인공은 오렌지캬라멜의 나나 라고 한다.



2. 정확도


사실 정확도는 설명하기 참 어려운놈이다. 

"정확도 = 품질" 이라는 개념으로 보면 랭킹이라는 개념을 알아야 하고, 그밖에 영향받는 요소들이 많다.

지금 말하려는 '정확도'는 검색결과가 적게 나오게 해서 얻는 정확함(?)을 말하려는것이다.


품질에 관련된 정확도의 개념은 '랭킹' 이라는걸 3부 2편에 따로 다룰것이다.

생각보다 우리들은 머리가 좋지 않다. 복잡한건 나중에 생각하자. 레드썬!!



2.1 내가 입력한 '검색어'의 의미를 생각해 보았니?


긍정의 힘!! 이런 "시크릿"이라는 책을 아는가? 그 책을 사기위해 yes24에서 '시크릿' 이라고 검색했다. (이미샀다)

그 결과를 캡쳐한건데... '나쁜 사마리아인들' 이라는 책이 두번째에 보인다.


'시크릿'이라는 단어는 어디를 찾아봐도 없다. 왜 검색된걸까?

목차에도 없고, 리뷰에도 없어서 찾는데 좀 헤맸는데 나쁜 사마리아인들의 원제목은 아래와 같다.


"원제 : Bad Samaritans: The Myth of Free Trade and the Secret History of Capitalism"


내가 "시크릿"으로 검색을 했지만, 영문 "Secret"으로 확장되서 검색을 한것이다.

과연 이것이 검색결과로 노출되는것이 맞을까?

반대로 'coffee'라고 검색했는데 '커피'가 들어간 검색이 안나오는것은 맞을까?




2.2 내가 입력한 키워드가 가장 정확한 조건이 아닌가?


에러메시지를 검색하거나 상품코드로 검색했을때 불필요한 결과가 너무 많이 나오는걸 경험한경우가 있을것이다.

한국어중에서는 문장형으로 작성된 검색어도 은근히 결과가 많아 찾기 힘든경우도 많다.

아니면 의도하지 않은 확장된 검색으로 불필요한 결과가 나와서 불편한 경우가 있다.


예를 들면, 과거버전인 ibatis의 사용방법만 알고 싶은데, 구글은 계보를 잇는  MyBatis의 결과도 같이 보여주고 있어서 불편한 경우가 있다. (비 전공자를 위해 비유하자면, 영화 '시월애'를 찾는데,.. 리메이크된 '레이크 하우스'가 자꾸 보이는 느낌?)






3. 재현률 


재현율은 사용자의 검색어가 부정확한 경우를 대비해서 더 많이 결과를 표시하기 위한 기술이 많이 존재한다.

재현률을 높이기위한 방법으로는 오타교정, 동의어검색, 그리고 검색방법(검색메소드)이 존재한다.


이런 재현율을 높이기위해서는 다양한 사전이나 패턴이 필요한데, 맨땅에 만들기는 힘들다.

그렇기 때문에 사용자의 검색로그를 활용해서 기본적인  rawdata를 생성해서 정제해서 사용하는편이다.

사용자의 검색로그를 활용하는것은 확률적인 방법인데, 현재검색어와 이전검색어의 쌍으로된 결과를 로깅해서 group 해서 빈도가 높다면 연관성이 높은 키워드라는것을 알수 있다. 


예를 들어, '옵g pro' 라고검색했는데 검색결과가 없으면 사용자는 '옵지프로' 라고 검색해보고 또 결과가 없으면 다양한 조합을 통해 검색어를 변경할것이다. 그러면 이런 빈도가 높다면 


a) 비슷한 의미를 가진 유의어이거나, 

b) 오타가 나서 다시 검색했거나, 

c) 외래어 같이 발음이 비슷한 유음어


일 확률이 매우 높다. 그래서 이 데이터를 기반으로 만들면 재현율을 높이면서 품질의 만족도를 높일수 있다.

사실 오타교정과 동의어는 기능적으로는 크게 다르지 않지만 용도별로 구분했다고 보는게 좋다.




3.1 오타교정 


외래어 표기나 영어에서 특히 많이 실수하는걸 도와준다.

보통 자주 실수하는 오타에 대해 사전을 관리해서 검색결과가 없을경우 오타교정을 해서 다시 검색을 한다.

사전 구조는 만드는사람 마음이지만, 다음과 같이 대표단어와 오타가 많이 나는 단어에 대한 후보군을 사전에 넣어 활용이 가능할것이다.


 groovy : grooby, gruvy, grooby


이런사전이 있다면, grooby라고 잘못 검색하더라도, grooby라는 단어의 오타일수 있겠구나 하는것이 가능하다.


한글의 경우는 외래어 표기에서 실수를 줄여주는것이 있다. 예를 들어 '샹들리제'의 경우 샹드리에, 샹들리애, 샹드리에, 샹들리제, 샹들리에 사용자가 입력할때 모호한 경우가 많다. 나름 표준어(?)라는 권고안이 있더라도 일상생활에서 이걸 항상 맞춰가며 타이핑 하는 사람은 드믈다. 그래서 확장할 경우 꽤 만족도가 높다. (이건 의도성이 들어갈 확률이 낮다)



오타교정과 동의어 확장의 경우 기능적으로 크게 차이점은 없어 보이긴한다.

코에걸면 코걸이 귀에걸면 귀걸이 같이 사용방법에 따라 달라질뿐 크게 다른점이 없어 보인다.


굳이 오타교정과 동의어에 대해서 이론적으로만 나눠 본다면, 

오타교정의 경우는 사용자 실수에 대한 보정을 한다는 의미가 강하고, 소리내어 읽으면 유사한 유음어의 특징이 있다.

동의어의 경우는 실수가 아니라 다른이름으로 불릴수 있는 의미적 차이로, 소리내어 읽을때 비슷한게 아니라 글자 자체가 다르지만 의미가 통하는 단어의 확장을 할때 동의어라고 할수 있다.




3.2 동의어 확장


3.2.1 동의어 ?!

의미가 같아서 검색할때 같이 사용하면 좋은 후보 검색키워드라고 할수 있다.

사용자가 놓치지 않게 재현율을 높여 여러번 검색해야하는 불편을 줄인다. 

동의어도 개념적으로 나누면 아래와 같은 케이스로 나눌수 있겠다.


ㄱ. 표준어/사투리

자장면과 짜장면, 멍게와 우렁쉥이같은 표기법의 문제이다.



ㄴ. 외국어(영어)표기

'taxi'나 '택시'는 우리가 혼용해서 많이 사용한다.

커피, 버스, 스마트폰같이 단일 단어에서도 존재하고, 제품명에 일부 영문표기가 섞였을때도 그렇고...

이런 원문표기에 대해서 같이 검색되어야 하는 경우도 존재한다.


ㄷ. 별칭/축약어

박지성, 캡틴박 같이 별칭이 있는 경우도 존재한다.

슈퍼주니어 슈주 같이 말을 줄여서 가진 축약어개념의 동의어도 존재한다.





3,2.2 동의어 확장의 문제


첫째, 우선 품질적인 문제에 영향을 줄 수 있다.

전에 다뤘던, 위에 정확도 이야기를 할때 언급했던 '시크릿' 이라고 검색했는데, 원제에서 secret 이 검색되어 갸우뚱한 경우도 존재할 수 있다. 하지만 이런 단점은 검색결과의 순서를 조정하는 '랭킹'이라는 개념이 등장하게된 배경이기도 하다.

내가 의도하지 않은 결과가 나올 수 있더라도, 의도한 대상을 더 상단에 올려준다면 사용자 입장에서는 문제가 없다.

3부 2편에서 랭킹에 대한 주제를 다루도록 하겠다.


둘째, 성능이나 의도하지 않은 영향을 줄수도 있다

동의어의 조합을 허용할 경우 특히 주의해야한다. 모든 조합을 허용한다면 다단계처럼 일이 어떻게 커질지 모른다. 어느 단계까지 허용할것인지 잘 고민해야 할것이다.


슈퍼, 수퍼, super 

주니어, 쥬니어  

슈주, 슈퍼주니어


예를 들어, 위와같은 사전이 있고 띄어쓰기에 대한 복합 단어의 동의어 확장을 한다면 어떻게 될까?

'슈퍼 주니어' 라고 검색하면 아래와 같이 6가지의 조합이 생긴다.

슈퍼 주니어

수퍼 주니어

super 주니어

슈퍼 쥬니어

수퍼 쥬니어

super 쥬니어


별거 아닌거같아 보이지만, 단지 2개의 단어의 조합에서 생긴것이다. 각 단어별 조합은 N x M x O x .... 기하급수적으로 조합의 수가 늘어난다. 즉 단어조합이 많고 사전도 많다면 재앙이 올수 있다. 

(실제로 검색어에서 형태소분석결과의 동의어 확장의 조합을 만들다가 문제가 생긴 경우가 존재했다)


그래서 일반적으로는 아무리 검색어가 여러 단어로 조합해도, 검색어 자체를 하나의 대상으로 동의어 사전을 관리하는것이 일반적이다.





4. 검색방식 / 검색메소드


단일 단어가 아니라 검색어가 여러개가 입력된 경우 사용할수 있는 방법이다.


"서울에서 가장 맛있는 떡볶이 가게는 어디인가요?"

"윈도우7 탐색기에서 폴더옵션이 안보일경우"


위와 같이 장문의 텍스트나 많은 단어들을 입력한 경우 해당된다. 


내가 사용했던 상용 검색엔진의 경우 someword, allword, anyword, allorder, allword_thruindex, natural 같은 검색메소드가 존재했다.(사실 몇년이 지나서 가물거리긴 하지만 대충 그랬던거 같다)


어떤 메소드를 쓰냐에 따라서 다른 검색결과를 던져줬는데, 검색결과갯수 즉, 재현율의 차이를 주는 방식이다.

몇가지 대표적인 방식을 아주 간략하게 설명하자면 다음과 같다.


4.1 anyword (하나라도 일치하면 OK)


"옥수수 감자 고구마" 라고 검색하면 어떤 단어라도 하나만 있으면 검색결과로 리턴된다. 재현율은 높지만, 정확도는 낮다고 할 수 있다.이해를 돕기위해 sql쿼리로 굳이 표현해본다면 아래와 같다.


select * from 데이터 where 색인어 in ('옥수수', '감자', '고구마') // or 문과 같음


근데, 실제 검색프로젝트를 진행하면서 이 메소드를 적용해서 쓰는곳은 못봤다.



4.2 allword (검색어의 모든 단어가 있어야 OK)


"옥수수 감자 고구마" 라고 검색하면 3개 단어가 모두 있는 문서를 검색하는것이다.

낮은 재현율이지만 정확도는 높다. anyword와 반대된다고 불수 있다.

이해를 돕기위해 쿼리문으로 억지로 표현하자면 아래와 같다.


select * from 데이터 where 색인어 = '옥수수' and 색인어='감자' and 색인어='고구마' 


명시적으로 이야기하기 쉽기 때문에 실제 프로젝트에서도 많이 사용했다.



4.3 someword (검색어에서 일부단어가 일치하면 OK)


이제부터 조금씩 난해해 지기 시작할것이다. 해당 검색엔진에서는 몇가지 패턴에 따라 비중이 달랐는데 개념을 이해하는것이기 때문에 대충 설명하자면(?) 검색한 모든 단어중 60%정도 있다면 결과로 돌려준다는 의미이다.

예를 들어 "옥수수 감자 고구마"로 검색했을때, 검색어의 2개만 내용에 포함되면 돌려주는 그런 형식이다.


예를 들어, someword라는 기능을 이용해서 검색할때 "옥수수 감자 고구마"로 검색할때

문서2번에 "고구마"가 없지만 옥수수랑 감자 2개의 단어는 있으니까 검색하는것이다.



메소드별 검색결과로 본다면 아래와 같은 결과의 차이를 보인다.


* anyword : 문서1, 문서2, 문서3

* allword :  문서1

* someword: 문서1, 문서2



4.4 order 계열 (순서까지 일치한 결과만 OK)

여러개의 검색어가 존재한다면, 그 순서도 의미가 있을수 있다.

검색어의 순서에 따라 검색이 되고 안될수 있다는 의미이다.


"창업 기업"으로 검색했다면 두번째 결과만 나와야하고

"기업 창업"으로 검색했다면 첫번째 결과만 나와야 한다는 의미이다.


보통 검색어의 순서로 결과가 나오고 안나오고를 조정하기 보다는 품질에 따른 순서의 조정으로 활용되는것이 일반적이다. 하지만 이런 형태로 검색유무를 판별하는 기준이 될 수도 있음을 고민하다.




4.4 복합필드 계열 (필드별로 흝어져 있어도 OK)


검색대상이 되는 문서의 검색대상 필드들도 여러개일 수 있다.

즉, 여러개의 검색대상 필드에 흝어져서 존재하는 문서가 존재할 수 있다는 의미이다.

(= 사용했던 검색엔진에서는 thruindex 계열 검색메소드라는 이름으로 존재했었다)


예를 들어, "싸다구 할인" 으로 검색했을때

첫번째 결과처럼 제목에 '싸다구' 본문에 '할인' 이 존재해서 필드별로 검색된 결과가 있을수 있고

두번째 결과처럼 제목에 '싸다구'와 '할인'이 모두 검색어가 존재해서 검색되는 경우가 있을것이다.


일단적으로는 한 필드에 모두 존재해서 검색되는것이 일반적이지만, 여러개의 필드를 하나로 보고 검색할 수 있게 하는 기능을 통해 검색결과를 더 많이 보여줄수 있다. (재현율을 높임)



보통 검색대상의 데이터가 엄청 많은 경우라면 단일필드에서 모두 검색하는게 유리하지만, 

데이터가 적거나 검색대상 필드가 너무 많아서 모든 필드를 퉁쳐서 검색해야 유리한 경우가 존재한다.


대표적인 예라면 저자와 책제목 필드가 별도로 있는데,

"정주영 시련은 있어도 미련은없다" 형태로 저자와 제목을 같이 검색하면 결과가 안나올수 있다.

이런 검색패턴이 있을것으라고 예상된다면 모든 대상을 하나의 필드처럼 가정되어 검색되게 해야할 것이다.




5. 마치며


뭔가 적다보니 또 말이 길어 지게 된거 같다.

이번에 다루고자 햇던것은, 검색결과 건수를 좌지우지 하는 내용을 다루려고 했던것이다.

그래서 정확도를 검색의 '품질'을 기대하고 글을 본 독자라면 실망했을지도 모르겠다.


그래서 '랭킹'이라는 개념을 다루지 않고 글을 마치는것도 안될거 같긴하다.


간단히 말하면, 랭킹은 검색결과수는 유지한채 데이터의 순서에 영향을 주는 기법(?)이다. 

쉽게 생각하면 좀더 스마트한 정렬이라고 봐도 무방할것 같다.


랭킹을 위해서는 품질에 대한 이야기를 해야할텐데... 몇가지 이야기를 할것이고

검색 품질이라는건 절대적이라는게 아닌걸 이야기 하고 싶다.


일단, 검색프로젝트 이야기 3부 1편은 여기서 마치겠다.



+ Recent posts