인공지능 AI/검색시스템

[NLP/검색/Information Retrieval/아파치] 검색 개념 개론, 정보 검색, 패싯, 색인 생성, 사용자 입력, 순위화, 결과 표시

검색이란 것은 인터넷에서 정보를 검색하거나, sns에서 친구를 찾거나, 텍스트 조각에서 주요 단어를 찾는 일이다.

 

사용자가 거대한 텍스트 덩어리를 관찰하는 데이터 주도 애플리케이션에서는 특히나 이 검색 기능이 중요하다.

 

오픈소스를 활용한 검색 도구는 - 유연성, 개발 비용, 가격, 콘텐츠에 대한 이해 - 등의 장점으로 품질이 굉장히 높다.

 

검색과 패싯: 아마존과 이베이

검색과 패싯은 아마존과 이베이와 같은 온라인 상점의 표준 검색 기능으로 자리잡았다. 

 

만약에 사용자가 방탄소년단 굿즈를 사고 싶다고 하자.

아마존에서 'bts merchandise'를 입력하고 다음과 같은 결과를 받았다고 하자.

당연히 이렇게 일반적인 질의를 입력했기 때문에 원하는 결과가 아니다.

그래서 이제 검색 결과를 좁혀야 한다.

 

패싯 브라우징을 지원하지 않는 시스템에선 질의에 주제어를 추가하는 식으로 해야한다.

'bts official merchandise'로 공식 굿즈를 검색하는 식으로.

 

그러나 아직 내가 원하는게 정확히 무엇인지 알 수 없고, 생각만 있기 때문에 아마존이 제공하는 패싯을 살펴본다.

 

위의 그림에서 아마존은 좌측 카테고리에 '여성패션', '침구', '이색 의류 등' 과 같은 값을 보여준다.

 

'침구' 패싯을 클릭하면 아래와 같은 그림의 결과가 이어서 뜬다.

또 다시 나열된 카테고리는 검색어 및 이전에 선택된 패싯에 모두 관련있다. 

더욱이 나열된 카테고리를 따라가면 결과를 얻는다는 점이 항상 보장되는데, 실제 데이터가 결과안에 존재하기 때문이다.

 

딸아이에게 겨울철 따듯한 담요를 선물해주기로 결정한 사용자는

'25달러 미만', '세탁기 세탁' 으로 패싯을 더 클릭해서 원하는 결과값에 다다른다.

여기서부터는 구매하려는 물건을 고르기 시작한다.

 

 

 

이렇게 패싯을 지원하는 검색은 전자상거래(e-commerce), 도서관, 과학 컨텐츠 등 구조적(메타데이터)이면서 비구조적(미가공 텍스트)인 데이터 조합을 갖는 사이트를 위해 강력한 장치다.

 

검색 결과 집합에 연관된 메타데이터를 살펴보고, 이들을 그룹으로 묶고 세는 작업을 한다.

아파치 솔라 오픈소스는 이 모든 작업을 바로 사용가능한 형태로 제공한다. (따로 전처리는 필요없다는 뜻)

 

이렇게 검색했지만 사용자가 원하는 결과값에 못 다다를수도 있다.

그럴 경우 검색을 추가하고 강화하는 작업을 할 수 있다.

 

 

검색 개념 개론

복잡한 웹 기반 검색 이론은 뒤로 하고, 검색의 핵심 개념은 네 가지로 기술한다.

1. 색인 생성 : 파일, 웹사이트, DB 레코드를 검색 가능하게 만들기. 색인된 파일은 문서다.

2. 사용자 입력: 사용자는 특정 형태의 사용자 인터페이스를 통해 정보를 입력한다.

3. 순위화: 검색엔진은 질의를 색인의 문서와 비교하고 문서가 얼마나 질의와 가깝게 일치하는가에 따라 순위화한다.

4. 결과 보여주기: 사용자가 인터페이스를 통해 나타나는 최종 결과 - 사용자에게 가장 결정적인 요소.

 

 

1. 색인 생성 : by 콘텐츠

 

예를 들어 문서에서 제목 일치가 보통 가장 유익하기 때문에, 검색엔진에서 제목이 일치하는 문서에 가중치를 주게 함으로써 결과에서 그런 문서가 상위에 오르게 할 수 있다. 

비슷하게 날짜와 숫자 혹은 저자가 중요하다면 색인 추가 작업을 한다.

 

온라인 뉴스 사이트의 모든 HTML태그에 색인을 넣으면 검색엔진이 얼마나 형편없겠는가.

 

사용자 요구에 따라 더 잘 대응하는 애플리케이션을 만들고 향상하려면 반복적인 접근법을 개발해야한다.

검색이란 것은 색인으로 만들 컨텐츠에 대한 어떤 지식을 얻는 것이다.

 

문서를 검색하기 위해서는 색인 생성 프로세스가 문서의 콘텐츠를 분석해야한다.

문서 분석은 보통 문서를 토큰 단위로 나누고, 선택적으로 각 토큰을 색인어(term)이라고 하는 정규화된 토큰으로 만들기 위한 하나 이상의 변경 작업으로 구성된다.

색인어로 만드는 토큰화 작업은 어간 추출, 소문자화, 제거 작업 등을 모두 포함한다.

 

분석기법 종류: 토큰 분리, 소문자화(downcasing), 어간 추출(stemming), 불용어(stopword)제거, 동의어 확장

 

문서에서 색인어(term)을 모두 추출했다면,

이는 문서를 빠르게 찾는데 최적화된 역파일(inverted index)라는 데이터구조로 저장된다.

사용자가 단어를 입력하여 검색하면, 검색엔진은 빠르게 그 단어를 포함한 문서를 모두 서칭한다.

inverted index 역파일 데이터구조

다음 그림처럼 색인어와 색인어 출현 문서를 매핑해서 검색엔진이 빠르게 질의어를 찾는다.

문서 내 색인어의 출현 위치도 저장해서, 두 개 이상의 단어가 서로 가까이 있는지 계산하는데 위치 정보가 필요한 구절이나 더 고급질의를 처리하기 쉬워진다.

여기다가 색인어의 가중치 정보를 계산하고 저장하면, 단순 색인어일치를 보는 작업을 넘어서 연관성이 높다고 여기는 문서를 더 윗순서로 보여주는 랭킹 모델로까지 확장할 수 있다!

 

 

2. 사용자 입력

보통 사용자가 원하는 정보를 인터페이스에서 키워드, 문서 유형, 날짜 범위와 같은 입력을 통해 질의를 받는다.

우리가 아는 일반적인 구글 검색엔진 인터페이스
구글은 고급 검색 입력도 제공한다

일반적인 사용자는 단순 검색 인터페이스가 익숙하지만,

수준 높은 고급 사용자는 더 나은 결과를 위해 정교한 고급 도구를 원할 수도.

 

트위터의 검색엔진도 결과를 줄여주는 복잡한 질의를 생성하기 위해 AND, OR, NOT, 구에 대한 따옴표 등과 같은 연산자 집합을 활용할 수 있다.

 

 

질의 유형과 연산자 종류: 키워드, 구("" 따옴표 이용), 불리언 연산자(AND, OR), 와일드카드와 정규 표현식(?,*), 구조적 질의(날짜 범위), 유사한 문서(구글-Similar Pages 링크제공), 안내된 검색(위에서 본 아마존 패킷사례)

 

동의어 확장은 보통 토큰마다 사용자 정의된 유의어 사전을 찾아보는 기법이다. 예를 들어 원본 질의 단어가 'bank'면 분석 과정에서 사용자가 모르는 사이에 'financial institution과 'credit union'이 질의에 추가할 수 있다.

 

 

3. 순위화: by 벡터 공간 모델

검색 작업을 모델링하는 방법은 여러 가지가 있다. 당연히 모든 모델이 그렇듯 각자 장단점이 있다.

벡터 공간 모델을 알아보자. Vector Space Model(VSM) 이 친구는 우리가 고른 검색 라이브러리에 있고 문서 순위화로 가장 잘 알려진 기법이다.

출처: https://towardsdatascience.com/vector-space-models-48b42a15d86d

출현한 단어를 n차원 선형 공간에 매핑하는 대수적 모델이다.

말이 어려우니까 예시로 다시 설명하면, 

Film, Data, Entertainment, Economy, Machine Learning 단어만 다루는 제한된 언어로 작성된 문서 집합이 있다.

이를 다음과 같이 5차원 그래프에 그릴 수 있다.

 

문서 컬렉션의 각 단어는 하나의 차원을 나타낸다. 

출처:  https://www.researchgate.net/publication/312471174_Analysing_the_Effects_of_Latent_Semantic_Analysis_Parameters_on_Plain_Language_Visualisation

다음과 같이 5차원 벡터 공간의 벡터로 표현할 수 있다.

 

실제 검색엔진은 백만 이상까지도 넘는 높은 차원의 데이터를 다루기 때문에 품질을 보장하기 위해 정제 작업을 한다.

출현하지 않은 단어는 저장하지 않고, 단어의 출현만 기록하는 식으로 저장 공간을 효율적으로 활용한다.

 

여기에 단어간의 중요도를 나타내기 위해 가중치를 저장하는데 이를 벡터 확장이라고 한다. 

대표적으로 TF-IDF가 있다. 대부분 이 이론은 알테니 설명은 넘어가겠다.

관사와 같은 불용어(stopword)를 스킵하고, 특정 문서에 자주 등장하는 단어에 높은 가중치를 두는 작업을 하는 것이다.

 

그래서 어떻게 순위화를 하는가?

위의 그림처럼 같은 벡터 공간으로 매핑하고,

질의 벡터의 끝과 문서 벡터의 끝을 맞추는데, 이때 각도가 생긴다.

 

이 각도의 코사인을 취하면 문서를 순위화할 수 있다. 그렇다, 코사인 유사도다.

코사인 값은 0과 1 사이로 나오고, 이를 이용하여 순위화할 수 있다.

0도의 코사인 값은 1이다. 두 벡터 사이의 각도가 0이면 완전 일치다.

 

보통 검색엔진은 비용효율적으로 모든 문서에 대해 계산하지 않고,

질의와 문서간에 공통된 한 개 이상의 단어가 있는 문서에 집중한다. 

 

여기에 가중치로 부가적인 기능을 넣을 수 있다. 

검색엔진 개발자는 그럼 이 결과까지 1초안에 계산해줘야하는데. 이걸 다음 단계에서 살펴보자.

 

4. 결과 표시

사용자가 원하는 최상의 검색결과를 내주려면 무엇을 생각해보야할까.

 

- 문서의 어떤 부분을 표시할까? 제목? 요약? 

- 질의의 키워드를 하이라이트 표시할까?

- 중복 결과는 어떻게 처리하지?

- 사용자의 만족도를 더 높이도록 어떤 링크나 메뉴를 더 제공할까?

 

 

파이썬을 구글에 검색하면 이런 화면으로 뜬다.

파이썬의 개발자는 귀도 반 로섬이다.

Python이라는 이름은 귀도가 즐겨 보던 영국의 6인조 코미디 그룹 몬티 Python에서 따왔다고 한다

구글에서 python이라고 검색하면 제일 위에 뜨는 게 바다 괴물이나 뱀이 아니라 이거다. 

(비단뱀 사진을 데려오려다가 징그러워서 그만뒀다.)

 

보통 사용자들이 구글에 파이썬을 검색할 때, 비단뱀을 기대한게 아니고 프로그래밍 언어를 찾으려 했을것이다.

 

 

검색 결과 클러스터링은 또한 결과 화면도 향상시킨다. 

www.carrotsearch.com

Carrot Search는 다수의 여러 검색 엔진의 결과를 클러스터링해서 제공해준다. 

"Snake in the Family Pythonidae" 를 누르면 특정 클러스터로 검색을 좁힐 수 있다. 

 

이제 검색의 개념이론은 충분히 알아보았으니

다음 게시물에서는 아파치 솔라를 통해 실제 검색 엔진을 애플리케이션에 만드는 작업을 살펴보겠다.

 

 

 

참조: 책 "자연어 텍스트 처리를 통한 검색 시스템 구축"