8. 역 파일 생성기 만들기
역 파일 생성기는 검색 효율을 높이기 위해 형태소 이름으로 포함하는 웹 페이지를 빠르게 검색할 수 있는 역 파일을 생성하는 엔진입니다.
역 파일 생성기는 웹 로봇에서 수집한 내용을 형태소 분석기로 분석한 결과를 역 파일 목록에 추가하는 작업을 수행합니다. 역 파일 목록에 추가하는 작업에서는 새로운 형태소를 발견하면 역 파일 목록에 형태소를 추가하고 추가한 형태소마다 테이블을 동적으로 생성합니다. 그리고 생성한 동적 테이블에 웹 페이지 주소와 참조 개수를 추가합니다. 대부분의 이를 수행할 수 있는 작업은 저장 프로시저로 만들었습니다.
여기에서는 미리 작성한 저장 프로시저를 이용하는 역 파일 생성기를 만듭시다.
역 파일 생성기에서는 검색 질의 내용에 포함한 형태소 이름으로 포함하고 있는 웹 사이트를 검색할 수 있게 하여 빠른 검색을 제공합니다. 그리고 여기에서는 페이지 내에 포함한 전체 형태소 개수에서 특정 형태소의 참조 개수를 기억하여 이를 기반으로 빈도에 따라 TF값을 산정할 수 있는 정보를 생성하고 보관합니다. 또한 전체 수집 페이지 개수와 특정 형태소를 포함하는 페이지 개수의 비율로 DF값을 산정할 수 있는 정보도 보관합니다.
따라서 여기에서 작성하는 역 파일 정보는 검색과 동시에 검색 결과를 순위화하는 랭커엔진에 필요한 정보를 생산하는 역할도 수행합니다.
[그림 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); } } } } |
'프로그래밍 기술 > 웹 검색 엔진 만들기' 카테고리의 다른 글
11. 2 웹 검색 엔진 관리자 응용 만들기 (0) | 2017.12.07 |
---|---|
11. 웹 검색 응용 만들기 (0) | 2017.12.07 |
10. 검색 서비스 만들기 (0) | 2017.12.07 |
9. 2 랭커 라이브러리 만들기 (0) | 2017.12.07 |
9. 랭커 만들기 (0) | 2017.12.07 |
7. 형태소 분석기 만들기 (0) | 2017.12.07 |
6.4.3 WebRobot 서비스 테스트 클라이언트 만들기 (0) | 2017.12.07 |
6.4.2 WebRobot 서비스 만들기 (0) | 2017.12.07 |
6. 4 웹 로봇 서비스 만들기 (0) | 2017.12.07 |
6. 3 웹 로봇 예광탄 구현 (0) | 2017.12.07 |