2. 하테나 키워드 링크 구현
• AC법을 이용한 하테나 키워드 링크 알고리즘 구현
• 키워드 집합 부여 -> 임의의 문장 입력 -> 문장 내 키워드 발견 시 해당 위치와 길이 반환
• 위에서 찾아낸 값을 앵커텍스트로 치환해 키워드 링크 구현
• AC오토마톤이란 Trie를 구성 후 루트노드로부터 너비우선탐색으로 내려가며 패턴매칭 실패 시 사용될 Failure Links를 연결
3. 하테나 키워드 링크
#!/usr/bin/env perl
use strict;
use warnings;
use FindBin::libs; pos 2, len 3 => his
use Perl6::Say; pos 11, len 2 => he
pos 11, len 4 => hers
use My::AhoCorasick; pos 14, len 3 => she
pos 15, len 2 => he
my $text = 'a his hoge hershe';
my $ac = My::AhoCorasick->new(qw/he hers his she/);
my @result = $ac->match($text);
for (@result) {
printf "pos %2d, len %d => %sn", $_->[0], $_->[1], substr($text, $_->[0], $_->[1]);
}
4. 하테나 다이어리 전문 검색
• 1,000 ~ 10,000건 정도의 데이터 = 데이터베이스에서 무작정 검색해도 빠른시간안에 검색 결과 추출
10 ~ 100배 이상의 데이터 = 검색엔진의 원리를 이용 요구사양을 만족하도록 인덱싱
• 하테나 다이어리 전문 검색
• Google 검색은 원하는 검색어로 검색하는 엔진
• 하테나 다이어리를 대상으로 한 검색엔진은 하테나 키워드에 포함된 단어만을 검색
• 서버의 메모리 용량 8G정도의 리소스로 모든 다이어리 검색 가능
• ‘키워드를 포함한 블로그’ 검색 가능 = 포함하는 블로그
5. 하테나 다이어리 전문 검색
• 처음에는 RDB를 사용 => 확장석 측면에서 파탄 초래 => 무거워지고, 특정 데이터 이후는 검색 불가
• 사용자가 검색어를 날리지 않고, 사용자가 보고 있는 페이지의 키워드명을 통해 검색
• 출력은 일자순으로만 정렬함으로 빠르고 컴팩트한 구현 가능
6. 하테나 북마크 전문 검색
• 자신이 북마크한 사이트만을 대상으로 전문 검색
• 스니핏(검색결과에 본문의 일부를 표시) 기능 지원
• 다이어리 검색과 동일하게 데이터베이스의 한계가 존재해 자체구현
• 규모와 사용목적에 따라 검색 시스템을 자체구현 할 수 있다면 대응폭이 증가될 수 있음
7. 검색 시스템 아키텍처
• 검색 순서 (크롤링 => 저장 => 인덱싱 => 검색 => 스코어링 => 결과표시)
• 검색 엔진 (grep, Namazu, Hyper Estraier, Apache Lucene, Shunsaku, Senna, Sedue, Lux)
• grep : 디렉터리를 지정해 해당 디렉터리의 문서를 전부 검색해 단어가 포함되어 있는 문서 검색
• Namazu : 오픈소스 전문 검색엔진의 선구자
• Hyper Estraier : 히라바야시 미키오가 만든 모던한 설계를 지닌 엔진
• Apache Lucene : Wikipedia등에 사용되는 엔진으로 Java로 구현된 모던한 설계
• Shunsaku : 색다른 아키첵처(XML)를 지닌 검색 엔진
• Senna : 데이터베이스 바인딩을 포함해 데이터베이스 내부 검색 가능한 엔진
• Sedue : 하테나 북마크 전체를 검색하는 곳에 사용하는 사용 검색 시스템
• Lux : 비교적 스탠다드하며 모던한 설계 구현
8. 전문 검색 종류
• grep형
• 처음부터 전부 읽어 검색하는 방법, 즉시성이 좋고 병렬화나 쿼리 확장 용이
• 검색대상 텍스트 길이 * 검색하려는 검색어의 길이
• Suffix형
• 검색 가능한 형태로 검색 대상 전문 보유
• 이론적으로 가능하나, 실질적으로 구현이 어렵고 데이터량이 많아짐
• 역 인덱스형
• 단어(term)와 문서를 연관지어 검색
• 비즉시성, 검색누락 발생가능 하지만 밸런스 좋은 아키텍쳐로 현재 가장 많이 쓰임
9. 역 인덱스 구조
doc1
하테나의
마스코트인
시나몬은
도쿄에 없다.
doc2
훗카이도에
살았던
Kurain
doc3
하테나교토의
시나몬에는
익숙한
Kurain
doc4
하테나는
창업
9년째인
벤처다.
doc5
도치기현의
명물은
딸기다.
하테나 => 1, 3, 4
시나몬 => 1, 3
교토 => 3
도쿄 => 1
훗카이도 => 2
Kurain => 2, 3
• 역 인덱스의 내부 구조는 Dictionary와 Postings 두 파트
10. 역 인덱스(DICTIONARY) 작성법
• 사전과 AC법을 이용하는 방법
• 단어 사전을 만들고 사전에 들어있는 단어만을 검색 (ex : 하테나 키워드, Wikipedia 표제어 등)
• 형태소 분석을 이용하는 방법
• 텍스트를 명사나 부사로 분할해 품사를 추정 = 유형파악과 분리
• 기계학습을 통한 패턴 분석 가능
• 검색 누락
• ‘싸이 노래’, ‘싸이코 노래’ 검색 시 사전에 있는 단어로만 검색되므로 타당하다고 볼수도 부당하다고 볼수도 없다.
• 동음이의어와 같은 단어 검색 시 언어의 원형을 통해 모든 단어를 구할 수도 있다.
11. 역 인덱스(DICTIONARY) 작성법 - N-GRAM
• n-gram을 term으로 다루기
• 텍스트를 n자씩 잘라낸 구조
• abra : abr -> bra (3-gram/tri-gram), ab -> br -> ra (2-gram/bi-gram)
doc1
하테나의
마스코트인
시나몬은
도쿄에 없다.
doc2
훗카이도에
살았던
Kurain
doc3
하테나교토의
시나몬에는
익숙한
Kurain
doc4
하테나는
창업
9년째인
벤처다.
doc5
도치기현의
명물은
딸기다.
하테 => 1, 3, 4
테나 => 1, 3, 4
나의 => 1
의마 => 1
마스 => 1
스코 => 1
12. 역 인덱스(DICTIONARY) 작성법 - N-GRAM
• 쿼리도 동일한 n-gram 규칙으로 분할, ‘하테’, ‘테나’의 Postigs을 구한 후 교집합을 취하면 ‘하테나’ 검색 가능
• 종종 잘못된 검색 가능, ‘어학’, ‘학원’ 이라는 2-gram으로 분할 시 ‘어학시험’, ‘학원강좌’라는 문서에서 ‘어학원’ 검색 가능
• ‘어학원’ 검색 결과 반환 시 필터링을 통해 실제로 문서에 ‘어학원’이 있는지 필터링 후 결과 반환
• 필터링을 거칠 시 grep과 동일한 검색시간이 소요되므로 여러가지로 문제 발생
• 용도에 맞게 사용 권고, 하테나의 경우 아래와 같이 사용
• 타이틀, 코멘트, URL 검색 : n-gram
• 본문 검색 : 단어를 기반으로 하는 역 인덱스
13. 재현율과 적합율
• 재현율 : 검색 결과가 얼마만큼의 양을 반환했는지
• 적합율 : 검색 결과가 얼마만큼 정확한 결과인지
• 재현율과 적합률은 서로 상반관계이며 적절한 비율로 검색결과를 결정
• 형태소 분석은 의도하지 않은 결과가 나올 확률은 낮으므로 적합율 우선, n-gram은 검색누락이 발생하지 않으므로 재현율 우선
A : 검색결과 B : 적합한 문장
C : A ∩ B
적합율 : C/A
재현율 : C/B
A
C
B
14. 역 인덱스(POSTINGS) 작성법
• 해당 문서의 term 출현위치를 저장하는 경우를 ‘Full Inverted Index’
• 스니핏을 할 때 유용, 단어 사이의 근접도로 스코어링 가능
• 문서ID만 저장하는 경우를 ‘Inverted File Index’
• 크기가 작고 구현 용이, 문서ID를 정렬해 VB Code로 압축
• term과 문서ID 리스트의 key/value
15. 스코어링
• 문서의 중요성에 비중을 두고 랭킹을 매긴 최초 = Google
• Google의 이러한 랭킹 알고리즘이 PageRank 이다.
• 특정 단어에 대한 문서내의 중요도 순위를 결정하는 단어의 출현빈도/역 출현빈도 활용
• 검색어가 많이 주어졌을 때 검색 대상 문서에 포함된 단어의 열과 비교