대규모서비스를지탱하는기술 7
-
Upload
hyeonseok-choi -
Category
Technology
-
view
265 -
download
1
Transcript of 대규모서비스를지탱하는기술 7
대규모 서비스를 지탱하는 기술Ch.7 알고리즘 실용화
chois79
13년 6월 25일 화요일
Ch.7 에서 다루는 내용
1. 대규모 데이터를 앞둔 알고리즘 선택의 중요성
2. 알고리즘을 제품에 적용하기까지 어떤 과정이 필요한가?
13년 6월 25일 화요일
대상이 되는 데이터가 크면 클수록 알고리즘이나 데이터 구조 선택이 속도에
영향을 미친다
13년 6월 25일 화요일
그럼 알고리즘이 무엇인가?
어떤 값 또는 값의 집합을 입력으로하고어떤 값 또는 값의 집합을 출력으로 하는
명확하게 정의된 계산 절차-Introduction to Algorithms
13년 6월 25일 화요일
알고리즘은 왜 배워야 하는가?
1. 컴퓨터 자원은 유한하다2. 엔지니어의 ‘공통 언어’3. 알고리즘을 알아둠으로써 새로운 문제에도 대처할 수 있다
13년 6월 25일 화요일
알고리즘의 평가 방법
Order표기법
어떤 함수의 증가 양상을 다른 함수와의비교로 표현하는 방법
13년 6월 25일 화요일
자주 사용되는 Order 표기
O(1) < O(log n) < O(n log n) < O (n2) < O (n3) ...O(nk) < O(2n)
대규모 데이터를 대상으로 한 경우n이 클 경우 실용성을 띄는 것은
O(n log n)까지
13년 6월 25일 화요일
데이터 구조알고리즘과 뗄레야 뗄 수 없는 관계
상수항알고리즘을 구현하는 중에 입력의 크기에
의존하지 않지만 실행하지 않으면 안되는 처리함수 호출, if문.. 등.
구현을 포함해서 생각할때는 상수항에 대한고려도 필요
그밖에 고려사항
13년 6월 25일 화요일
알고리즘의 실제 활용
13년 6월 25일 화요일
하테나 다이어리의키워드 링크
13년 6월 25일 화요일
키워드 링크란?
글을 작성하면 일부 키워드에 링크가 자동으로 걸려 클릭시 이 키워드를
설명하는 페이지로 이동하는 서비스
13년 6월 25일 화요일
최초 구현 방법
정규 표현으로 구현하는 단순한 방법을 채택
모든 단어를 OR 조건으로 잇는 정규 표현을 사용(foo|bar|baz ...)
$text =~ s/(foo|bar|baz)/&replace_keyword($1)/ge;
13년 6월 25일 화요일
문제 발생
키워드 갯수가 많이 늘어남!!
13년 6월 25일 화요일
특히 시간이 많이 걸리는 부분
1. 정규 표현을 컴파일 하는 처리 - 미리 정규 표현식을 만들어 저장해 둠으로써 해결
2. 정규표현에서 패턴 매칭하는 처리 - 키워드 링크가 완료된 본문을 캐싱처리 > 근본적인 해결책에 이르지 못함
13년 6월 25일 화요일
패턴매칭에 의한 키워드 링크의 문제점
정규표현식 알고리즘
패턴 매칭에 오토마톤을 사용패턴 매칭에 실패하면 다음 단어를 시도
(foo|bar|baz ... )
13년 6월 25일 화요일
정규표현을 Trie 방법으로
탐색대상 데이터의 공통 접두사를 모아 놓은 트리 구조엣지를 순회하면서 종단이 발견될 경우 단어가 포함된 것으로 간주
키워드의 양에 상관 없이 대상의 단어 길이 만큼만 계산
13년 6월 25일 화요일
Trie를 더 빠르게 AC법 도입패턴 매칭으로 진행되다가 도중에 실패했을 경우,
되돌아 오는 길의 엣지를 다시 Trie에 추가한 데이터 구조를 사용
되돌아 오는 길의 추가는 Trie의 루트부터 너비 우선 탐색으로 구성 가능
13년 6월 25일 화요일
CPAN 라이브러리의 Regexp::List로 치환
Trie에 의해 최적화한 방법을 지원하며,정규 표현식 사용이 가능
13년 6월 25일 화요일
직접 구현한 AC법VS. RegexpList
AC법을 직접 구현하여 도입함으로 계산량이 줄어들었지만정규 표현식의 각종 옵션을 쓰지 못하게 되어 유연성이 결여됨
Regex::List를 채택함으로써 계산량 및 유연성을 모두 확보
13년 6월 25일 화요일
키워드 링크 결론
정규 표현 => AC법 => Regexp:List
처음부터 최적의 구현을 사용하는 것이 옳다고 할 수 없음.데이터가 작은 동안에는 오히려 단순한 것이 결과도 좋음.
하지만, 대규모가 될 시기를 대비해서 본질적인 문제의 해결방법을 염두에 두는 것이 필요
13년 6월 25일 화요일
하테나 북마크의기사 분류
13년 6월 25일 화요일
기사 분류란?
새로 도착한 기사를 내용 기반으로 자동으로 분류하여 사용자에게 카테고리로 분류해서 보여주는 기능
하테나 기사 분류는 베이지안 필터라는 원리를 사용
13년 6월 25일 화요일
베이지안 필터의 원리
‘나이브 베이즈의 정리’를 기반으로 하는 알고리즘
P(C|D) 를 구하는 문제
D가 주어졌을때 C가 발생할 확률즉, D 문서가 주어졌을때 C 카테고리일 확률을 계산
13년 6월 25일 화요일
베이즈 정리
P(A|B) 를 계산 가능한 식으로 변경
P(A|B) * P(B) = P(A^B)P(A^B) = P(A) * P(B|A)
즉, P(A|B) = P(B|A) * P(A) / P(B)
13년 6월 25일 화요일
베이즈 정리를 적용
원하는 것은 확률 값이 아니라 카테고리 분류 즉, 모든 카테고리에 대한 확률의 우선 순위
P(C|D) = P(D|C) * P(C) / P(D)
모든 카테고리에 대해 P(D)는 같으므로 생략P(C), P(D|C)가 중요
13년 6월 25일 화요일
P(D|C), P(C) 구하기
P(C)특정 카테고리가 출현할 확률
학습 데이터를 통해 C가 나타날 확률을 구함
P(D|C)문서는 단어의 집합
즉, P(D|C) => P(W1|C) * P(W2|C) .. P(Wn|C)학습 데이터에서 단어마다 어느 카테고리로 분류되었는지
횟수를 보존한 후 P(D|C)의 근사값을 구함
13년 6월 25일 화요일
알고리즘이 실용화되기까지
베이지안 필터는 구조상으로 심플주요 부분은 스크립트 언어로 100 ~ 200 정도
But, 적용까지는...
13년 6월 25일 화요일
1. C++ 로 개발한 분류 엔진을 서버화2. 서버와 통신해서 결과를 얻는 Perl 클라이언트 작성,
웹 애플리케이션에서호출3. 학습 데이터를 정기적으로 백업할 수 있는 기능 추가4. 학습 데이터 1,000 건을 수작업으로 준비5. 바람직한 정밀도가 나오는지 추적하기 위한 통계 구조 작성 정밀도 튜닝6. 다중화를 고려해서 스탠바이 시스템 구성7. 웹 애플리케이션 사용자 인터페이스 마련
실무 면에서는 고려해야 할 점은 꽤 많다
실제 베이지안 필터 적용 과정
13년 6월 25일 화요일