35
May 15, 2015 Ian Y. Choi

집단 지성 (Programming collective intelligence) 스터디: Chapter 4 - Searching & Ranking

Embed Size (px)

Citation preview

May 15, 2015 Ian Y. Choi

2

• iPython notebook file • h"ps://goo.gl/WU8hS0  

• Data files (including iPython notebook file) • h"ps://goo.gl/HvE7lb  

3

목차 •  Section 1: 검색엔진이란?

•  Section 2: 단순 크롤러

•  Section 3: 색인하기

•  Section 4: 검색하기

•  Section 5: 내용 기반 랭킹

•  Section 6: 유입 링크 사용하기

•  Section 7: 클릭 학습

•  (Section 8: 함께 풀어보기)

4

0. Before Diving into… - (1) •  정보 검색 (Information retrieval)

•  정보 자원의 집합으로부터 필요로 하는 정보에 적합한 정보 자원을 얻는 행동 (from Wikipedia)

•  검색엔진 •  사람들이 입력한 단어 몇 개로 많은 문서들을 찾고 그 단어들에 가장 연관도가 높은 순으로 결과를 정렬 (from 스터디 교재)

•  인터넷의 발전과 함께 웹 (WWW, World-Wide Web)의 정보를 효율적으로 검색하기 위한 다양한 검색엔진들이 등장 & 발전

6

검색엔진 •  검색엔진 (Search Engine) 만들기

문서 수집 방법 색인 랭킹 신경망

•  크롤링 (crawling)

•  고정 문서 컬렉션 (예: 기업 인트라넷)

•  데이터베이스 이용 : 단어 위치 / 문서 저장

•  문서 위치 참조 (reference)만 저장 : 파일 시스템 경로, URL

•  Magic : 결과 정렬 방식!

•  페이지랭크 (PageRank) 알고리즘

•  클릭한 링크를 기반으로 검색어와 결과 간의 연관 정도 학습

•  과거에 많이 클릭했던 것이 더 상위에 위치하도록 순서 변경

7

Python 모듈: searchengine •  85-86p: 크롤링 기능에 대해 Python 클래스 구조를 작성

크롤러 (Crawler)

[내부 작업] __init__() __del__()

dbcommit()

getentryid()

addtoindex()

gettextonly() separatewords() isindexed()

addlinkref()

crawl()

createindextables() 항목 번호를 얻고 등재되지 않았다면 추가

개별 페이지를 색인함

HTML 페이지에서 텍스트 추출함 공백문자가 아닌 문자들로 단어 분리

이미 색인한 주소인지 확인 두 페이지간 링크 추가

페이지 목록에서 depth까지 색인

데이터베이스 테이블 생성

(sqlite)

색인 데이터

9

단순 크롤러 •  크롤링 (Crawling) / 스파이더링 (Spidering)

•  색인할 작은 페이지 집합에서 시작하여 페이지 내 링크를 따라 다른 페이지들을 반복해서 찾는 과정

•  Beautiful Soap •  웹 페이지를 파싱하고 구조적 표현을 생성하는 라이브러리 •  “pip install beautifulsoup4” è 사용시 “from BeautifulSoup” à “from bs4”

•  참고: Canopy에는 이미 포함되어 있을수도?

10

참고: 크롤링 •  영화 정보 일부 가져와 사용하기

http://developer.naver.com/wiki/pages/SrchMovie - Naver 검색 API: 하루 최대 25,000개 요청 제한

12

Sqlite란 •  Sqlite

•  파일을 데이터베이스로 사용 가능하게 함

•  Pysqlite •  Python에서 sqlite를 사용 가능하게 하는 라이브러리 •  Canopy에 포함되어 있지 않아 추가 설치 필요

13

Sqlite 관련 클래스 내 코드 •  클래스 searchengine

•  클래스 사용 시작시에 지정한 DB 파일과 연결

•  클래스 사용 종료시 DB 파일 사용 종료

•  dbcommit 함수 실행하면 DB 파일에 커밋 (기록)

def  __init__(self,dbname):      self.con=sqlite.connect(dbname)  

def  __del__(self):      self.con.close()  

def  dbcommit(self):      self.con.commit()  

크롤러 (Crawler) 크롤러 사용 시작 전 실행

크롤러 다 사용하면 실행

DB에 기록

(sqlite) 함수

함수

함수…

크롤링 데이터

14

스키마 설정하기

색인된 URL 목록

단어 목록

문서들 내의 단어 위치 목록

[문서 간 링크] 한 테이블에서 다른 테이블로의 연결을 가리키는 2개의 URL ID 저장

[문서 간 링크] 링크에서 사용된 단어들을 저장

15

페이지 내 단어 찾기 •  gettextonly 함수

•  Argument: soup 객체 •  What to do: Soup을 사용해서 텍스트 노드를 찾고 내용 모으기

•  separatewords 함수 •  Argument: text •  What to do: 텍스트를 단어별로 구분한 리스트를 반환 •  참고: \W è 알파벳이나 소문자를 제외한 문자 (정규 표현식)

•  Python에서는 \\ 로 써야 정규 표현식으로 인식함 à \\W* è \W* (*은 0개 이상을 의미) •  본인의 경우 “import re”를 해야 했음 (https://docs.python.org/2/library/re.html)

•  참고: 스테밍 (stemming) 알고리즘 •  단어를 어근 (stem)으로 변환

•  예: indexing à index •  “index” 단어를 검색할 때, “indexing”도 나오게 하기 위함

16

참고: 스테머 (Stemmer)

Source: http://konlpy.org Source: Michael L. Nelson, “Collective Intelligence – Week 3: Crawling, Searching, Ranking”

17

색인에 넣기 •  addtoindex 함수

•  Argument: url, soup •  What to do: soup 객체로부터 텍스트를, 텍스트로부터 단어를 가져와 “(url, 단어들)” 정보를 색인에 추가

•  getentryid 함수 •  Argument: table, field, value, createNew •  What to do: “table”에서 field가 value인 ID값을 찾아 반환, 없으면 추가

•  isindexed 함수 •  Argument: url •  What to do: URL이 이미 색인되어 데이터베이스에 저장되어 있는지 확인

19

검색 클래스: searcher •  크롤링된 데이터를 기반으로 “복합어 검색”을 수행하는 역할을 하는 클래스

검색 (Searcher)

[내부 작업] __init__() __del__()

dbcommit()

getmatchrows()

스페이스바로 구분된 단어들을 기반으로 색인 데이터에서 검색 수행하여 결과 행 반환

(sqlite) (sqlite)

색인 데이터

20

참고: 테이블과 테이블의 관계 à join

22

내용 기반 랭킹이란? •  이제까지 구현한 검색결과: 단순 크롤링된 순서

•  문서 관련성 등에 ‘가중치’ (weight)를 두어 먼저 나오도록 조정이 필요

•  ‘가중치’ 점수 지표 •  단어 빈도

•  단어가 많이 나올수록 결과 먼저 •  문서 내 위치

•  문서 핵심 주제가 도입부에 있을 가능성이 높음 •  단어 거리

•  검색 단어들이 가까이 있을 경우 찾고자 하는 문서일 확률이 높음

23

검색 클래스: 가중치 관련 함수 추가/수정 •  가중치 값과 함께 결과 출력

검색 (Searcher)

[내부 작업] __init__() __del__()

dbcommit()

getmatchrows()

스페이스바로 구분된 단어들을 기반으로 색인 데이터에서 검색 수행하여 결과 행 반환

(sqlite) (sqlite)

색인 데이터

getscoredlist()

가중치를 고려해 점수를 곱하여 전체 결과 반환

geturlname()

query()

Urlid로 url 이름을 찾아 반환

1.  getmatchrows 호출해 검색

2.  getscoredlist 호출해 가중치 계산된 내용 가져옴

3.  결과를 역순으로 정렬 (점수 높을수록 결과 처음에 나오게 하기)

4.  각 결과를 geturlname 사용해 정보 출력

24

검색 클래스: 정규화 & 가중치 함수 •  정규화 함수

•  가중치를 계산하는 ‘단어 빈도’, ‘문서 내 위치’, ‘단어 거리’ 등이 모두 0~1 사이의 값이 나타나도록 하기

•  구현: normalizescores 함수

•  가중치 함수 •  단어 빈도 •  문서 내 위치 •  단어 거리

26

PageRank 알고리즘

•  예 (damping factor: 0.85) •  PR (A) = 0.15 + 0.85 * ( PR(B) / links(B) +

PR(C)/links(C) + PR(D)/links(D) ) = 0.15 + 0.85 * (0.5/4+0.7/5+0.2/1) = 0.15 + 0.85 * (0.125 + 0.14 + 0.2) = 0.54525

28

신경망 – 뇌 (Brain)

The brain is a highly complex, nonlinear, and parallel computer (information processing system)

The brain consists of neurons (small information Processing units)

The brain performs much faster computations (e.g., pattern recognition, perception, motor control) Than the fastest digital computer in existence today.

Source: Seungjin Choi, “Neural Computation – Introduction to Computer Science”, 2002

29

신경망 – Neural Computation (Neural Networks)

A neural network is a machine that is designed to model the way in which the brain performs a particular task of function of interest.

Neural networks employ a massive interconnections of Simple computing cells referred to as neurons.

Source: Seungjin Choi, “Neural Computation – Introduction to Computer Science”, 2002

30

신경망 – 뉴런 (Neuron) dendrite

nucleus

axon

pre/post synaptic

수상돌기

축색

시냅스 전/후부

Source: Seungjin Choi, “Neural Computation – Introduction to Computer Science”, 2002

31

신경망 ~> 인공신경망 (artificial neural networks)

input

Hidden layer

output

Source: Seungjin Choi, “Neural Computation – Introduction to Computer Science”, 2002

32

인공신경망

클릭 학습 (Learning from Clicks) •  클릭 학습을 구현하려면?

•  색인 단어들을 통해 학습되지 않은 인공신경망을 먼저 만들기

•  네트워크 연결 활성화 & 출력까지 연결 •  전방전파 알고리즘

(feedforward) •  검색 결과 + 사용자 클릭을 반영한 학습 •  역전파 학습

(backpropagation) •  검색 엔진에 연결

웹 (데이터베이스)

[입력] 검색단어

[출력] 검색결과

검색

(rel.) (rel.)

word word

url

[입력] 검색단어

[출력] 검색결과

input

Hidden layer

output

33

클릭학습 예시: 학습을 통한 노드 결과

34

참고: 쌍곡선함수 (Hyperbolic 함수)

Finished!