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

More Related Content

More from kidoki

Hadoop io
Hadoop ioHadoop io
Hadoop iokidoki
 
Chapter 14. json
Chapter 14. jsonChapter 14. json
Chapter 14. jsonkidoki
 
Http 헤더
Http 헤더Http 헤더
Http 헤더kidoki
 
로그 수집, 집약
로그 수집, 집약로그 수집, 집약
로그 수집, 집약kidoki
 
14. no sql을 넘어
14. no sql을 넘어14. no sql을 넘어
14. no sql을 넘어kidoki
 
My sql 장애복구
My sql 장애복구My sql 장애복구
My sql 장애복구kidoki
 
9장. 문서 데이터베이스
9장. 문서 데이터베이스9장. 문서 데이터베이스
9장. 문서 데이터베이스kidoki
 
[NoSQL] 2장. 집합적 데이터 모델
[NoSQL] 2장. 집합적 데이터 모델[NoSQL] 2장. 집합적 데이터 모델
[NoSQL] 2장. 집합적 데이터 모델kidoki
 
Code chapter15
Code chapter15Code chapter15
Code chapter15kidoki
 
Code chapter5
Code chapter5Code chapter5
Code chapter5kidoki
 
Ch18. 빅리그 거물에서 선지자로
Ch18. 빅리그 거물에서 선지자로Ch18. 빅리그 거물에서 선지자로
Ch18. 빅리그 거물에서 선지자로kidoki
 
Ch.11 승진
Ch.11 승진Ch.11 승진
Ch.11 승진kidoki
 
Ch7. 소프트웨어 r&d 조직
Ch7. 소프트웨어 r&d 조직Ch7. 소프트웨어 r&d 조직
Ch7. 소프트웨어 r&d 조직kidoki
 
Ch2. 좋은 소프트웨어란
Ch2. 좋은 소프트웨어란Ch2. 좋은 소프트웨어란
Ch2. 좋은 소프트웨어란kidoki
 
11장. 분석 패턴의 적용
11장. 분석 패턴의 적용11장. 분석 패턴의 적용
11장. 분석 패턴의 적용kidoki
 
2장. 의사소통과 언어 사용
2장. 의사소통과 언어 사용2장. 의사소통과 언어 사용
2장. 의사소통과 언어 사용kidoki
 
11장 시스템
11장 시스템11장 시스템
11장 시스템kidoki
 
10장 클래스
10장 클래스10장 클래스
10장 클래스kidoki
 
클러스터링을 통한 패턴 추출
클러스터링을 통한 패턴 추출클러스터링을 통한 패턴 추출
클러스터링을 통한 패턴 추출kidoki
 
정규확률분포
정규확률분포정규확률분포
정규확률분포kidoki
 

More from kidoki (20)

Hadoop io
Hadoop ioHadoop io
Hadoop io
 
Chapter 14. json
Chapter 14. jsonChapter 14. json
Chapter 14. json
 
Http 헤더
Http 헤더Http 헤더
Http 헤더
 
로그 수집, 집약
로그 수집, 집약로그 수집, 집약
로그 수집, 집약
 
14. no sql을 넘어
14. no sql을 넘어14. no sql을 넘어
14. no sql을 넘어
 
My sql 장애복구
My sql 장애복구My sql 장애복구
My sql 장애복구
 
9장. 문서 데이터베이스
9장. 문서 데이터베이스9장. 문서 데이터베이스
9장. 문서 데이터베이스
 
[NoSQL] 2장. 집합적 데이터 모델
[NoSQL] 2장. 집합적 데이터 모델[NoSQL] 2장. 집합적 데이터 모델
[NoSQL] 2장. 집합적 데이터 모델
 
Code chapter15
Code chapter15Code chapter15
Code chapter15
 
Code chapter5
Code chapter5Code chapter5
Code chapter5
 
Ch18. 빅리그 거물에서 선지자로
Ch18. 빅리그 거물에서 선지자로Ch18. 빅리그 거물에서 선지자로
Ch18. 빅리그 거물에서 선지자로
 
Ch.11 승진
Ch.11 승진Ch.11 승진
Ch.11 승진
 
Ch7. 소프트웨어 r&d 조직
Ch7. 소프트웨어 r&d 조직Ch7. 소프트웨어 r&d 조직
Ch7. 소프트웨어 r&d 조직
 
Ch2. 좋은 소프트웨어란
Ch2. 좋은 소프트웨어란Ch2. 좋은 소프트웨어란
Ch2. 좋은 소프트웨어란
 
11장. 분석 패턴의 적용
11장. 분석 패턴의 적용11장. 분석 패턴의 적용
11장. 분석 패턴의 적용
 
2장. 의사소통과 언어 사용
2장. 의사소통과 언어 사용2장. 의사소통과 언어 사용
2장. 의사소통과 언어 사용
 
11장 시스템
11장 시스템11장 시스템
11장 시스템
 
10장 클래스
10장 클래스10장 클래스
10장 클래스
 
클러스터링을 통한 패턴 추출
클러스터링을 통한 패턴 추출클러스터링을 통한 패턴 추출
클러스터링을 통한 패턴 추출
 
정규확률분포
정규확률분포정규확률분포
정규확률분포
 

전문 검색 기술

  • 1. 아꿈사 박 기 덕 전문 검색 기술
  • 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 이다. • 특정 단어에 대한 문서내의 중요도 순위를 결정하는 단어의 출현빈도/역 출현빈도 활용 • 검색어가 많이 주어졌을 때 검색 대상 문서에 포함된 단어의 열과 비교