프로그래밍 기술/웹 검색 엔진 만들기

9. 랭커 만들기

언제나휴일 2017. 12. 7. 10:54
반응형

9. 랭커 만들기


 

 랭커는 검색 요청이 오면 검색 질의에 근접한 웹 페이지를 순위화 해주는 엔진입니다. 여기에서는 라이브러리 형태로 제작할 것입니다.

 

 수 많은 자료 중에서 원하는 결과를 검색하면 검색 결과도 많을 수 있습니다. 이 때 사용자는 검색 결과에서 다시 원하는 결과를 검색하는 비용이 들 수 있습니다.

 

 자료의 양이 많아지면서 검색 엔진도 보다 효과적으로 검색 결과를 제공하기 위해 똑똑해지고 있습니다. 이를 위해 시멘틱 처리의 알고리즘이 필요한데 여기서 다루는 랭커는 시멘틱 처리를 하는 기본적인 알고리즘을 사용할 것입니다.

 

 랭커에서 순위를 매기는 방법은 다양한데 여기에서는 TF IDF 방식을 사용할 것입니다.

 

 TF Term Frequency의 약어로 특정 단어가 얼마나 자주 나오는지에 관한 값입니다. 따라서 문서에 특정 단어의 참조 개수를 문서의 전체 형태소 개수로 나눈 값입니다.

 

 IDF Inverse Document Frequecy의 약어로 특정 단어를 포함하는 문서가 얼마나 많은지에 따라 희귀성을 구하는 값입니다. DF값은 먼저 특정 단어를 포함하는 문서 개수를 전체 문서 개수로 나는 값입니다. 그리고 IDF값은 이를 역수를 취한 값인데 많은 곳에서는 이를 다시 log를 취해서 사용하고 있습니다.

 

 따라서 TF IDF 방식은 문서에 특정 단어가 나오는 빈도수인 TF로 해당 문서에 특정 단어의 중요도를 점검하고 IDF를 통해 전체 문서에서 해당 단어를 포함하는 문서의 빈도로 희귀성을 계산하는 것입니다.

 

 목적에 따라 검색하는 사용자의 연령이나 나이, 지역, 성별 등과 비슷한 이가 작성한 글에 가중치를 두어 랭커를 만들며 보다 효과적인 랭커를 만들 수 있습니다. 물론 목적에 맞는 인자를 선별하고 적당한 가중치를 찾는 작업이 필요한데 이러한 부분은 관련 논문을 참고할 수 있다면 이를 활용하는 것이 좋은 방법일 수 있습니다.

 

9.1 랭커 예광탄 만들기

 

 랭커 예광탄을 만들어봅시다. 랭커 예광탄에서는 사용자가 검색 질의를 입력하여 검색 요청하면 검색 결과를 리스트 창에 보여주고 리스트 목록의 항목을 선택하면 이에 관한 세부 정보를 보여주는 형태로 작성합시다.

 

[그림 9.1] 랭커 예광탄 메인 폼 자식 컨트롤 배치

[그림 9.1] 랭커 예광탄 메인 폼 자식 컨트롤 배치

  

번호

컨트롤 이름

컨트롤 유형

설명

1

lb_query_info

Label

정보 표시

2

tbox_query

TextBox

질의 입력 창

3

btn_search

Button

검색 버튼

4

lbox_plist

ListBox

검색 결과 목록

5

gb_detail

GroubBox

상세 정보 그룹 박스

6

lb_score_info

Label

정보 표시

7

lb_score

Label

평가 점수

8

lb_title_info

Label

정보 표시

9

lb_title

Label

타이틀

10

lb_paddr_info

Label

정보 표시

11

lb_paddr

Label

수집한 웹 페이지 주소

12

lb_oaddr_info

Label

정보 표시

13

lb_oaddr

Label

수집 요청 웹 페이지 주소

14

lb_depth_info

Label

정보 표시

15

lb_depth

Label

상대적 깊이

16

lb_date_info

Label

정보 표시

17

lb_date

Label

수집한 일시

18

lb_content_info

Label

정보 표시

19

tbox_content

TextBox

웹 페이지 내용

[ 9.1] 랭커 예광탄 메인 폼의 자식 컨트롤

  

 랭커 예광탄에서 만든 코드의 Ranker 클래스는 RankerLib로 다시 만들 부분이며 중복 기재없이 랭커 라이브러리 만들기에서 소스 설명을 할게요.

 

 먼저 검색 요청 버튼 클릭 이벤트 핸들러를 추가합니다.

private void btn_search_Click(object sender, EventArgs e)

 

 이벤트 핸들러에서는 정적 클래스 Ranker의 검색 요청 메서드를 통해 순위화 한 페이지 개체 컬렉션을 얻어옵니다. 그리고 얻어온 항목을 검사 결과 목록 창에 추가합니다.

List<RankedUrl> list = Ranker.Request(tbox_query.Text);

foreach (RankedUrl rurl in list)

{

    lbox_plist.Items.Add(rurl);

}

 

 검사 결과 목록의 선택 변경 이벤트 핸들러를 추가합니다.

private void lbox_plist_SelectedIndexChanged(object sender, EventArgs e)

 

 이벤트 핸들러에서는 선택 항목이 없을 때에는 아무 작업없이 끝냅니다.

if (lbox_plist.SelectedIndex == -1)

{

    return;

}

 

 선택한 항목을 순위화 한 페이지 개체로 참조합니다. 그리고 개체의 속성으로 컨트롤의 속성을 설정합니다.

RankedUrl rurl = lbox_plist.SelectedItem as RankedUrl;

lb_score.Text = rurl.Score.ToString();

PostedUrl purl = rurl.PUrl;

lb_title.Text = purl.Title;

lb_paddr.Text = purl.Url;

lb_oaddr.Text = purl.OriginUrl;

lb_depth.Text = purl.Depth.ToString();

lb_date.Text = purl.PostedTime.ToString();

tbox_content.Text = purl.Content;

 

 

MainForm.cs

using System;

using System.Collections.Generic;

using System.Windows.Forms;

using WSE_Core;

using RankerLib;

 

namespace Ranker_예광탄

{

    public partial class MainForm : Form

    {

        public MainForm()

        {

            InitializeComponent();

        }

 

        private void btn_search_Click(object sender, EventArgs e)

        {

            List<RankedUrl> list = Ranker.Request(tbox_query.Text);

 

            foreach (RankedUrl rurl in list)

            {

                lbox_plist.Items.Add(rurl);

            }

            

        }

 

        private void lbox_plist_SelectedIndexChanged(object sender, EventArgs e)

        {

            if (lbox_plist.SelectedIndex == -1)

            {

                return;

            }

 

            RankedUrl rurl = lbox_plist.SelectedItem as RankedUrl;

 

            lb_score.Text = rurl.Score.ToString();

            PostedUrl purl = rurl.PUrl;

 

            lb_title.Text = purl.Title;

            lb_paddr.Text = purl.Url;

            lb_oaddr.Text = purl.OriginUrl;

            lb_depth.Text = purl.Depth.ToString();

            lb_date.Text = purl.PostedTime.ToString();

            tbox_content.Text = purl.Content;

        }

    }

}

 

반응형