Thailand Trending

Thailand Trending หรืออันดับเด่นประเทศไทย เป็นโครงการทำเอามันส์เป็นการส่วนตัวที่จะทำระบบตรวจจับ และสรุปข้อมูลการทวีตภาษาไทยทั้งหมดออกมาจัดอันดับว่า ตลอดวัน เดือน ปี มีใครกำลังพูดถึงเรื่องอะไรกันในทวิตเตอร์บ้าง

แนวคิดโครงการเริ่มจากที่ทวิตเตอร์เปิดบริการ Local Trending ซึ่งแน่นอนว่า … ไม่มีภาษาไทย
และปริมาณทวีตภาษาไทยไม่ได้เยอะมากจนถึงขั้นทำให้ติด Global Trending ได้ง่ายนัก
( ตัวอย่างชัดเจนจาก #welovethai ที่ทวีตกันสูงสุดถึงพันครั้งต่อวันแต่ก็ยังไม่โผล่มาให้เห็น)

เงื่อนไขของการทำ thaitrend มีประมาณนี้ครับ
1) เก็บข้อมูลทวีตที่เป็นภาษาไทยเท่านั้น คือต่อให้เป็นคนไทย แต่ถ้าทวีตภาษาอังกฤษก็ไม่นับ
2) เก็บทวีตที่ไม่ซ้ำกัน นั่นหมายความว่ากา Retweet แบบ Official จะไม่นับ (ส่วน retweet แบบเก่า ขี้เกียจเขียนโปรแกรมจับ)
3) ต้องรวบรวมข้อมูลจาก tweetple ชาวไทย (ที่ไม่ได้ protected) ให้ได้มากที่สุด
4) ต้องไม่ละเมิดความเป็นส่วนตัว อ่าน ประมวลผลแล้วสรุป เสร็จแล้วก็ลบข้อมูลดิบทิ้งไปเลย
5) ยิ่งปล่อยไว้นาน ปริมาณข้อมูลก็ยิ่งเยอะขึ้น เพราะบอทจะตามหา tweetple ชาวไทยเพิ่มขึ้นเรื่อยๆ จากหลายๆ ช่องทาง

วิธีการดึงข้อมูล

ตอนแรกสุดก็อาศัยสมัคร account @thaitrend ขึ้นมา แล้วก็ไปคุ้ยๆ หา API ของทวิตเตอร์
เล็งเห็นว่าวิธีที่เวิร์กที่สุดคือ… follow ไปเรื่อยๆ แล้วอ่าน home timeline ของตัวเอง (กำปั้นทุบดินชิบเป๋ง)
ซึ่งแน่นอนว่า… มันช้า กว่าจะ follow ได้ แอบผิดกฎ twitter เล็กน้อยอีกตะหาก
(twitter ไม่อนุญาตให้ auto follow ยกเว้นเป็นการ auto follow กลับคนที่มา follow ครับ)
แล้วก็เจอ follow limit เข้าครับ ค่าปกติคือ twitter จะไม่อนุญาตให้ follow เกิน 2000 คน
ยกเว้นเสียแต่เราจะมี follower มากกว่าที่ระบบตั้งไว้ ซึ่งข้อมูลตรงนี้ไม่ได้เปิดเผย
แล้วก็แน่นอนว่าบอทอย่างเรา คนทั่วไปใครมันจะมา follow (ฮือๆ)

ที่จริงเรื่อง follow limit นี่อ่านเจอตั้งแต่ตอนเริ่มเขียนแล้วครับ แต่ตอนนั้นยังไม่รู้ว่าจะทำอะไรดี
ถึงแม้ว่าจะเจอ Streaming API ที่ท่าทางจะเวิร์กกว่า แต่วุ่นวาย แล้วก็เขียนยากกว่ากันเยอะเลย
แถมข้อจำกัดเยอะกว่าอีกต่างหาก เพราะข้อมูลมันเยอะมาก !!! แต่สุดท้ายก็หนีไม่พ้น

.

Streaming API

หลักการของ Streaming API ก็ง่ายๆ … เรา connect แช่ไว้ แล้ว twitter จะส่งข้อมูลมาให้เราเรื่อยๆ
โดยไม่ต้องไป request บ่อยๆ อารมณ์คล้ายๆ AJAX Push นั่นแหละครับ
โดยตัว Streaming API จะมีช่องทางให้ใช้งานตามนี้ครับ

1) firehose : ส่งข้อมูลทวีตทั้งหมดมาให้เลย… ตายครับตาย วันละห้าสิบล้านทวีต หรือวินึงเกือบพัน
ข้อดีมันก็มีตรงที่เราไม่ต้องไปวุ่นวาย follow ใครให้เมื่อยแรง กรองภาษาที่ทวีตจบเลย
แต่… ตัว process หาข้อความภาษาไทยตายอนาถชัวร์ๆ (เพราะเราจะเอาเฉพาะภาษาไทย !)
แถมด้วยต้องขอ access พิเศษอีก เนื่องจากไม่ได้เปิดให้คนทั่วไปใช้

2) links : ส่งทวีตที่มี link ทั้งหมดมาให้ ถ้าเกิดไม่มีลิงก์ก็ไม่ส่ง งั้นก็ไม่ตรงกับความต้องการ!

3) retweet : ตามชื่อเลยครับ ก็ยังไม่ตรงกับความต้องการอีก

4) sample : เป็นตัวอย่างสุ่มออกมานิดๆ หน่อยๆ จาก firehose ครับ ไว้ทดลอง streaming api

5) filter : กรองทวีตตามเงื่อนไขที่กำหนด อันนี้แหละครับที่ต้องการ !
เงื่อนไขการกรองมีให้เลือกคือ follow (กรองตาม id) เหมือนกับไปกด follow ชาวบ้านเป๊ะ
track (กรองตาม keyword) ประมาณ search แหละ
locations (กรองตามพิกัดที่ทวีต) อันนี้ใช้ร่วมกับ geolocation api ครับ
แล้วก็แน่นอนว่าพวกนี้จำกัดปริมาณกับขอบเขตที่ follow ได้ด้วย

อย่าง filter follow ปกติจะอนุญาตให้ follow ได้ไม่เกิน 400 id (น้อยกว่า follow ปกติอีก)
หรือ track ได้ 200 keyword หรือกรองพิกัดได้ 1 องศา (ประมาณ 100 กว่ากิโล)

สำหรับ filter follow จะมี shadow role เพิ่มถึง 80,000 follow
แล้วก็ birddog ได้ถึง 400,000 follow (สูงกว่านั้น firehose เหอะ)

ตอนนี้ thaitrend ใช้ shadow role ครับ ข้อมูลสถิติทั้งหมดเข้าไปดูกันได้เลยที่

http://www.lab.in.th/thaitrend/

วิธีการประมวลผลข้อมูล

1) hashtag จับ # แล้ว copy ยาวไปจนกว่าจะเจอสัญลักษณ์พิเศษ
คือเครื่องหมายประมาณนี้ครับ : @ # / ‘ ” ( ) [ ] { } !
โดยนับ hashtag ที่ไม่ซ้ำกันใน 1 tweet ทั้งหมด (หมายความว่า ต่อให้ใส่ #thaitrend มากี่อันก็นับเป็นอันเดียว)

2) mention จับ @ แล้ว copy ยาวไปจนกวาจะไม่เจอตัวอักษร user ที่ twitter อนุญาตไว้
ซึ่งชื่อผุ้ใช้จะต้องเป็นตัวอักษรภาษาอังกฤษ ตัวเลข และเครื่องหมาย _ เท่านั้น
0123456789abcdefghijklmnopqrstuvwxyz_ (ไม่สนใหญ่เล็ก)

3) vowel จับวลี.. อันนี้เหนื่อยสุด ก่อนอื่นเอาข้อความทวีต มาลบ hashtag กับ mention แล้วก็ link ออกให้หมด
จากนั้นดำเนินการ แก้ไขคำจากในรายการกลุ่มคำให้เป็นคำที่ต้องการ แล้ว match ข้อความกับรายการ keyword ที่จะจับว่าตรงกันรึเปล่า
ถ้าพบ keyword ในข้อความทวีตถึงจะนับ 1 สำหรับ keyword นั้นๆ
การเพิ่ม keyword เข้าสู่ระบบตอนนี้พิจารณาจากปริมาณการทวีตครับ นั่นหมายความว่าทวีตช่วงแรกๆ จะไม่ถูกนับรวมจนกว่าจะมีการเพิ่มเข้าไปในรายการการจับคำด้วยระบบอัตโนมือ (สองมือเท่านั้น) เพื่อไม่ให้การจับข้อความทวีตมั่วเกินไปครับ

วิธีการหาคนที่ทวีตภาษาไทย

เนื่องจากการใช้ filter follow เราจำเป็นต้องรู้ใช่มั้ยครับว่ามี id อะไรบ้างที่เราจะตามอ่าน
และด้วยการจำกัดปริมาณการ follow (80,000 id) ทำให้ต้องกรองดีๆ ว่าใครบ้างที่ทวีตภาษาไทย
เริ่มแรกสุดคือ follow @sugree (ขอบคุณมา ณ ที่นี้) แล้วดูว่า @sugree follow ใครอีกบ้างก็กดตามไปก่อน
แล้วก็ไล่อ่านทวีตของคนคนนั้นว่ามีภาษาไทยหรือไม่ ถ้ามีก็เพิ่มเข้าในรายการ แล้วก็ตาม follower ต่อไปเรื่อยๆ
แถมด้วยเพื่อความทันใจ จึงได้จับจากข้อความทวีตว่ามีการ mention หาใครอีกบ้าง
แล้วตามอ่านทวีตคนที่ถูก mention ไปด้วยเลยว่ามีภาษาไทยหรือไม่ จึง follow ตามไป…