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

8. 역 파일 생성기 만들기

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

8. 역 파일 생성기 만들기


 

 역 파일 생성기는 검색 효율을 높이기 위해 형태소 이름으로 포함하는 웹 페이지를 빠르게 검색할 수 있는 역 파일을 생성하는 엔진입니다.

 

 역 파일 생성기는 웹 로봇에서 수집한 내용을 형태소 분석기로 분석한 결과를 역 파일 목록에 추가하는 작업을 수행합니다. 역 파일 목록에 추가하는 작업에서는 새로운 형태소를 발견하면 역 파일 목록에 형태소를 추가하고 추가한 형태소마다 테이블을 동적으로 생성합니다. 그리고 생성한 동적 테이블에 웹 페이지 주소와 참조 개수를 추가합니다. 대부분의 이를 수행할 수 있는 작업은 저장 프로시저로 만들었습니다.

 

 여기에서는 미리 작성한 저장 프로시저를 이용하는 역 파일 생성기를 만듭시다.

 

 역 파일 생성기에서는 검색 질의 내용에 포함한 형태소 이름으로 포함하고 있는 웹 사이트를 검색할 수 있게 하여 빠른 검색을 제공합니다. 그리고 여기에서는 페이지 내에 포함한 전체 형태소 개수에서 특정 형태소의 참조 개수를 기억하여 이를 기반으로 빈도에 따라 TF값을 산정할 수 있는 정보를 생성하고 보관합니다. 또한 전체 수집 페이지 개수와 특정 형태소를 포함하는 페이지 개수의 비율로 DF값을 산정할 수 있는 정보도 보관합니다.

 

 따라서 여기에서 작성하는 역 파일 정보는 검색과 동시에 검색 결과를 순위화하는 랭커엔진에 필요한 정보를 생산하는 역할도 수행합니다.

 

[그림 8.1] 역 파일 생성기 예광탄 메인 폼 자식 컨트롤 배치

[그림 8.1] 역 파일 생성기 예광탄 메인 폼 자식 컨트롤 배치 

 

번호

컨트롤 이름

컨트롤 유형

설명

1

gp_posted

GroupBox

수집한 웹 정보 그룹 박스

2

lb_title_info

Label

정보 표시

3

tbox_title

TextBox

타이틀 입력 창

4

lb_paddr_info

Label

정보 표시

5

tbox_paddr

TextBox

수집한 웹 사이트 주소 입력 창

6

lb_oaddr_info

Label

정보 표시

7

tbox_oaddr

TextBox

수집 요청한 사이트 주소 입력 창

8

lb_depth_info

Label

정보 표시

9

nud_depth

NumericUpDown

상대적 깊이

10

lb_pdate_info

Label

정보 표시

11

dtp_posted

DateTimePicker

수집한 일시

12

lb_content_info

Label

정보 표시

13

tbox_content_info

TextBox

수집한 페이지 내용 입력 창

14

btn_parse

Button

형태소 분석 버튼

15

lb_result_info

Label

정보 표시

16

lv_result

ListView

분석 결과 목록

17

ch_name

ColumnHeader

컬럼 헤더(형태소 이름)

18

ch_rcnt

ColumnHeader

컬럼 헤더(참조 개수)

19

gv_inv_file

GroupBox

역 파일 그룹 박스

20

lb_mname_info

Label

정보 표시

21

tbox_mname

TextBox

형태소 이름 입력 창

22

btn_ref_inv

Button

역 파일 참조 버튼

23

lv_mo_site

ListView

역 파일 상세 정보 목록

24

ch_addr

ColumnHeader

페이지 주소

25

ch_refcnt

ColumnHeader

참조 개수

[ 8.1] 역 파일 생성기 메인 폼의 자식 컨트롤

 

 

8.1 역 파일 생성기 예광탄 만들기

 

 먼저 분석하기 버튼 클릭 이벤트 핸들러를 추가합니다.

private void btn_parse_Click(object sender, EventArgs e)

 

 컨트롤에 입력한 정보를 이용하여 수집한 웹 페이지 정보 개체를 생성합니다. 여기에서 입력하는 것은 가상의 데이터입니다. 부분적으로 단위 테스트를 하기 위해 가상의 데이터를 입력하는 것입니다.

PostedUrl purl = new PostedUrl();

purl.Title = tbox_title.Text;

purl.Url = tbox_paddr.Text;

purl.OriginUrl = tbox_oaddr.Text;

purl.Depth = (int)nud_depth.Value;

purl.PostedTime = dtp_posted.Value;

purl.Content = tbox_content.Text;

 

 이미 작성한 형태소 분석기 라이브러리를 참조하여 정적 클래스 MorphemeParser의 메서드 Parse를 이용하여 페이지의 컨텐츠 내용을 분석합니다.

List<Morpheme> list = MorphemeParser.Parse(purl.Content);

 

 분석한 결과를 결과 창에 출력합니다. 이 부분은 별도의 메서드로 작성합시다.

AddMorpheme(list);

 

 마지막으로 검색한 결과로 역 파일을 만듭니다. 역 파일을 만드는 것은 역 파일 라이브러리로 만들 것이므로 여기에서는 라이브러리에 만들 클래스를 미리 만들어서 사용합시다. 역 파일 라이브러리는 예광탄 설명 뒤에 별도로 설명할게요.

InvFileMaker.MakeInvFile(purl.Url, list);

 

 분석한 결과를 출력하는 메서드를 작성합시다.

private void AddMorpheme(List<Morpheme> list)

 

 먼저 결과를 출력할 리스트 컨트롤의 아이템 항목을 지워줍니다.

lv_result.Items.Clear();

 

 입력 인자로 받은 형태소 목록의 각 항목을 리스트 컨트롤 항목으로 생성하여 목록에 추가합니다.

ListViewItem lvi = null;

foreach (Morpheme mo in list)

{

    lvi = new ListViewItem(

               new string[2] { mo.Name, mo.Count.ToString() });

    lv_result.Items.Add(lvi);

}

 

 이번에는 역 파일 참조 버튼 클릭 이벤트 핸들러를 추가하세요.

private void btn_ref_inv_Click(object sender, EventArgs e)

 

 먼저 역 파일 상세 목록을 지워줍니다.

lv_mo_site.Items.Clear();

 

 검색을 위해 만든 WSEForSearch 라이브러리를 참조하여 EHDbmForSearch 정적 클래스의 GetInvertedFile 메서드를 이용하여 역 파일 목록을 얻어옵니다.

List<InvertedElem> list = null;

list = EHDbmForSearch.GetInvertedFile(tbox_mname.Text);

 

 얻어온 목록으로 리스트 뷰 컨트롤 항목을 생성하여 목록에 추가합니다.

ListViewItem lvi = null;

foreach (InvertedElem ie in list)

{

    lvi = new ListViewItem(

                new string[2] { ie.Url, ie.RefCount.ToString() });

    lv_mo_site.Items.Add(lvi);

}

 

MainForm.cs

using System;

using System.Collections.Generic;

using System.Windows.Forms;

using WSE_Core;

using MorphemeParserLib;

using DBMForSearchLib;

using InvFileMakerLib;

 

namespace InvFileMaker_예광탄

{

    public partial class MainForm : Form

    {

        public MainForm()

        {

            InitializeComponent();

        }

        private void btn_parse_Click(object sender, EventArgs e)

        {

            PostedUrl purl = new PostedUrl();

            purl.Title = tbox_title.Text;

            purl.Url = tbox_paddr.Text;

            purl.OriginUrl = tbox_oaddr.Text;

            purl.Depth = (int)nud_depth.Value;

            purl.PostedTime = dtp_posted.Value;

            purl.Content = tbox_content.Text;

 

            List<Morpheme> list = MorphemeParser.Parse(purl.Content);

            AddMorpheme(list);

            InvFileMaker.MakeInvFile(purl.Url, list);

        }

        private void AddMorpheme(List<Morpheme> list)

        {

            lv_result.Items.Clear();

 

            ListViewItem lvi = null;

            foreach (Morpheme mo in list)

            {

                lvi = new ListViewItem(

                    new string[2] { mo.Name, mo.Count.ToString() });

                lv_result.Items.Add(lvi);

            }

        }

 

        private void btn_ref_inv_Click(object sender, EventArgs e)

        {

            lv_mo_site.Items.Clear();

 

            List<InvertedElem> list = null;

            list = EHDbmForSearch.GetInvertedFile(tbox_mname.Text);

 

            ListViewItem lvi = null;

            foreach (InvertedElem ie in list)

            {

                lvi = new ListViewItem(

                    new string[2] { ie.Url, ie.RefCount.ToString() });

                lv_mo_site.Items.Add(lvi);

            }

        }

    }

}

 

8.2 역 파일 생성기 라이브러리 만들기

 

 역 파일 생성기 라이브러리를 만듭시다. 여러분께서는 먼저 예광탄에 작성한 후에 정상적으로 동작하는 것을 확인한 후에 라이브러리로 만드세요.

 

 역 파일 생성기 라이브러리에는 역 파일을 생성하는 클래스를 제공합시다. 이 클래스에서도 어떠한 상태 값을 유지할 필요가 없으므로 정적 클래스로 작성하세요.

public static class InvFileMaker

 

 역 파일을 만드는 메서드를 제공합시다. 이 부분은 역 파일 생성기 예광탄에서 호출합니다. 실제 시나리오에서는 웹 페이지를 수집한 후 형태소를 분석하고 난 뒤에 호출할 메서드입니다.

public static void MakeInvFile(string url, List<Morpheme> list)

 

 WSEDbmForAll 라이브러리를 참조하여 EHDbmForAll 정적 클래스에 웹 사이트 주소와 전체 형태소 개수를 기록하는 AddMCPostedInfo 메서드를 호출합니다.

EHDbmForAll.AddMCPostedInfo(url, list.Count);

 

 그리고 형태소 목록을 추가합니다. 이 부분은 별도의 메서드로 작성합시다.

AddMorphemes(url, list);

 

 형태소 목록을 추가하는 메서드를 작성합시다.

private static void AddMorphemes(string url, List<Morpheme> list)

 

 정적 클래스 EHDbmForAll AddMorphemeInfo 메서드를 이용하여 사이트 주소와 형태소를 추가합니다.

foreach (Morpheme mo in list)

{

    EHDbmForAll.AddMorphemeInfo(url, mo);

}

 

InvFileMaker.cs

using System.Collections.Generic;

using DBM_ForAll;

using WSE_Core;

namespace InvFileMakerLib

{

    /// <summary>

    ///  파일 생성기 - 정적 클래스

    /// </summary>

    public static class InvFileMaker

    {

        /// <summary>

        ///  파일 만들기 메서드

        /// </summary>

        /// <param name="url">사이트 주소</param>

        /// <param name="list">형태소 목록</param>

        public static void MakeInvFile(string url, List<Morpheme> list)

        {

            EHDbmForAll.AddMCPostedInfo(url, list.Count);

            AddMorphemes(url, list);

        }

        private static void AddMorphemes(string url, List<Morpheme> list)

        {

            foreach (Morpheme mo in list)

            {

                EHDbmForAll.AddMorphemeInfo(url, mo);

            }

        }

    }

}

 

 

반응형