자연어처리 기술을 상업적으로 잘 활용할 수 있는 분야가 검색입니다. 검색 서비스를 가지는 회사는 검색 품질이 회사의 매출을 결정할만큼 검색은 매우 중요합니다. 검색 품질에 영향을 주는 자연어처리는 무엇이 있는지 알아봅시다.


목차


1. 텍스트 정보 시스템

50만년 인류 역사에서 문자의 역사는 6천년밖에 되질 않는다. 문자가 등장한 뒤에서야 문명이 발달하기 시작했다1. 문자를 사용하면서 지식, 지혜, 기술 등의 유산을 그대로 후대에 물려줄 수 있게 되었기 때문이다. 어떤 현상이나 개념을 가장 상세하고 효과적으로 표현할 수 있는 도구가 바로 문자(텍스트)이다. 이처럼 텍스트는 사람에 의해 직접 만들어지고 소비된다. 그 속에 함축된 지식은 인류의 역사를 대변하기에 이를 분석하는 일은 매우 의미있는 일이다.

현대에서도 문자 못지않게 인류에 큰 영향을 주는 기술이 있다. 바로 컴퓨터와 인터넷이다. 전기적인 신호로 텍스트를 영구적으로 무제한 크기에 저장할 수 있고, 이메일, 소셜 미디어, 모바일 등의 기술 대중화로 누구나 쉽게 사용할 수 있다. 오늘날 대략 45억명이 인터넷을 사용하고, 이들은 수많은 웹 사이트에서 1분마다 무려 4백만 GB 크기의 데이터를 사용한다. 시간이 흐를수록 이들의 증가율 또한 매우 높기에 앞으로는 세상의 거의 모든 정보를 다 기록할 수 있을 것이다.

문제는 정보를 저장하는 일이 아니라 방대한 데이터 속에서 관련있는(relevant) 데이터를 찾는 일이다. 아날로그 텍스트는 책이나 서점에서 카테고리에서 관리되어 찾기 쉽다. 웹이나 데이터베이스에 저장된 텍스트 데이터는 구조화되어 있지 않다. 또한, 우리가 어떤 지식을 찾고자 할 때의 상태는 찾고자하는 지식을 형식(formal)적으로 정의할 수 없는 어려움도 있다. 이러한 문제를 텍스트 정보 시스템(Text Information System)2이 해결할 수 있다. 이 시스템은 사용자와 상호작용하면서 대용량 데이터 속에서 관련있는 데이터만을 찾아주고, 그 속에 숨어있는 지식(knowledge)을 추출해준다.

다음 그림은 텍스트 정보 시스템의 프로세스를 보여준다. 실제 세계의 현상이나 개념은 사람들에 의해 텍스트로 쓰여지고, 이들은 보통 비구조적, 비형식적인 형태로 전자 데이터로 저장된다. 평면적인 텍스트에서 언어 지식이 포함된 입체적인 텍스트 표상(representation)으로 변환하기 위해 자연어처리(Natural Language Processing) 기술을 사용한다. 이 단계에서 얻은 텍스트 표상으로 효과적인 검색과 추천을 할 수 있고, 나아가 이를 통해 얻어진 알짜배기 데이터를 분석해서 지식을 얻을 수 있다.

자연어처리와 검색 이야기는 큰 그림인 텍스트 정보 시스템에서부터 시작한다. 텍스트 정보 시스템은 검색과 자연어처리를 포함하고, 자연어처리는 일종의 정제와 표상 기술로서 검색을 도와주는 역할을 한다. 물론, 위의 프로세스 순서가 항상 지켜지는 것은 아니다. 도메인과 방법론에 따라 단계를 넘어 한번에 지식을 추출하거나 검색 결과를 보여줄 수 있다. 이 글에서는 위 프로세스에서 자연어처리(Natural Language Processing)와 검색(Search)의 역할 그리고 이들의 관계에 중점을 둔다.


2. 검색 시스템

텍스트 정보 시스템의 목적은 방대한 데이터 중에서 사용자가 원하는 데이터와 지식을 제공하는 데 있다. 사용자가 데이터를 접근하는 관점에서 보면, 크게 검색과 추천이라는 두 가지 종류의 시스템이 있다. 검색은 사용자에게 주도권이, 추천은 시스템에게서 주도권이 있다. 검색과 추천 시스템은 기술적으로 보면 공통되는 부분이 많고, 독립적으로 구성되는 것이 아닌 서로 상호작용하며 동작한다. 예를 들어, 검색 결과에 소량의 추천 결과를 포함시킬 수 있고, 검색 결과가 아예 없으면 추천 결과를 대신해서 보여줄 수도 있다.

다음은 텍스트 정보 시스템을 구성하는 모듈들이며 이들은 계층적인 구조를 가진다.

검색하는 사용자가 찾고자하는 대상을 키워드로 표현할 수 있을 때는 쿼링(querying)을 하고, 특별한 대상이 없거나 키워드로 표현할 수 없으면 주로 하이퍼링크를 통해 이곳저곳 떠도는 브라우징(browsing)을 한다. 검색과 추천 관계와 같이 쿼링과 브라우징은 서로 상호보완적인 관계를 가진다. 사용자는 성공적인 검색을 위해서 쿼링과 브라우징을 섞어가면서 행동한다.

검색 시스템은 크게 매칭과 랭킹 모듈을 통해 쿼링을 실행한다6. 매칭으로 먼저 쿼리와 관련있는 데이터를 추출하고 랭킹을 통해 이들의 우선순위를 결정한다. 자연어처리 기술은 주로 품질이 좋고 범위를 확장한 텍스트 표상을 만드는 것으로, 이는 매칭을 원활하게 해주고 랭킹에 퀄리티 높은 재료를 제공해준다.

검색은 위 그림과 같이 크게 IndexingSearching 단계로 구성된다3. 이는 단순히 데이터를 저장하고 룩업하는 과정과 같다. Indexing에서는 대용량 데이터를 빠르게 검색하기 위해 효율적인 자료구조를 사용한다. 이산적인 토큰 리스트는 Inverted Index Table5에 저장하고, 연속적인 벡터는 Vector Space Model에 저장한다. 자연어처리는 품질(prediction)과 양(recall)이라는 두 마리의 토끼를 잡기 위해 심볼릭한 토큰 리스트와 분산적 표상인 벡터를 모두 활용할 수 있다. 사용자가 쿼리를 날려 검색 결과를 얻는 Searching 단계는 랭킹과 검색 결과를 반환하는 과정을 제외하면 Indexing과 동일한 프로세스를 가진다.

벡터 연산으로 유사한 결과를 추려내는 작업은 전통적인 검색보다는 추천에 더 가까울 수 있다. 이처럼 검색 프로세스에서도 추천이 자연스럽게 녹아져 있는데, 사용자가 쿼리를 작성할 때 실시간으로 확장된 쿼리를 제공하는 자동완성8도 추천이라고 볼 수 있다. 위 그림에서 점선은 검색보다는 추천에 더 가깝다.

다채로운 음식 재료와 이들의 품질이 좋아야 맛있는 요리를 만들 수 있다. 자연어처리 기술을 통해 사용자 쿼리를 분석해서 품질이 좋고 풍부한 양의 재료를 매칭과 랭킹 모듈에 제공할 수 있다면, 검색 결과의 성능은 좋아질 수 있다. 다음 장에서 검색을 위한 자연어처리 기술을 자세히 알아보도록 한다.


3. 검색을 위한 자연어처리

검색에서 자연어처리가 왜 중요할까? 단순히 검색의 입출력이 대부분 텍스트이기 때문일까? 좀 더 구체적인 이유를 나열해보았다. 사용자 쿼리 관점에서 나열했지만 색인되는 문서 데이터 관점에서도 동일하게 적용된다.

  • 사용자는 인내심이 없다. 특별한 이유가 아니면 다음 검색 페이지로 잘 넘기지 않는다. 검색 품질은 생명이다.
  • 사용자가 작성하는 쿼리는 불완전하다. 오타가 있거나, 찾고자 하는 것에 대한 이해가 부족해서 (안다고 해도) 텍스트로 표현을 잘 못하는 경우가 많다7. 쿼리를 보완할 필요가 있다.
  • 기본적으로 사용자 쿼리의 정보량은 작다. 쿼리를 확장해야 한다.
  • 사용자 쿼리는 키워드 중심의 자연어이다. 의미 분석이 필요하다.
  • 언어처리는 사람의 손이 많이 가는 작업이다. 최대한 자동화할 수 있는 기술이 필요하다.

정리하면, 불완전한 사용자 쿼리를 보완하고 확장해 검색 결과의 정밀도(precision)와 재현율(recall)을 높이는 것으로 요약할 수 있다. 이는 자연어처리 기술로 (1장에서 언급한) 좋은 텍스트 표상을 만들고, 이를 통해 (2장에서 언급한) 매칭과 랭킹의 성능을 높이는 것과 같다.

위는 검색에 사용될 수 있는 자연어처리 기술을 나타낸 그림이다. 크게 기본적인 문자열 전처리, 구문 분석을 주로 하는 언어처리, 의미 분석 중심의 언어분석으로 구분해보았다. 이 카테고리를 기준으로 다양한 자연어처리 모듈이 있다. 이들의 처리 단위는 문장, 어절, 단어, 문자가 될 수 있고, 심볼릭한 표현과 분삭적인 벡터의 표상을 모두 사용한다. 규칙과 기계학습을 대표적인 방법론으로 사용되고, 다양한 종류의 언어 리소스가 사용된다.

전처리

전처리는 데이터의 노이즈를 정제함으로써 이후에 있는 언어처리와 언어분석 모델의 성능을 높이는 데 일조한다. 특히, 한국어의 경우 토크나이징 성능에 큰 영향을 주기도 한다. 한국어는 띄어쓰기 오류가 많은 언어인데 전처리에서 띄어쓰기나 오타를 교정해준다. 사전에 없는 신조어, 외래어, 줄임말, 속성 등을 이 단계에서 문자열 패턴으로 인식하고 하나의 토큰으로 만든다. 이들은 토크나이징 단계를 건너뛸 수 있다. 단순히 사전을 보고 문자열, 특수문자를 삭제 또는 정규화할 수 있고, 유니코드나 정규표현식을 활용해서 복잡한 패턴을 인식할 수도 있다. 전처리 사전은 단어보다는 패턴 중심적이다. 단어 사전은 언어처리 단계에서 많이 사용된다. 전처리에서 문자열 패턴으로 얻은 외래어와 속성 등은 토크나이징에서의 단어 사전에 추가될 수도 있다.

언어처리

여기서 정의된 언어처리의 역할은 토크나이징으로 최소 크기의 의미 단위로 쪼개주는 일을 한다. 어절(공백), 단어, 서브단어, 문자 단위로 토크나이징을 할 수 있고, 이들 중 하나를 택하거나 여러 개를 같이 사용할 수도 있다. 한국어의 경우 언어 구조상으로 형태소의 경계가 복잡하기에 공백이 아닌 어휘문법에 입각해 토크나이징을 실시하는 편이 좋다. 학습 데이터가 풍부하거나 모델 또는 테스크에 따라서 서브워드와 문자 토크나이징을 쓰기도 한다.

한국어 토크나이저 구현에는 딥러닝, 통계, 규칙 등 다양한 방법이 사용된다. 일반적으로 통계 방법론이 많이 쓰이는데, 대표적인 오픈소스로 mecab, nori 등이 있다. 이와 관련해서는 (1) 품사 태깅을 위한 Hidden Markov 모델, (2) 품사 태깅을 위한 Viterbi 알고리즘, (3) 노리(Nori) 형태소 분석기 Deep Dive 글을 참고하길 바란다.

보통 토큰과 품사는 일대일 대응이 되고, 후보군 토큰 조합의 중의성을 품사 정보가 해결해주기에 토크나이징과 동시에 품사 태깅을 한다. 품사 정보를 토큰과 함께 활용하면 적절한 후처리를 할 수 있다. 명사, 동사와 같은 핵심어만 남길 수 있고, 여러 개의 토큰들을 하나로 묶는 단일어 처리도 할 수 있다.

모든 자연어처리 테스크에서 공통된 화두가 중의성을 해소하는 일이다. 키워드 중심의 사용자 쿼리가 많은 검색에서 동의어 처리는 언어와 검색 측면 모두에서 중요한 작업이다. 후처리로 동의어 처리를 실시한다. 동의어 대표어로 정규화를 시킬 수 있고, 모두 추가해서 확장을 할 수도 있다. 이는 검색 정책에 따라 달라질 수 있다.

언어분석

언어분석은 사용자 쿼리를 더 깊이 분석해 유용한 지식을 찾는 목적을 가진다. 크게 유사한 데이터를 찾아 쿼리를 확장해주는 일과 언어의 구조나 의미를 이해해 메타 정보를 추가해주는 일을 한다. 예를 들어, 문서요약, 기계번역, 임베딩 유사도10 등을 통해 쿼리 확장을 할 수 있고, 구문파싱, 개체명 인식, 군집화, 분류 등을 통해 카테고리명, 토큰 중요도 등과 같은 메타 정보를 추가할 수 있다. 언어분석 테스크는 주로 의미를 분석하기에 매우 어렵기 때문에 실제 검색 시스템에서는 활발히 활용되고 있지는 않다. 그러나, 이러한 작업을 같이할 수 있다면 검색 품질을 훨씬 더 높일 수 있을 것이다.

리소스

리소스는 사전, 학습 데이터, 사용자 로그 등 알고리즘에 사용되는 모든 정보를 말한다. 각 단계별 알고리즘에 맞게 리소스 종류가 다르다. 전처리에서는 심볼릭한 단어보다는 정규표현식 패턴 사전이 많고, 언어처리에서는 단어 사전이 많다. 유의할 점으로 언어는 항상 변하기 때문에 이러한 사전 리소스는 주기적으로 업데이트를 해야 한다. 언어분석은 주로 모델 학습에 사용되는 학습 데이터 성격의 리소스가 필요하다.

언어 리소스는 수작업으로 구축하는 것이 좋으나 비용과 시간의 한계로 통계적인 알고리즘을 사용할 수 있다. 사실 리소스지식으로 간주될 수 있기에 일반적으로 생각하면 자연어처리의 결과물이 리소스로 다시 활용될 수 있다. 전처리에서 정규표현식으로 인식된 문자열을 언어처리의 사용자 사전에 추가할 수 있고, 유사한 데이터를 묶을 수 있는 사용자 로그9나 군집화의 결과물을 기반으로 동의어 사전을 자동으로 만들 수도 있다. 이렇듯 서로 상호보완적이며 선순환 구조를 가진다.

검색에서 자연어처리 이점

검색 품질을 정량적으로 측정하는 지표로 정밀도(precision)와 재현율(recall)이 있다. 어느 정도까지는 기술의 도움으로 성능이 모두 향상될 수 있으나, 두 지표는 원래 서로 trade-off 관계를 가진다. 원하는 정보의 일부를 빠르고 정확하게 보고싶은 사용자에는 정밀도가 높아야하고, 좀 느리지만 찾고자하는 정보의 대다수를 보고싶은 사용자에는 재현율이 높아야 한다. 도메인에 따라 검색 시스템의 정책11이 달라질 수 있다. 자연어처리 기술을 잘 활용하면 두 지표의 성능을 최대한 높일 수 있고, 검색 정책에 맞게 특정 지표의 성능을 조절할 수 있다.

정밀도가 특히 향상되는 예는 다음과 같다.

  • (전처리) 정규표현식 패턴으로 속성값, 외래어 등 의미가 있는 하나의 문자열을 하나의 토큰으로 인식
  • (언어처리) 복합명사를 단일어로 토크나이징, 후처리에서 토큰 병합과 동의어 처리
  • 쿼리 구문분석기를 AND로 세팅

재현율이 두드러지게 좋아지는 경우는 다음과 같다.

  • (언어처리) 동의어 확장
  • (언어분석) 기계번역, 문서요약, 임베딩 유사도를 통한 쿼리 확장
  • 근사해서 어떻게든 유사한 답을 도출해주는 기계학습 방법론 사용
  • 쿼리 구문분석기를 OR로 세팅

정밀도와 재현율은 독립적인 것이 아니라 대부분 자연어처리 모듈은 정밀도와 재현율의 성능에 모두 영향을 끼친다. 정량적 지표인 두 가지 척도로 검색 정책을 구분해봤지만 더 세밀하게 표현될 수 있을 것이다. 자연어처리를 통해 컨트롤할 수 있는 다양한 옵션을 제공하여 복잡하고 다양한 검색 정책을 수용할 수 있는 장점도 있다.

검색은 매칭과 랭킹의 조화이다. 랭킹은 검색 회사의 존립을 결정할만큼 매우 중요하다. 자연어처리를 통한 의미 분석으로 랭킹 로직에 사용될 수 있는 많은 재료들을 줄 수 있다. 랭킹 모델이 고도화됨에 따라 질높은 재료를 제공할 수 있다면 검색 품질은 더할 나위 없이 좋아질 것이다.


4. 더 나은 검색을 위해

똑똑한 검색 시스템이 되려면 어떤 개선점이 필요할까? 검색에 대해 더 깊이 살펴보자. 검색은 다음 그림과 같이 사용자, 데이터, 서비스라는 세 가지 요소로 구성된다. 이를 Data-User-Service (DUS) Triangle 이라고도 불린다[1,2]. 각 요소별 종류에 따라 조합이 되는 경우는 무수히 많다. 각 경우는 하나의 검색 시스템이라 볼 수 있고, 위에서 언급한 검색 정책으로도 생각할 수 있다. 예를 들어, 웹 검색은 Everyone + Web pages + Search/Browsing 의 조합으로 볼 수 있고, Employees + Organization Docs + Search/Browsing은 엔터프라이즈 검색이다.

이 세 가지 요소 모든 종류의 검색을 설명할 수 있는 것처럼, 세 가지 방향으로 똑똑한 검색 시스템으로 업그레이드해 나갈 수 있다. 다음 그림은 각 축에서의 레벨별 함수를 나타낸다[1,2]. 그림의 한 가운데 부분이 현재 검색 시스템의 수준이라고 볼 수 있고, 가장 똑똑한 검색 시스템은 사용자 행동 패턴, 히스토리 정보 등을 모델링할 수 있는 User Model, 추론이 가능한 Knowledge Representation, 단순한 검색을 넘어 decision-making이 가능한 Task Support를 가지는 시스템을 말한다.

데이터 요소와 Document Model은 3장에서 다룬 자연어처리 기술들의 집합체라고 볼 수 있다. 의미 분석을 더 깊게 할 수 있는데, 개체와 관계를 뽑고 이들을 연결하는 하나의 지식 그래프를 구축할 수도 있다. 이런 기술적인 요소뿐만 아니라 똑똑한 검색 시스템이 되기 위한 가장 중요한 포인트는 바로 사용자와 시스템 사이의 상호작용이다. 시간이 흘러감에 따라 사용자, 데이터를 비롯한 모든 것이 변한다. 시스템은 이러한 흐름을 따라가기 위해서 내부적인 수정도 필요하겠지만, 더 중요하게도 사용자의 피드백을 받아야 한다. 낡은 것은 버리고 새로운 것은 취할 수 있도록 끊임없는 업데이트가 필요하다.

사용자 로그는 사용자에 대한 모든 패턴 정보가 함축되어 있기에 이를 찾아내면 똑똑한 검색 시스템이 될 수 있다. 다양한 형태의 로그를 수집하기 위해서는 로그 모델링을 잘해야 하고, 수집된 로그를 분석해서 사용자의 행동을 역으로 시뮬레이션할 수 있는 분석 모델을 구축해야 한다. 이처럼 사용자 로그는 추천에서도 가장 어려운 개인화(personalization)을 가능하게 해줄 뿐만 아니라 데이터를 군집화해주기에 고품질의 자연어처리 리소스도 만들 수 있게 해준다. 자연어처리 기술과 함께 사용자 로그 정보를 검색 시스템에 잘 녹여낼 수 있는 것이 정말 중요하다.


5. 마무리

검색에서는 자연어처리 기술이 어떻게 활용될 수 있는지 알아봤고, 의외로 많은 자연어처리 테스크들이 검색에 응용되어 사용될 수 있음을 확인했습니다. 검색은 단순히 한방향으로 구글링하는 것을 넘어 로봇과 같이 사람과 기계와의 끊임없이 상호작용을 하는 시스템이라는 점이 흥미롭습니다. 선순환 구조로 정체되지 않고 외부 피드백을 계속 받아야 발전할 수 있다는 점이 자연어처리와 닮아있기에 이들이 서로 융화가 잘 되는 것 같습니다.


6. 각주

  1. 최초의 문자는 쐐기 문자이다. 초기에는 기호 형태로 구체적인 대상밖에 표현하지 못했다. 이후 추상적인 개념을 표현하기 위해 기호들을 조합했고, 점점 발달해 오늘날의 텍스트가 만들어졌다.
  2. 텍스트 정보 시스템은 정보 검색, 텍스트 마이닝, 자연어처리를 포함한다. 넓게 보면 텍스트 정보 시스템이 자연어처리 시스템으로 볼 수 있다. 여기서 자연어처리는 좋은 텍스트 표상을 만드는 도구로 지엽적인 관점으로 소개된다. 자연어처리 범위는 ‘자연어처리 개요‘ 글을 참고하길 바란다.
  3. 전체 검색 프로세스는 crawling, indexing, searching, feedback이다.
  4. 기본적으로 하나의 행은 단어와 문서 번호라는 키벨류를 가지지만, 원활한 랭킹을 위해서 문서 번호뿐만 아니라 단어 위치 등 다양한 메타 정보를 넣을 수 있다.
  5. 매칭과 랭킹은 개념적으로 구분할 뿐 아주 밀접하게 연결된 하나의 과정으로 생각할 수 있다. 매칭의 범위를 조절하면서 랭킹의 효과를 거둘 수 있다. 랭킹 모델이 부족한 면이 있으면 매칭 범위를 까다롭게 해서 검색 결과를 좋게 만들고, 우수한 랭킹 모델이 있다면 매칭 범위를 넓혀 좋은 검색 결과를 내보낼 수 있다.
  6. 사람은 어떤 현상을 언어로 표현할 때 자기만의 방식이 있다. 이게 범용적일 수도 있고, 자기만의 국한된 스타일이 될 수도 있다.
  7. 자동완성은 사용자가 쿼리를 작성할 때 오타를 방지하고, 작성 속도를 높여주고, 힌트를 제공함으로써 마켓팅의 수단으로 활용될 수 있다.
  8. 검색에서 사용자 로그는 매우 귀중한 자원이다. 사용자의 행동 패턴과 로그 정보를 통해 세련되고 정확한 군집화를 실시할 수 있다. 이러한 군집화를 통해 유사한 데이터의 추적을 가능케한다.
  9. 임베딩(벡터) 유사도를 기반으로 유사한 데이터를 찾을 때 주의할 점이 있다. 주위 문맥만 비슷하면 유사하다고 판단하기 때문에 반의어도 유사하다고 판단한다. 핵심어를 대상으로만 연산할 필요가 있다. 또한, 사전에 데이터 특성 분류를 제대로 하지 않은 채 전체를 대상으로 임베딩 학습을 한다면 제대로된 유사어를 추출하기 힘들다.
  10. 검색 정책은 다양하게 구성할 수 있다. 큰 틀에서는 구글과 같은 범용적인 검색과 특정 분야나 주제에 초점을 맞추는 수직 검색 엔진(vertical search engine)으로 구분된다. 구체적으로 데이터 특성(문서 길이), 사용자 성향, 기술 종류에 따라 세밀화될 수 있다.

7. 참조

  1. (Book) ChengXiang Zhai and Sean Massung, Text Data Management and Analysis: A Practical Introduction to Information Retrieval and Text Mining, ACM and Morgan & Claypool Publishers, 2016
  2. (Course) Text Retrieval and Search Engines – ChengXiang Zhai / ILLINOIS / Coursera
  3. (Book) 검색을 위한 딥러닝 – 토마소/테오필리/박진수 / 2020.03
  4. (Book) 미래를 바꾼 아홉 가지 알고리즘 – 존 맥코믹/민병교 / 2013.05 – 2장 검색엔진 인덱싱

** 이 글은 주로 [1,2,3]을 참고했습니다.