/edang

Do Thai first voters on Twitter tend to be in their own echo chambers?

Primary LanguageJupyter NotebookMIT LicenseMIT

Network of Twitter first voters (samples)

EDANG

Data preparation scripts for a research project on echo chamber assumption among Thai-speaking Twitter users, focusing on first voters in 2019 Thai general election.

Part of a project funded by Thai Research Fund - "Online Echo Chamber" (Project No.: RDG6240022 / 17 April 2019).

The data used in the research has two parts: textual data (tweets) and account relationship data (followings, followers). All of these are collected from public tweets several months before and after the election. Wisesight (Thailand) Co., Ltd. provides the raw data according to the specification outlined by the research team led by Prof. Pirongrong Ramasoota at Chulalongkorn University's Faculty of Communication Arts. The team itself consists of team members from many universities, including Chiang Mai University and Bangkok University.

This repository includes scripts to:

  • get user's public data from Twitter API
  • generate a GraphML file for visualization

ติดตั้ง

  • ทำสำเนาไฟล์ config.ini-sample และเปลี่ยนชื่อเป็น config.ini
  • ในไฟล์ config.ini ใส่ข้อมูล token สำหรับเข้าถึง Twitter API
  • ดูวิธีการขอ/ดู token ที่ Twitter Developers

ข้อมูล

ไฟล์ข้อมูลอยู่ใน Google Drive https://drive.google.com/drive/folders/1XQnJCc3xbTn6xFb-Vg4nJBtC-j1hC67c?usp=sharing (เฉพาะผู้ร่วมโครงการเท่านั้น)

ขั้นตอนการเตรียมข้อมูล

หารายการบัญชีตั้งต้นสำหรับผู้มีสิทธิ์เลือกตั้งครั้งแรก (first voters)

  1. ใช้คำสำคัญที่น่าจะช่วยให้ระบุถึงผู้มีสิทธิ์เลือกตั้งครั้งแรก (เช่นแฮชแท็ก #เลือกตั้งครั้งแรก) ค้นหาข้อความในทวิตเตอร์ เพื่อให้ได้ชุดบัญชีตั้งต้น ที่น่าจะเป็นผู้มีสิทธิ์เลือกตั้งครั้งแรก

    • ขั้นตอนนี้ ใช้เครื่องมือ social media listening (Wisesight ZOCIAL EYE) ในการค้นหา สำหรับคำค้นนั้น ปรับแต่งด้วยมนุษย์
    • ได้มาประมาณ 8,000 บัญชี
    • อยู่ในไฟล์ firstvoters-full-raw.xlsx
  2. นำรายชื่อบัญชีจาก (1) มาดึงข้อมูลเกี่ยวกับบัญชีนั้นๆ (มี follower กี่คน, following กี่คน, เริ่มเปิดบัญชีวันไหน, โพสต์มาแล้วกี่ข้อความ ฯลฯ)

    • ใช้โปรแกรม get-users-info.ipynb
  3. กรองผู้ใช้ที่ไม่น่าจะใช่ผู้มีสิทธิ์เลือกตั้งครั้งแรกออกไป ทั้งการดูด้วยตาสำหรับบัญชีที่เห็นได้ชัด เช่น สำนักข่าว ดารา และการกรองด้วยเกณฑ์ เช่น ถ้าสมัครบัญชีทวิตเตอร์มาแล้วเกิน 12 ปี ก็ "น่าจะ" มีอายุเกิน 25 ปี (ทวิตเตอร์กำหนดให้สมัครบัญชีได้เมื่ออายุ 13 ปี) เป็นต้น

    • กรองแล้วเหลือประมาณ 6,000 บัญชี
    • รายชื่อที่กรอง/จัดประเภทแล้ว อยู่ในไฟล์ firstvoters-full-info.xlsx

เพื่อเป็นการจำกัดจำนวนข้อมูลในอยู่ในระดับที่จัดการได้ จึงทำการสุ่มบัญชีจากรายชื่อที่ได้จาก (3) อีกที เพื่อให้มีจำนวนน้อยลง

  • ดูบัญชีที่สุ่มขึ้นมา 116 บัญชี ได้ใน Google Sheet (export เมื่อวันที่ 10 พ.ย. 2562 ออกมาเป็นไฟล์ samples116-info-with-labels.xlsx)
  • จะใช้ 116 บัญชีนี้ เป็นขุดบัญชีตั้งต้น (seed) ในการหา friends และ followers ในขั้นที่ (4) และ (5)

เก็บข้อมูลเครือข่ายของผู้มีสิทธิ์เลือกตั้งครั้งแรก

ขั้นนี้จะเป็นการหาว่าบัญชีต่างๆ มีการเชื่อมโยงกันหรือเชื่อมโยงขยายออกไปอย่างไรบ้าง

  1. หาว่าบัญชีผู้มีสิทธิ์เลือกตั้งครั้งแรก ติดตามใคร (friends/following)

    • ใช้โปรแกรม get-friends-info.ipynb
    • ข้อมูลที่ได้มาจะเป็น array ของ User object (Tweepy), ดูตัวอย่างได้จากไฟล์ Pickle - samples116-friends.pkl
  2. หาว่าบัญชีผู้มีสิทธิ์เลือกตั้งครั้งแรก มีใครมาติดตาม (followers)

    • ใช้โปรแกรม get-followers-info.ipynb
    • ข้อมูลที่ได้มาจะเป็น array ของ User object (Tweepy), ดูตัวอย่างได้จากไฟล์ Pickle - samples116-followers.pkl

หนึ่งบัญชีอาจไปติดตามบัญชีอื่นๆ หรือมีผู้มาติดตาม หลักร้อย พัน หรือหมื่นบัญชี ดังนั้นในสองขั้นนี้ จำนวนบัญชีจะขยายออกไปอย่างมาก (จากตัวอย่าง 116 บัญชีตั้งต้น ขยายเป็น 75,961 บัญชี (nodes) และมีความสัมพันธ์เชื่อมโยง (edges) 92,327 เส้น)

สร้างกราฟจากข้อมูลเครือข่าย

  1. สร้างกราฟข้อมูลเครือข่ายที่เก็บมาได้จาก (4) และ (5) และหา PageRank
    • ใช้โปรแกรม create-user-graph.ipynb เพื่อสร้างกราฟข้อมูลเครือข่าย
      • ตัวอย่างกราฟข้อมูลเครือข่าย ซึ่งมีจำนวนบัญชี 75,961 บัญชี (จากตัวอย่างบัญชีตั้งต้น 116 บัญชี): samples116-graph.pkl
        • เก็บในรูปแบบ Pickle ของ Python. โครงสร้างข้อมูลเป็น dictionary ที่มี key เป็น screen name และ value เป็น Tweepy User object
    • จากกราฟนี้ เราสามารถหาบัญชีที่น่าจะเป็น "แกนกลาง" หรือมีความสำคัญสำหรับเครือข่ายนี้ได้ มีวิธีหา "แกนกลาง" นี้ได้หลายวิธี วิธีหนึ่งคือ PageRank
      • รายชื่อบัญชี 1,200 อันดับแรกจาก PageRank เมื่อใช้ข้อมูลจากกราฟเครือข่ายบัญชีตั้งต้น 116 บัญชี: samples116-pagerank-top1200.txt
      • การหาแกนกลางนี้ จะช่วยลดจำนวนบัญชีที่จำเป็นต้องติดป้ายกำกับ เช่น แทนที่จะต้องติดป้ายกำกับกับบัญชีทุกบัญชี (ซึ่งอาจมีเป็นหมื่นบัญชี) เราอาจติดป้ายกำกับเฉพาะบัญชีที่อยู่ 1,000 อันดับแรกของ PageRank
    • ข้อมูลเครือข่ายนี้ สามารถนำไปวาดเป็นแผนภูมิได้
      • ดูตัวอย่างไฟล์ GraphML (สร้างจาก seed จำนวน 96 บัญชี) ที่ https://github.com/bact/edang/blob/master/samples.graphml
      • ไฟล์ GraphML (นามสกุล .graphml) นี้สามารถนำไปเปิดในโปรแกรมเช่น Gephi หรือ visone ได้

ดึงข้อความโพสต์จากบัญชีเพื่อติดป้ายกำกับและหาเครือข่ายผ่านการ Retweet และ @reply

  1. เพื่อให้สามารถติดป้ายกำกับได้เร็วขึ้น เราอาจดึงข้อความจำนวนมากด้วยคอมพิวเตอร์ ซึ่งอาจเลือกใช้วิธีเหล่านี้

    1. ดึงข้อความของบัญชีนั้นๆ จากเครื่องมือ social media listening
    2. ใช้โปรแกรม get-users-msg-api.ipynb
    • ข้อความที่ดึงมาด้วย get-users-msg-api.ipynb จะถูกเก็บเป็นไฟล์ข้อความ 1 บัญชีทวิตเตอร์ต่อ 1 ไฟล์
    • ข้อความทวีตล่าสุด 1,200 ข้อความของบัญชี Top 1,2000 PageRank (ย้อนไปถึงวันที่ 1 ธ.ค. 2561) อยู่ในโฟลเดอร์ samples116-pagerank-top1200 ใน Google Drive
  2. การหาเครือข่ายผ่านการ Retweet

  3. การหาเครือข่ายผ่านการ @reply หรือ @mention

ข่าวสารเกี่ยวกับโครงการ