HACK#62 การจัดลำดับ (permuting) คำที่ใช้ในการค้นหา
จัดลำดับคำที่ใช้ในวลีสำหรับการค้นหาเสียใหม่ เพื่อเค้นเอาผลลัพธ์จาก Google Index จนถึงหยดสุดท้าย
Google เป็น Search Engine ที่มีข้อมูลจำนวนถึง 3,000 ล้านหน้า ดังนั้นสิ่งที่น่าสนใจ โดยเฉพาะผู้ที่เป็นนักค้นหาข้อมูลบนอินเทอร์เน็ตก็คือ ความพยายามที่หลากวิธีในการค้นหาข้อมูลให้ได้ผลลัพธ์ดังที่ต้องการ ซึ่งผลลัพธ์ดังกล่าวจะแตกต่างกันออกไปแล้วแต่วิธีการ
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=>'GET'),
'Query: ', textfield(-name=>'query'),
' ',
submit(-name=>'submit', -value=>'Search'), br( ),
'<font size="-2" color="green">Enter up to 4 query keywords or "quoted phrases"</font>',
end_form( ), p( );
if (param('query')) {
# Glean keywords
my @keywords = grep !/^\s*$/, split /([+-]?".+?")|\s+/, param('query');
scalar @keywords > 4 and
print('<font color="red">Only 4 query keywords or phrases allowed.</font>'), last;
my $google_search = SOAP::Lite->service("file:$google_wdsl");
print
start_table({-cellpadding=>'10', -border=>'1'}),
Tr([th({-colspan=>'2'}, ['Result Counts by Permutation' ])]),
Tr([th({-align=>'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->next)) {
# Query Google
my $r = $google_search ->
doGoogleSearch(
$google_key,
$query,
0, 10, "false", "", "false", "", "latin1", "latin1"
);
print Tr([td({-align=>'left'}, [$query, $r->{'estimatedTotalResultsCount'}] )]);
@{$r->{'resultElements'}} or next;
# Assign a rank
my $rank = 10;
foreach (@{$r->{'resultElements'}}) {
$results->{$_->{URL}} = {
title => $_->{title},
snippet => $_->{snippet},
seen => ($results->{$_->{URL}}->{seen}) + $rank
};
$rank--;
}
}
print
end_table( ), p( ),
start_table({-cellpadding=>'10', -border=>'1'}),
Tr([th({-colspan=>'2'}, ['Top Results across Permutations' ])]),
Tr([th({-align=>'left'}, ['Score', 'Result'])]);
foreach ( sort { $results->{$b}->{seen} <=> $results->{$a}->{seen} } keys %$results ) {
print Tr(td([
$results->{$_}->{seen},
b($results->{$_}->{title}||'no title') . br( ) .
a({href=>$_}, $_) . br( ) .
i($results->{$_}->{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
ถ้า หากคุณเป็นนักวิจัย ซึ่งอาจจะมีการค้นหาหัวข้อที่เป็นเรื่องที่คุณสนใจอยู่เป็นประจำ คุณอาจจะใช้เวลาเล็กน้อยในการศึกษาวิธีการแฮ็กวิธีนี้ ซึ่งจะช่วยให้คุณได้เห็นรูปแบบที่ได้จากการเปลี่ยนลำดับคำในการค้นหา ทำให้คุณได้มีโอกาสปรับปรุงวิธีการค้นหาของคุณให้ได้ผลลัพธ์ที่ดียิ่งขึ้น โดยการกำหนดคำที่ค้นหาว่าคำไหนควรอยู่ลำดับแรก และคำไหนควรอยู่ลำดับสุดท้าย ในวลีที่ใช้ในการค้นหา
และ ถ้าหากคุณเป็นผู้ที่ทำงานเกี่ยวกับการพัฒนาเว็บแล้วล่ะก็ คุณอาจจำเป็นต้องรู้ว่าเว็บเพจของคุณจะปรากฏอยู่ลำดับใดในรายการผลลัพธ์ โดยเฉพาะถ้าเว็บเพจของปรากฏอยู่ในลำดับที่ไม่ดีนัก คุณอาจจำเป็นต้องปรับปรุงคำที่ใช้เป็นคีย์เวิร์ดในการค้นหาเว็บเพจหน้านั้น ของคุณ โดยอาจเป็นการเพิ่มคำบางคำลงไปในวลีค้นหานั้น หรือสลับคำที่มีอยู่แล้วในวลีดังกล่าวก็เป็นได้