_ Ch ng trình s tìm ki m t trong trang web offline (đã t i v t ngu n Internet).
_ Qui trình th c thi c a ch ng trình:
• Quét file, th m c trong th m c root (do ng i l p trình đnh s n).
• Tìm t p tin HTML. N u có s x lý t p tin HTML (đánh ch m c, …). Ng c l i quét ti p th m c con đ l y t p tin HTML cho đ n khi nào h t.
Root Folder Path
_ Scan all folders and files. _ Having folders and files ?
Are there HTML or HTM files ?
YES
NO
_ Open this file _ Scan all words to index
_ Save results in cache YES
NO
II. Mơ hình ch ng trình:
1. Ý NGH A:
_ CATALOG qu n lý danh sách các WORD.
_ WORD qu n lý danh sách các FILE. 2. L p FILE:
_ Ch a thông tin c a t p tin mà ch ng trình quét đ c.
_ Thu c tính:
• Url: đ ng d n đ n t p tin HTML.
• Title: t a đ t p tin HTML.
• FileDate: th i gian mà t p tin đ c quét.
• Size: dung l ng t p tin.
• Description: chú thích t p tin HTML.
_ Ph ng th c:
• Kh i t o: File(url, title, filedate, size, desc). 3. L p WORD:
_ Ch a danh sách các FILE mà ch ng trình quét đ c.
_ Thu c tính: 1 1...n 1...n 1 Catalog index: Hashtable Catalog () Add (word, file)
Search (word): Hashtable
Word
text: string
fileCollection: Hashtable Word (text, file)
Add (file) InFiles(): Hashtable File url: string title: string fileDate: Date size: long int Desc: string
Lê Nguy n ồn Trí – 0851010294 53/70 Võ Nguy n Minh Tuân - 0851010308
• fileCollection (Hashtable): ch a danh sách các FILE.
• Text (String) : t .
_ Ph ng th c:
• Kh i t o: Word (text, file)
• Thêm: Add (file)
• L y danh sách t p tin: Hashtable InFiles() 4. L p CATALOG: _ Ch a danh sách các WORD. _ Thu c tính: • Index (Hashtable) _ Ph ng th c: • Kh i t o: Catalog ()
• Thêm: Add (word, file)
_ Tìm ki m: Hashtable Search (word) 5. T p tin Crawler.aspx:
_ Xây d ng CATALOG và l u k t qu vào cache. 6. T p tin Home.aspx:
_ Truy v n CATALOG t cache và cho phép tìm ki m t mà ng i dùng nh p vào.
III. Chi ti t ch ng trình: 1. L p FILE:
public class File {
public string Url; public string Title;
public string Description; public DateTime CrawledDate; public long Size;
DateTime datecrawl, long length) { Url = url; Title = title; Description = description; CrawledDate = datecrawl; Size = length; }
public override string ToString() {
return "\tFILE :: " + Url + " -- " + Title + " - " +
Size + " bytes + \n\t" + Description + "\n"; }
}
2. L p WORD:
using System.Collections; public class Word
{
//chua tu da co trong danh muc (co trong Catalog)
public string Text;
// Danh sach cac file co tu xuat hien trong do. private Hashtable fileCollection = new Hashtable();
// Thiet lap voi file duoc tham chieu dau tien. public Word(string text, File inFile, int position) {
Lê Nguy n oàn Trí – 0851010294 55/70 Võ Nguy n Minh Tuân - 0851010308
Text = text;
fileCollection.Add(inFile, 1); }
// Them file dang tham chieu tu dang xet public void Add(File inFile, int position) {
// If da co file trong ds thi cong gia tri them 1 if (fileCollection.ContainsKey(inFile))
{
/*int nWordCount = (int)fileCollection[inFile];
fileCollection[inFile] = nWordCount + 1;*/ fileCollection[inFile] = (int)fileCollection[inFile] + 1; } else { fileCollection.Add(inFile, 1); } }
// Tra ve ds file chua tu (gia tri la wordCount) public Hashtable InFiles()
{
}
public override string ToString() {
string temp = "";
foreach (object tempFile in fileCollection.Values) temp += ((File)tempFile).ToString();
return "\tWORD :: " + Text + "\n\t\t" + temp + "\n"; } } 3. L p CATALOG: using System.Collections; using System.IO; using System.Text.RegularExpressions; public class Catalog
{
// Ds doi tuong Word private Hashtable index;
public Catalog() {
index = new Hashtable(); }
public int Length {
Lê Nguy n ồn Trí – 0851010294 57/70 Võ Nguy n Minh Tuân - 0851010308
{
return index.Count; }
}
// Them cap Word/File vao Catalog (dua no vao index) public bool Add(string word, File inFile, int position) {
// xet dieu kien de tu muon them chi duoc index 1 lan // if tu muon them da dc index thi add file tham chieu
do vao doi tuong Word
// Nguoc lai thi them word vao index if (index.ContainsKey(word))
{
Word theWord = (Word)index[word]; theWord.Add(inFile, position); }
else {
Word theWord = new Word(word, inFile, position); index.Add(word, theWord);
}
return true; }
// Tra ve tat ca files co chua tu duoc search (Dau ra la Hashtable)
{ searchWord = searchWord.Trim('?', '\"', ',', '\'', ';', ':', '.', '(', ')').ToLower(); /// <summary> /// If tu do co trong index
/// thi dung phuong thuc InFiles cua Word obj tra
ve ds file chua tu do
/// Nguoc lai thi tra ve null /// </summary>
Hashtable retVal = null;
if (index.ContainsKey(searchWord)) {
Word theWordMatch = (Word)index[searchWord]; retVal = theWordMatch.InFiles();
}
return retVal; }
public override string ToString() {
string wordlist = "";
return "\nCATALOG :: " + index.Values.Count.ToString()
+ " words.\n" + wordlist; }
Lê Nguy n ồn Trí – 0851010294 59/70 Võ Nguy n Minh Tuân - 0851010308
4. Crawler.aspx:
_ Nhi m v đ u tiên là xây d ng các t p tin HTML mà chúng ta mu n tìm ki m.
_ Có 2 cách đ tìm t p tin:
• Spidering – b t/theo các đ ng d n (link) trong toàn b website (ho c các trang web).
• Crawling – vi c thu th p d li u s thông qua các t p tin, th m c và l p ch m c t t c các t p tin trong th m c đó b ng cách s d ng t p tin h th ng.
_ ch ng trình này chúng em hi n th c ch ng trình theo cách th 2.
private void CrawlCatalog(string sRoot, string sPath)
{
DirectoryInfo m_dir = new DirectoryInfo(sPath);
// Tao vong lap lay files
foreach (FileInfo fInfo in m_dir.GetFiles(m_filter)) {
Response.Write(DateTime.Now.ToString("t") + " " + m_url + sPath.Substring(m_path.Length) + "\\" + fInfo.Name);
Response.Flush();
// <Phan code o day da thu gon de dien giai phia duoi>
} // foreach xu ly (danh dau/phan tich) noi dung file
foreach(DirectoryInfo d in m_dir.GetDirectories()) {
CrawlCatalog(sRoot, sPath + "\\" + d.Name); }// het lap quet folder
}// CrawlCatalog
Hình 4: Thu th p các t p tin – đã t i v t trang http://www.java2s.com/
_ Q trình th c hi n craw:
• L y danh sách t p tin và th m c trong th m c g c (đã hồn thành).
• M t p tin đ u tiên và đ c n i dung c a nó.
• Tìm tiêu đ (Title), mơ t (Description) và tính kích th c t p tin HTML.
• T o đ ng d n URL c a t p tin đó (khi craw ch ng trình s l y đ ng d n h th ng. Vì v y ph i t o đ ng d n URL đ
ng i dùng click vào k t qu đ d n đ n trang web đó)
Lê Nguy n ồn Trí – 0851010294 61/70 Võ Nguy n Minh Tuân - 0851010308
• Thêm m i WORD vào CATALOG và đ ng d n URL t p tin ch a t .
• óng t p tin đang xét và m t p tin ti p theo. N u đã quét h t t p tin trong th m c đó thì qt th m c ti p theo.
• Quét cho đ n khi khơng cịn t p tin.
_ Có 3 cơng vi c chính ph i làm:
• M t t c các t p tin tìm th y - s d ng không gian tên System.IO.
DirectoryInfo m_dir = new DirectoryInfo(sPath);
// Tao vong lap lay files
foreach (FileInfo fInfo in m_dir.GetFiles(m_filter)) { Response.Write(DateTime.Now.ToString("t") + " " + m_url + sPath.Substring(m_path.Length) + "\\" + fInfo.Name); Response.Flush(); sFileUrl = m_url + sPath.Substring(m_path.Length).Replace("\\", "/") + "/" + fInfo.Name;
StreamReader reader = System.IO.File.OpenText(sPath + "\\" + fInfo.Name);
// Do noi dung trang web vao sFileContents sFileContents = reader.ReadToEnd();
reader.Close();
• Tìm ki m nh ng ch đ c bi t trong t p tin (title, description,…) – s d ng không gian tên System.String ho c System.RegularExpressions
Match TitleMatch = Regex.Match(sFileContents,
"<title>([^<]*)</title>", RegexOptions.IgnoreCase |
RegexOptions.Multiline);
sFileTitle = TitleMatch.Groups[1].Value;
// ----- Xu ly the META data -----
Match DescriptionMatch = Regex.Match(sFileContents,
"<META NAME=\"DESCRIPTION\" CONTENT=\"([^<]*)\">",
RegexOptions.IgnoreCase | RegexOptions.Multiline);
sFileDesc = DescriptionMatch.Groups[1].Value;
// ----- Lay kich thuoc ----- nFileSize = sFileContents.Length;
// ----- Lay noi dung tap tin (Loai bo cac the HTML) -----
string sWordsOnly = stripHtml(sFileContents);
// ----- Thu thap META DESC -----
if (sFileDesc == null || sFileDesc == String.Empty) { if (sWordsOnly.Length > 350) sFileDesc = sWordsOnly.Substring(0, 350); else if (sWordsOnly.Length > 100) sFileDesc = sWordsOnly.Substring(0, 100); else sFileDesc = sWordsOnly; }
Lê Nguy n ồn Trí – 0851010294 63/70 Võ Nguy n Minh Tuân - 0851010308
• Phân tích thành nh ng t riêng l - s d ng không gian tên System.RegularExpressions.
protected string stripHtml(string sHTML) {
// Bo the HTML
Regex objRegExp = new Regex("<(.|\n)+?>");
// Thay cac the bang khoang trang
string sOutPut = objRegExp.Replace(sHTML, " ");
// Doi <,> thanh < and >
sOutPut = sOutPut.Replace(">", "<"); sOutPut = sOutPut.Replace("<", ">");
return sOutPut; }
• Xóa các kho ng tr ng khơng c n thi t
Regex r = new Regex(@"\s+"); // Loai bo khoang trang
sWordsOnly = r.Replace(sWordsOnly, " "); // Loai bo nhung khoang trang thua
string[] sWordsOnlyCompressWhitespace = sWordsOnly.Split(' ');
_ Thêm WORD vào CATALOG (T o n i dung cho CATALOG)
// Lap vong quet all tu cua file
int i = 0; // Vi tri cua tu tong file string sKey = "";
// Dua all tu vao catalog
foreach (string sWord in sWordsOnlyCompressWhitespace)
{
sKey = sWord.Trim(' ', '?', '\"', ',', '\'', ';', ':', '.', '(', ')').ToLower();
m_catalog.Add(sKey, inFile, i);
i++; }
4. Xây d ng ph ng th c Search
_ Sau khi catalog đ c xây d ng thì:
• CATALOG ch a danh sách các WORD.
• WORD ch a danh sách các FILE.
_ u vào là t mu n tìm.
_ u ra là danh sách các FILE mà ch a t đó.
public Hashtable Search(string searchWord)
{ searchWord = searchWord.Trim('?', '\"', ',', '\'', ';', ':', '.', '(', ')').ToLower(); /// <summary> /// If tu do co trong index
/// thi dung phuong thuc InFiles cua Word obj tra ve ds file chua tu do
/// Nguoc lai thi tra ve null /// </summary>
Hashtable retVal = null;
Lê Nguy n ồn Trí – 0851010294 65/70 Võ Nguy n Minh Tuân - 0851010308
{
Word theWordMatch = (Word)index[searchWord]; retVal = theWordMatch.InFiles();
}
return retVal; }
5. Home.aspx
_ Sau khi nh n nút search, ch ng trình s tìm t đã đánh ch s b ng cách s d ng ph ng th c Hashtable.ContainsKey(). Ph ng th c này đ c hi n th c b i MS và r t h u d ng. ây là ph ng th c tìm ki m chính s đ c s d ng trong Catalog.Search().
_ Ph ng th c Catalog.Seach() s tr v Hashtable ch a các FILE có t mu n tìm. Sau khi tìm ki m s xu t k t qu theo đnh d ng HTML.
// Search
// tra ve file co chua tu search
_ truy su t searchResultArray chúng ta ph i s d ng đ i t ng Dictionary đ truy su t. Trong đó: FILE å khóa (key); RANK (s l n t xu t hi n trong trang) å giá tr (value).
_ V n đ đây là k t qu ch a đ c s p x p theo RANK. s p x p chúng ta c n vòng l p quét t t c các k t qu trong
searchResultArray đ a vào đ i t ng SortedList.
SortedList slOutPut = new SortedList(searchResultArray.Count); DictionaryEntry fo;
File inFile;
string sResult = "";
// Xay dung de hien moi ket qua (dang ket qua co link)
foreach (object foundInFile in searchResultArray)
{
// Xay dung dau ra HTML trong sorted list
// searchResults duoc sap xep khi duoc add trong SortedList
fo = (DictionaryEntry)foundInFile;
inFile = (File)fo.Key;
int nRank = (int)fo.Value;
_ Sau khi dùng ph ng th c search trên s tr v Hashtable. N u k t qu tr v là null thì d ng. Ng c l i, ch ng trình s chu n hóa k t qu theo ngôn ng HTML đ ti n xu t ra màn hình.
// Dinh dang HTML dau ra
sResult = ("<a href=" + inFile.Url + ">");
sResult += ("<b>" + inFile.Title + "</b></a>");
sResult += (" <a href=" + inFile.Url + " target=\"_TOP\" "); sResult += ("title=\"open in new window\" style=\"font-size:xx-
small\">↑</a>");
sResult += (" <font color=gray>(" + nRank + ")</font>"); sResult += ("<br>" + inFile.Description + "...");
Lê Nguy n ồn Trí – 0851010294 67/70 Võ Nguy n Minh Tuân - 0851010308
sResult += ("<br><font color=green>" + inFile.Url + " - " + inFile.Size);
sResult += ("bytes</font> <font color=gray>- " + inFile.CrawledDate + "</font><p>");
_ Tr c khi xu t ra màn hình, ch ng trình s dùng SortedList (do MS hi n th c) đ thêm k t qu sResult (運 trên) å giá tr
(value) và RANK å khóa (key) – đ s p x p
searchResultArray. N u có k t qu cùng RANK thì ch ng trình s c ng thêm ph n sResult vào k t qu đó.
_ đ a k t qu có RANK cao lên đ u trang chúng ta ph i nhân RANK v i “-1” vì SortedList s p x p theo th t t ng d n.
int nSortRank = (nRank * -1); // nhan -1 de diem lon hon duoc
len noc
//int nSortRank = nRank;
if (slOutPut.Contains(nSortRank)) { slOutPut[nSortRank] = ((string)slOutPut[nSortRank]) + sResult; } else { slOutPut.Add(nSortRank, sResult); }
sResult = ""; // Xoa ja tri cua sResut cho vong lap tiep theo
_ Và đo n code d i s xu t ra màn hình thành qu trên và s trang có t ng i dùng nh p.
// Xuat ra man hinh
foreach (object rows in slOutPut)
{
Response.Write((string)((DictionaryEntry)rows).Value); }
6. L u ý:
_ N u mu n thay đ i th m c g c mà ch ng trình quét, ta thay đ i bi n m_path trong t p tin Crawler.aspx.cs:
if (m_path == null)
{
string sPathProject = Server.MapPath(".");
//m_path = Server.MapPath(".");
//m_path = @"C:\Documents and Settings\xp\Desktop\CODE DEMO #2\DemoSearchEngine\CatalogCpp\www.java2s.com\Code\TuTao";
m_path = sPathProject +
@"\CatalogCpp\www.java2s.com\Code\TuTao";
Lê Nguy n ồn Trí – 0851010294 69/70 Võ Nguy n Minh Tuân - 0851010308
IV. K t lu n:
Do th i gian và n ng l c mã hố ch ng trình theo mơ hình lý thuy t cịn h n nên ch ng trình có r t nhi u thi u sót. Mong th y và các b n đóng góp ý ki n đ ch ng trình đ c hồn thi n h n.
1. Khuy t đi m c a ch ng trình:
_ Ch ng trình ch tìm ki m đ c M T t .
_ Giao di n ch a b t ch a thân thi n, ch a th c hi n phân trang.
_ L u CSDL trong cache nên còn h n ch v dung l ng. Ch a th c hi n l u tr bên ngoài cách đ c vì g p khó kh n trong khi đ a d li u tr vào cache đ x lí.
_ Khi m i ch y å ch ng trình cịn crawling lâu. Do ph i quét t t c các t p tin HTML. VD: trong toàn b th m c root (k c th m c con) có N t p tin thì ch ng trình ph i quét N l n.
_ Khi ng i dùng nh p nh ng t quá ph bi n nh : and, or, … thì ch ng trình ch y r t lâu do ch ng trình ch a xác đ nh đ c các ng ng cao, ng ng tháp và còn h n ch v s x lý STOP WORD.
_ Ch a ng d ng đ c các thu t tốn tính tr ng s đã nêu trong ph n lý thuy t vì h n ch trong vi c áp d ng thu t toán vào th c t . Vi c tính tr ng s ch đ n gi n d a vào s l n xu t hi n c a t . Ch a phân tích và đánh giá đ c câu truy v n c a ng i dùng mà ch đ n gi n hi u nó nh m t t .
_ Vi c th c hi n Crawling ch đ n gi n là thu th p các t p tin html, ch a th c hi n đa d ng hoá nhi u t p tin nh video, hình nh, pdf…
_ Vi c Crawling b gi i h n trong ph m vi th m c n i b , ch a th c hi n đ c vi c Crawling tr c tuy n đ n các WebServer.
2. u đi m c a ch ng trình:
_ D hi n th c SearchEngine cho ng i m i tìm hi u v đ tài này.
_ T c đ truy su t nhanh (đ i v i nh ng t ít thơng d ng, chun mơn,…)
_ Dung l ng ch ng trình nh .
PH N C: CÁC TÀI LI U THAM KH O
_ Introduction to Information Retrieval-Cambridge University Press, first published 2008(Christoper D.Manning – Stanford University, Prabhakar Raghavan – Yahoo! Research, Hinrich Schutze-University of Stuttgart)
_ Modern Information Retrieval – AMC press, New Yort, first published 1999 ( Ricardo Baeza-Yates, Berthier Riberiro-Neto).
_ Information Retrieval and Web Search – Department of Mathematics, North Caroline State University.(Amy Langville , Carl Meyer).
_ PH NG PHÁP PHÂN C M TÀI LI U WEB VÀ ÁP D NG VÀO MÁY TÌM KI M
(Lu n v n th c s c a Nguy n Th Thu H ng-Tr ng đ i h c Công Ngh ,