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
ถ้า หากคุณเป็นนักวิจัย ซึ่งอาจจะมีการค้นหาหัวข้อที่เป็นเรื่องที่คุณสนใจอยู่เป็นประจำ คุณอาจจะใช้เวลาเล็กน้อยในการศึกษาวิธีการแฮ็กวิธีนี้ ซึ่งจะช่วยให้คุณได้เห็นรูปแบบที่ได้จากการเปลี่ยนลำดับคำในการค้นหา ทำให้คุณได้มีโอกาสปรับปรุงวิธีการค้นหาของคุณให้ได้ผลลัพธ์ที่ดียิ่งขึ้น โดยการกำหนดคำที่ค้นหาว่าคำไหนควรอยู่ลำดับแรก และคำไหนควรอยู่ลำดับสุดท้าย ในวลีที่ใช้ในการค้นหา
และ ถ้าหากคุณเป็นผู้ที่ทำงานเกี่ยวกับการพัฒนาเว็บแล้วล่ะก็ คุณอาจจำเป็นต้องรู้ว่าเว็บเพจของคุณจะปรากฏอยู่ลำดับใดในรายการผลลัพธ์ โดยเฉพาะถ้าเว็บเพจของปรากฏอยู่ในลำดับที่ไม่ดีนัก คุณอาจจำเป็นต้องปรับปรุงคำที่ใช้เป็นคีย์เวิร์ดในการค้นหาเว็บเพจหน้านั้น ของคุณ โดยอาจเป็นการเพิ่มคำบางคำลงไปในวลีค้นหานั้น หรือสลับคำที่มีอยู่แล้วในวลีดังกล่าวก็เป็นได้

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

I miss you all กับ I miss all of you ต่างกันอย่างไร

ปัญหาและเฉลยวิชาธรรม นักธรรมชั้นตรี สอบในสนามหลวง วันอังคาร ที่ ๒๙ กันยายน พ.ศ.๒๕๕๒

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