เทคนิคที่ 111 · PYTHON / JAVASCRIPT

ตารางคำต่อเอกสารTerm-Document Heatmap

เห็นว่าเอกสารไหนใช้คำไหนมากกว่ากัน

3
ผสานหลายแนวคิดควรรู้ก่อน · อ่าน heatmap เป็นและเข้าใจว่าความยาวเอกสารต่างกัน
ลองเล่น

01ภาพรวมของกราฟนี้

Term-document heatmap จัดคำเป็นแถวและเอกสารเป็นคอลัมน์แล้วระบายสีตามความถี่ ทำให้เห็นว่าคำไหนเป็นลักษณะเฉพาะของเอกสารไหน สิ่งที่ต้องทำเสมอคือทำให้ค่าเป็นมาตรฐานก่อน ไม่อย่างนั้นเอกสารที่ยาวกว่าจะเข้มกว่าทุกแถว

เปรียบเทียบให้เห็นภาพ

เหมือนตารางเปรียบเทียบส่วนผสมของอาหารหลายจาน ซึ่งเห็นทันทีว่าจานไหนใส่อะไรเป็นพิเศษ

ใช้ที่ไหนบ้าง — เทียบภาษาที่ใช้ระหว่างกลุ่มลูกค้า เทียบหัวข้อระหว่างช่วงเวลา หรือเทียบคำที่พรรคการเมืองต่าง ๆ ใช้

สร้างอย่างไร

  1. ขั้นที่ 1★ ทำให้ความถี่เป็นมาตรฐานตามความยาวของเอกสาร
  2. ขั้นที่ 2เลือกคำที่จะแสดงด้วยเกณฑ์ที่ระบุได้
  3. ขั้นที่ 3เรียงคำด้วยการจัดกลุ่มเพื่อให้รูปแบบปรากฏ
  4. ขั้นที่ 4ใช้สเกลสีลำดับเดียวและใส่คำอธิบาย

ตัวอย่างคลาสสิก · TF-IDF กับการหาคำที่เป็นลักษณะเฉพาะ

น้ำหนักแบบ TF-IDF ถูกเสนอขึ้นเพื่อแก้ปัญหาว่าคำที่พบบ่อยที่สุดมักเป็นคำที่ไม่บอกอะไร โดยเพิ่มน้ำหนักให้คำที่ปรากฏในไม่กี่เอกสารและลดน้ำหนักคำที่ปรากฏทุกที่ แนวคิดนี้กลายเป็นพื้นฐานของทั้งระบบค้นหาและการวิเคราะห์ข้อความ

Wikipedia · tf–idf

02อธิบายภาษาคนเข้าใจง่าย ๆ

กราฟแท่งความถี่คำตอบได้แค่ว่าคำไหนพบบ่อยในข้อความทั้งชุด แต่คำถามที่มีค่ากว่ามักเป็นว่าคำไหนเป็นลักษณะเฉพาะของกลุ่มไหน

Term-document heatmap ตอบคำถามนั้นด้วยการจัดคำเป็นแถวและเอกสารหรือกลุ่มเป็นคอลัมน์ แล้วระบายสีตามความถี่

สิ่งที่ปรากฏขึ้นคือลายเส้นแนวนอนของคำที่ใช้ทุกกลุ่มเท่ากัน และจุดเข้มเดี่ยว ๆ ของคำที่กลุ่มเดียวเท่านั้นที่ใช้ ซึ่งจุดหลังคือสิ่งที่มีค่าที่สุด

กับดักที่ใหญ่ที่สุดคือความยาวของเอกสาร ถ้าเอกสารหนึ่งยาวกว่าอีกเอกสารสิบเท่า มันก็จะเข้มกว่าทุกแถวโดยอัตโนมัติ ซึ่งไม่ได้บอกอะไรเลย

ทางแก้คือทำให้ค่าเป็นมาตรฐานตามความยาวเสมอ หรือใช้น้ำหนักแบบ TF-IDF ซึ่งเพิ่มน้ำหนักให้คำที่ปรากฏในไม่กี่เอกสารและลดน้ำหนักคำที่ปรากฏทุกที่

อีกเรื่องที่ต้องระบุคือเกณฑ์เลือกคำที่จะแสดง เพราะการเลือกเฉพาะคำที่สนับสนุนข้อสรุปที่ตั้งไว้เป็นเรื่องที่ทำได้ง่ายมากและมองไม่เห็นจากภาพ

03ข้อมูลที่ต้องใช้

รูปทรงของข้อมูลตารางแบบยาว (หนึ่งแถวหนึ่งสังเกต)
จำนวนมิติที่เข้ารหัสได้3 มิติ
จำนวนแถวที่เหมาะ15–40 คำ × 3–12 เอกสารขั้นต่ำ 10 แถว
เส้นฐานศูนย์ไม่เกี่ยวข้องค่าเข้ารหัสด้วยสี ไม่มีแกนค่า

คอลัมน์ที่ต้องเตรียม

คอลัมน์ทำหน้าที่ชนิดเข้ารหัสด้วยจำนวนค่าที่เหมาะหมายเหตุ
wordคำข้อความrow10–60 คำเรียงด้วยการจัดกลุ่ม
countความถี่ที่ทำเป็นมาตรฐานแล้วตัวเลขต่อเนื่องcolorศูนย์ถึงสูงสุด★ ต้องหารด้วยความยาวเอกสารก่อน

ต้องเตรียมข้อมูลอย่างไรก่อนวาด

  1. ★ ทำให้ความถี่เป็นมาตรฐานหรือใช้ TF-IDF
  2. ตัดคำหยุดออก
  3. ★ ระบุเกณฑ์ที่ใช้เลือกคำที่จะแสดง

ค่าที่หายไป — คำที่ไม่ปรากฏในเอกสารหนึ่งคือค่าศูนย์ซึ่งต่างจากไม่มีข้อมูล ต้องแยกให้ชัด

สเกลของแกน — ใช้สเกลสีลำดับเดียว และเมื่อค่ากระจายแบบหางยาวให้พิจารณาสเกลลอการิทึมพร้อมระบุ

กราฟจะเริ่มพังเมื่อไร

เกิน 60 คำ ชื่อแถวอ่านไม่ออก

หน้าตาไฟล์ที่ต้องเตรียม

word,count
ส่งเร็ว,331
ราคา,179

04อ่านแล้วเห็นอะไร

สิ่งที่เห็นได้จากภาพ

  • คำที่เป็นลักษณะเฉพาะของเอกสารเดียว
  • คำที่ใช้เหมือนกันทุกเอกสาร
  • กลุ่มของเอกสารที่ใช้ภาษาคล้ายกัน

สิ่งที่กราฟนี้ตอบไม่ได้

  • ★ ถ้าไม่ทำให้เป็นมาตรฐาน ภาพจะบอกแค่ว่าเอกสารไหนยาวกว่า
  • บริบทของการใช้คำ
  • คำที่ไม่ได้ถูกเลือกมาแสดง

อ่านตามลำดับนี้

  1. มองหาจุดเข้มเดี่ยว ๆ ซึ่งคือคำเฉพาะของเอกสารนั้น
  2. มองหาแถวที่เข้มทั้งแถวซึ่งคือคำที่ใช้ทุกที่
  3. ตรวจว่าทำให้เป็นมาตรฐานแล้วหรือยัง

คำถามที่ตอบได้

  • เอกสารนี้ใช้คำอะไรเป็นพิเศษ
  • มีคำไหนที่ใช้เหมือนกันหมด
  • เอกสารไหนใช้ภาษาคล้ายกัน

สัญญาณว่ามีอะไรผิด

  • ไม่ทำให้ค่าเป็นมาตรฐาน
  • ไม่ระบุเกณฑ์เลือกคำ
  • เรียงคำตามตัวอักษรแทนการจัดกลุ่ม

05เหมาะกับการนำเสนอแบบไหน

ผู้ชมที่เหมาะนักวิเคราะห์ที่เปรียบเทียบภาษาระหว่างกลุ่ม
เวลาที่ผู้ชมต้องใช้ต้องอธิบาย
ขนาดเล็กสุดที่ยังอ่านได้440×400 px
รายงานเชิงวิเคราะห์
สิ่งพิมพ์
สื่อสารกับคนทั่วไป
สไลด์ผู้บริหารต้องใช้เวลาอ่านตารางหลายสิบช่อง
มือถือช่องเล็กและชื่อคำเบียด

ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย

  1. ★ ระบุวิธีทำให้เป็นมาตรฐานและเกณฑ์เลือกคำ
  2. ตีกรอบคำที่ต้องการชี้ให้เห็น
  3. ใส่ตัวเลขในช่องเมื่อตารางเล็กพอ

รูปแบบชื่อกราฟที่ควรใช้

คำที่เป็นลักษณะเฉพาะของแต่ละ <กลุ่ม> โดย <กลุ่ม> เด่นด้วยคำว่า <คำ>

06เอาไปใช้ต่อ

โค้ดทุกชิ้นอ่านไฟล์ term-document-heatmap-sample.csv ชุดเดียวกับที่ Playground ใช้ และตัวเลขในโค้ดเปลี่ยนตามค่าที่คุณปรับด้านล่าง

# ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*"
# ดาวน์โหลด term-document-heatmap-sample.csv จากหน้านี้ แล้ววางไว้ข้างสคริปต์
import matplotlib
matplotlib.use("Agg")   # รันแบบไม่มีหน้าจอ ถ้ารันในเครื่องตัวเองลบบรรทัดนี้ได้
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
import seaborn as sns

C1, C2, C3 = "#2a78d6", "#eb6834", "#1baf7a"   # palette ของคลัง เปลี่ยนเป็นสีองค์กรได้
INK, SURFACE = "#0b0b0b", "#fcfcfb"

df = pd.read_csv("term-document-heatmap-sample.csv")
df["count"] = pd.to_numeric(df["count"], errors="coerce")
NOTE = "unique"   # ← ค่าจาก Playground

fig, ax = plt.subplots(figsize=(7.6, 4.2), facecolor=SURFACE)
ax.set_facecolor(SURFACE)

# ★ TF-IDF จัดการเรื่องความยาวเอกสารให้เอง
vec = TfidfVectorizer(max_features=25, stop_words=THAI_STOPWORDS)
X = vec.fit_transform(documents)                     # documents = list ของข้อความ
mat = pd.DataFrame(X.T.toarray(), index=vec.get_feature_names_out(), columns=doc_names)
mat = mat.loc[mat.var(axis=1).sort_values(ascending=False).index]   # เรียงตามความต่าง
sns.heatmap(mat, cmap="Blues", linewidths=2, linecolor="#fcfcfb", ax=ax,
            cbar_kws={"label": "น้ำหนัก TF-IDF"})
ax.set_xlabel(""); ax.set_ylabel("")
ax.set_title("น้ำหนัก TF-IDF — ปรับตามความยาวเอกสารแล้ว", loc="left", fontsize=9)

ax.spines[["top", "right"]].set_visible(False)   # ลดเส้นที่ไม่ได้ให้ข้อมูล
fig.tight_layout()
fig.savefig("term-document-heatmap.png", dpi=160)
print("เขียน term-document-heatmap.png แล้ว ·", len(df), "แถว")

ติดตั้ง: pip install "matplotlib==3.10.*" "pandas==2.*" · ทดสอบกับเวอร์ชัน 3.10

07ลองเล่นเพื่อเข้าใจ

ข้อมูลตัวอย่าง · 14 แถว · seed 457● คำนวณใหม่ในเบราว์เซอร์ทันทีที่ปรับค่า
คำเฉพาะของเอกสาร
รีวิว 1 ดาวรีวิว 3 ดาวรีวิว 5 ดาวแชทซัพพอร์ตส่งเร็วราคาคุณภาพบริการแพ็กเกจคุ้มค่าสวยช้าใช้ง่ายพังส่งเร็ว · รีวิว 1 ดาว · 83 ครั้ง83ส่งเร็ว · รีวิว 3 ดาว · 83 ครั้ง83ส่งเร็ว · รีวิว 5 ดาว · 83 ครั้ง83ส่งเร็ว · แชทซัพพอร์ต · 83 ครั้ง83ราคา · รีวิว 1 ดาว · 67 ครั้ง67ราคา · รีวิว 3 ดาว · 157 ครั้ง157ราคา · รีวิว 5 ดาว · 90 ครั้ง90ราคา · แชทซัพพอร์ต · 179 ครั้ง179คุณภาพ · รีวิว 1 ดาว · 110 ครั้ง110คุณภาพ · รีวิว 3 ดาว · 95 ครั้ง95คุณภาพ · รีวิว 5 ดาว · 79 ครั้ง79คุณภาพ · แชทซัพพอร์ต · 63 ครั้ง63บริการ · รีวิว 1 ดาว · 83 ครั้ง83บริการ · รีวิว 3 ดาว · 71 ครั้ง71บริการ · รีวิว 5 ดาว · 59 ครั้ง59บริการ · แชทซัพพอร์ต · 48 ครั้ง48แพ็กเกจ · รีวิว 1 ดาว · 22 ครั้ง22แพ็กเกจ · รีวิว 3 ดาว · 22 ครั้ง22แพ็กเกจ · รีวิว 5 ดาว · 22 ครั้ง22แพ็กเกจ · แชทซัพพอร์ต · 22 ครั้ง22คุ้มค่า · รีวิว 1 ดาว · 16 ครั้ง16คุ้มค่า · รีวิว 3 ดาว · 16 ครั้ง16คุ้มค่า · รีวิว 5 ดาว · 16 ครั้ง16คุ้มค่า · แชทซัพพอร์ต · 16 ครั้ง16สวย · รีวิว 1 ดาว · 61 ครั้ง61สวย · รีวิว 3 ดาว · 31 ครั้ง31สวย · รีวิว 5 ดาว · 53 ครั้ง53สวย · แชทซัพพอร์ต · 23 ครั้ง23ช้า · รีวิว 1 ดาว · 54 ครั้ง54ช้า · รีวิว 3 ดาว · 27 ครั้ง27ช้า · รีวิว 5 ดาว · 47 ครั้ง47ช้า · แชทซัพพอร์ต · 20 ครั้ง20ใช้ง่าย · รีวิว 1 ดาว · 14 ครั้ง14ใช้ง่าย · รีวิว 3 ดาว · 14 ครั้ง14ใช้ง่าย · รีวิว 5 ดาว · 14 ครั้ง14ใช้ง่าย · แชทซัพพอร์ต · 14 ครั้ง14พัง · รีวิว 1 ดาว · 48 ครั้ง48พัง · รีวิว 3 ดาว · 24 ครั้ง24พัง · รีวิว 5 ดาว · 42 ครั้ง42พัง · แชทซัพพอร์ต · 18 ครั้ง18

ถ้าเอกสารยาวไม่เท่ากัน ต้องหารด้วยจำนวนคำทั้งหมดก่อน ไม่อย่างนั้นเอกสารยาวจะเข้มทุกช่อง

จำนวนคำ10
จำนวนเอกสาร4
ค่าสูงสุดในตาราง179
ดูข้อมูลเป็นตาราง (10 แถว)
term-document heatmap 10 คำ 4 เอกสาร
คำรีวิว 1 ดาวรีวิว 3 ดาวรีวิว 5 ดาวแชทซัพพอร์ต
ส่งเร็ว83838383
ราคา6715790179
คุณภาพ110957963
บริการ83715948
แพ็กเกจ22222222
คุ้มค่า16161616
สวย61315323
ช้า54274720
ใช้ง่าย14141414
พัง48244218

ลองแล้วจะเห็นอะไร

  • สังเกตอะไร: จุดเข้มเดี่ยว ๆ คือคำที่เอกสารเดียวเท่านั้นที่ใช้ ซึ่งมีค่ากว่าแถวที่เข้มทั้งแถวมาก

ข้อควรระวัง

  1. ★ ไม่ทำให้ค่าเป็นมาตรฐาน ทำให้ภาพบอกแค่ว่าเอกสารไหนยาวกว่า
  2. ไม่ระบุเกณฑ์เลือกคำที่แสดง ซึ่งเปิดช่องให้เลือกเฉพาะคำที่สนับสนุนข้อสรุป
  3. เรียงคำตามตัวอักษรทำให้รูปแบบกระจายจนมองไม่เห็น
  4. ไม่แยกค่าศูนย์จากช่องที่ไม่มีข้อมูล

เมื่อไหร่ไม่ควรใช้กราฟนี้

  • มีเอกสารชุดเดียวใช้แทน: word-frequency-bar
  • สนใจการเปลี่ยนแปลงตามเวลาใช้แทน: topic-stream
  • ต้องดูบริบทการใช้คำใช้แทน: kwic-view

กราฟที่เกี่ยวข้อง

เทคนิคถัดไป · กระแสหัวข้อ