HACK#62 การจัดลำดับ (permuting) คำที่ใช้ในการค้นหา

จัดลำดับคำที่ใช้ในวลีสำหรับการค้นหาเสียใหม่ เพื่อเค้นเอาผลลัพธ์จาก Google Index จนถึงหยดสุดท้าย

Google เป็น Search Engine ที่มีข้อมูลจำนวนถึง 3,000 ล้านหน้า ดังนั้นสิ่งที่น่าสนใจ โดยเฉพาะผู้ที่เป็นนักค้นหาข้อมูลบนอินเทอร์เน็ตก็คือ ความพยายามที่หลากวิธีในการค้นหาข้อมูลให้ได้ผลลัพธ์ดังที่ต้องการ ซึ่งผลลัพธ์ดังกล่าวจะแตกต่างกันออกไปแล้วแต่วิธีการ
ถ้า คุณไม่ได้สังเกต คุณอาจจะเข้าใจว่าการเรียงลำดับคำที่ใช้ในการค้นหาข้อมูลนั้นไม่มีผลต่อ ผลลัพธ์ที่ได้จากการค้นหาแต่อย่างใด แต่จริงๆแล้วหาเป็นเช่นนั้นไม่ ในคำแนะนำวิธีการใช้ Google ก็ได้บอกเอาไว้แล้วอย่างชัดเจนว่า การเรียงลำดับคำ (word order) ที่ต่างกัน จะให้ผลลัพธ์ที่ต่างกันออกไปด้วย
แม้ ว่าข้อเท็จจริงนี้อาจจะเป็นสิ่งน่าสนใจ แต่ในเวลาใช้งานจริงๆ คงไม่มีใครที่จะมาคอยสลับสับเปลี่ยนการเรียงลำดับของคำที่ใช้ในการค้นหา บ่อยๆ เพราะอาจทำให้เสียเวลาไปบ้างไม่มากก็น้อย อย่างไรก็ตาม ด้วยความสามารถของ Google Web API ทำให้วิธีการนี้เป็นไปได้ง่ายและอัตโนมัติมากยิ่งขึ้น ดังนั้นใน Hack #62 นี้จึงเป็นวิธีการนำคำถามซึ่งเป็นวลีที่ประกอบด้วยคำทั้งหมด 4 คำ มาจัดลำดับ (permuting) วิธีในการเรียงลำดับคำเหล่านั้นทั้งหมด แล้วแสดงจำนวนผลลัพธ์ที่ได้พร้อมทั้งผลลัพธ์อันดับแรก (top result) ของแต่ละวิธีออกมา
Tip: การรันแฮ็กนี้ คุณอาจจะต้องติดตั้งโมดูล Algorithm::Permute ซึ่งเป็นโมดูลของ Perl เพิ่มเติม เพื่อให้โปรแกรมนี้ทำงานได้ถูกต้อง (http://search.cpan.org/search?query=algorithm%3A%3Apermute~mode=all)
โค้ดตัวอย่าง

#!/usr/local/bin/perl
# order_matters.cgi
# Queries Google for every possible permutation of up to 4 query keywords,
# returning result counts by permutation and top results across permutations.
# order_matters.cgi is called as a CGI with form input

# Your Google API developer's key
my $google_key='insert key here';

# Location of the GoogleSearch WSDL file
my $google_wdsl = "./GoogleSearch.wsdl";

use strict;

use SOAP::Lite;
use CGI qw/:standard *table/;
use Algorithm::Permute;

print
header( ),
start_html("Order Matters"),
h1("Order Matters"),
start_form(-method=&gt'GET'),
'Query: ', textfield(-name=&gt'query'),
' ',
submit(-name=&gt'submit', -value=&gt'Search'), br( ),
'&ltfont size="-2" color="green"&gtEnter up to 4 query keywords or "quoted phrases"&lt/font&gt',
end_form( ), p( );

if (param('query')) {

# Glean keywords
my @keywords = grep !/^\s*$/, split /([+-]?".+?")|\s+/, param('query');

scalar @keywords &gt 4 and
print('&ltfont color="red"&gtOnly 4 query keywords or phrases allowed.&lt/font&gt'), last;

my $google_search = SOAP::Lite-&gtservice("file:$google_wdsl");

print
start_table({-cellpadding=&gt'10', -border=&gt'1'}),
Tr([th({-colspan=&gt'2'}, ['Result Counts by Permutation' ])]),
Tr([th({-align=&gt'left'}, ['Query', 'Count'])]);

my $results = {}; # keep track of what we've seen across queries

# Iterate over every possible permutation
my $p = new Algorithm::Permute( \@keywords );
while (my $query = join(' ', $p-&gtnext)) {

# Query Google
my $r = $google_search -&gt
doGoogleSearch(
$google_key,
$query,
0, 10, "false", "", "false", "", "latin1", "latin1"
);
print Tr([td({-align=&gt'left'}, [$query, $r-&gt{'estimatedTotalResultsCount'}] )]);
@{$r-&gt{'resultElements'}} or next;

# Assign a rank
my $rank = 10;
foreach (@{$r-&gt{'resultElements'}}) {
$results-&gt{$_-&gt{URL}} = {
title =&gt $_-&gt{title},
snippet =&gt $_-&gt{snippet},
seen =&gt ($results-&gt{$_-&gt{URL}}-&gt{seen}) + $rank
};
$rank--;
}
}

print
end_table( ), p( ),
start_table({-cellpadding=&gt'10', -border=&gt'1'}),
Tr([th({-colspan=&gt'2'}, ['Top Results across Permutations' ])]),
Tr([th({-align=&gt'left'}, ['Score', 'Result'])]);

foreach ( sort { $results-&gt{$b}-&gt{seen} &lt=&gt $results-&gt{$a}-&gt{seen} } keys %$results ) {
print Tr(td([
$results-&gt{$_}-&gt{seen},
b($results-&gt{$_}-&gt{title}||'no title') . br( ) .
a({href=&gt$_}, $_) . br( ) .
i($results-&gt{$_}-&gt{snippet}||'no snippet')
]));
}

print end_table( ),
}
print end_html( );
Running the Hack
การ แฮ็กวิธีนี้จะต้องรันผ่านเว็บฟอร์ม ซึ่งจะสร้างขึ้นด้วยโค้ดที่ให้มา ทำการเรียกใช้ CGI เพื่อให้คุณใส่วลีที่ต้องการใช้ในคำสั่งค้นหา โดยขั้นแรกสคริปต์จะทำการตรวจสอบถึงวิธีที่เป็นไปได้ในการจัดลำดับคำภายใน วลีนั้นก่อน ว่ามีโอกาสเป็นไปได้กี่วิธี เสร็จแล้วจะแสดงออกมาดังรูปที่ 6-1
จากนั้นสคริปต์จะแสดงผลลัพธ์ที่ได้จากการค้นหา 10 รายการแรกออกมา ดังที่ปรากฏในรูปที่ 6-2
Using the Hack
ใน ครั้งแรกที่คุณเห็นการทำงานของวิธีแฮ็กในหัวข้อนี้ อาจะดูว่าเป็นของใหม่สำหรับคุณอยู่บ้าง แต่ถ้าหากคุณเป็นผู้ที่ผ่านการค้นหาข้อมูลบนเว็บมาพอสมควรแล้ว คุณจะเห็นว่ามันน่าสนใจเป็นอย่างยิ่ง
รูปที่ 6-1 ตัวอย่างการจัดลำดับคำที่ได้ จากการใช้คำในการค้นหาว่า applescript google api
ถ้า หากคุณเป็นนักวิจัย ซึ่งอาจจะมีการค้นหาหัวข้อที่เป็นเรื่องที่คุณสนใจอยู่เป็นประจำ คุณอาจจะใช้เวลาเล็กน้อยในการศึกษาวิธีการแฮ็กวิธีนี้ ซึ่งจะช่วยให้คุณได้เห็นรูปแบบที่ได้จากการเปลี่ยนลำดับคำในการค้นหา ทำให้คุณได้มีโอกาสปรับปรุงวิธีการค้นหาของคุณให้ได้ผลลัพธ์ที่ดียิ่งขึ้น โดยการกำหนดคำที่ค้นหาว่าคำไหนควรอยู่ลำดับแรก และคำไหนควรอยู่ลำดับสุดท้าย ในวลีที่ใช้ในการค้นหา
และ ถ้าหากคุณเป็นผู้ที่ทำงานเกี่ยวกับการพัฒนาเว็บแล้วล่ะก็ คุณอาจจำเป็นต้องรู้ว่าเว็บเพจของคุณจะปรากฏอยู่ลำดับใดในรายการผลลัพธ์ โดยเฉพาะถ้าเว็บเพจของปรากฏอยู่ในลำดับที่ไม่ดีนัก คุณอาจจำเป็นต้องปรับปรุงคำที่ใช้เป็นคีย์เวิร์ดในการค้นหาเว็บเพจหน้านั้น ของคุณ โดยอาจเป็นการเพิ่มคำบางคำลงไปในวลีค้นหานั้น หรือสลับคำที่มีอยู่แล้วในวลีดังกล่าวก็เป็นได้

โพสต์ยอดนิยมจากบล็อกนี้

ปัญหาและเฉลยธรรม นักธรรมชั้นโท สอบในสนามหลวง พ.ศ. ๒๕๔๓ วันพฤหัสบดี ที่ ๑๖ พฤศจิกายน พ.ศ. ๒๕๔๓

ปัญหาและเฉลยวินัยบัญญัติ นักธรรมชั้นเอก สอบในสนามหลวง พ.ศ. ๒๕๔๓ วันเสาร์ ที่ ๑๘ พฤศจิกายน พ.ศ. ๒๕๔๓

ปัญหาและเฉลยวิชาธรรม นักธรรมชั้นโท สอบในสนามหลวง วันเสาร์ ที่ ๑๙ พฤศจิกายน พ.ศ. ๒๕๔๘