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

มุมมองคำในบริบทKWIC View

เห็นว่าคำนั้นถูกใช้อย่างไรจริง ๆ

2
ต่อยอดโดยตรงควรรู้ก่อน · ไม่ต้องมีพื้นฐาน
ลองเล่น

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

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

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

เหมือนพจนานุกรมที่ยกประโยคตัวอย่างมาให้ดู แทนที่จะให้แค่คำนิยาม

ใช้ที่ไหนบ้าง — ตรวจว่าคำที่พบบ่อยในรีวิวถูกใช้ในแง่บวกหรือลบ ตรวจสอบผลการวิเคราะห์อัตโนมัติ หรือศึกษาการใช้ภาษาจริง

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

  1. ขั้นที่ 1เลือกคำค้นจากผลการนับความถี่
  2. ขั้นที่ 2ดึงทุกครั้งที่ปรากฏพร้อมบริบทซ้ายขวาที่กำหนด
  3. ขั้นที่ 3จัดคำค้นให้ตรงกันเป็นคอลัมน์กลาง
  4. ขั้นที่ 4เรียงตามคำที่อยู่ติดกันเพื่อให้รูปแบบปรากฏ

ตัวอย่างคลาสสิก · Concordance ในงานภาษาศาสตร์คลังข้อมูล

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

Wikipedia · Key Word in Context

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

การนับความถี่บอกว่าคำไหนพบบ่อย แต่ไม่บอกว่าคำนั้นถูกใช้อย่างไร ซึ่งเป็นช่องว่างที่ทำให้ตีความผิดได้ง่ายมาก

ตัวอย่างที่ชัดคือคำว่า "ราคา" ที่ติดอันดับต้นในรีวิว ซึ่งอาจมาจาก "ราคาคุ้มมาก" หรือ "ราคาแพงเกินไป" ที่ความหมายตรงข้ามกันโดยสิ้นเชิง

KWIC view แก้ด้วยการแสดงทุกครั้งที่คำนั้นปรากฏพร้อมคำที่อยู่รอบ โดยจัดคำค้นให้ตรงกันเป็นคอลัมน์กลาง

การจัดให้ตรงกันคือหัวใจ เพราะมันทำให้รูปแบบปรากฏเป็นแนวตั้ง ถ้าคำว่า "ไม่" ปรากฏก่อนคำค้นบ่อย ๆ ก็จะเห็นเป็นเสาชัดเจนทันที

ข้อดีที่สำคัญคือมันเป็นเครื่องมือตรวจสอบ ผลจากการวิเคราะห์อัตโนมัติควรถูกสุ่มมาดูด้วยวิธีนี้เสมอก่อนเชื่อ

ข้อจำกัดคือดูได้ทีละคำและใช้พื้นที่มาก จึงเป็นเครื่องมือสำหรับเจาะลึกหลังจากรู้แล้วว่าจะดูคำไหน ไม่ใช่เครื่องมือสำรวจภาพรวม

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

รูปทรงของข้อมูลข้อมูลดิบรายแถว (ยังไม่สรุป)
จำนวนมิติที่เข้ารหัสได้2 มิติ
จำนวนแถวที่เหมาะ20–80 บรรทัดที่แสดงขั้นต่ำ 5 แถว
เส้นฐานศูนย์ไม่เกี่ยวข้องเป็นการแสดงข้อความ ไม่มีแกนค่า

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

คอลัมน์ทำหน้าที่ชนิดเข้ารหัสด้วยจำนวนค่าที่เหมาะหมายเหตุ
wordคำค้นข้อความtext1 คำต่อภาพจัดให้ตรงกันเป็นคอลัมน์กลาง
countจำนวนครั้งที่พบจำนวนนับtextบวกเท่านั้นใช้เรียงและบอกขนาดตัวอย่าง

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

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

ค่าที่หายไป — ครั้งที่อยู่ต้นหรือท้ายข้อความจะมีบริบทไม่ครบ ต้องแสดงตามจริงไม่ใช่ตัดทิ้ง

สเกลของแกน — ไม่มีสเกล แต่ความกว้างของบริบทต้องเท่ากันทุกบรรทัดเพื่อให้เทียบกันได้

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

เกิน 200 บรรทัด ผู้อ่านเลื่อนดูไม่ไหว ต้องสุ่มตัวอย่างมาแสดง

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

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

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

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

  • คำที่มักปรากฏก่อนหรือหลังคำค้น
  • ความหมายจริงของคำค้นในบริบทนี้
  • กรณีที่คำถูกใช้ผิดจากที่คาด

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

  • ★ ภาพรวมของข้อความทั้งชุด เพราะดูได้ทีละคำ
  • ความถี่เชิงเปรียบเทียบกับคำอื่น
  • บริบทที่อยู่ไกลกว่าที่กำหนดไว้

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

  1. กวาดสายตาลงคอลัมน์กลางเพื่อยืนยันว่าจัดตรงกัน
  2. มองหาคำที่ซ้ำกันในคอลัมน์ซ้ายหรือขวา
  3. อ่านบรรทัดที่ผิดจากรูปแบบเพื่อดูกรณียกเว้น

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

  • คำนี้ถูกใช้ในบริบทอย่างไร
  • มีคำปฏิเสธนำหน้าบ่อยไหม
  • ผลจากการวิเคราะห์อัตโนมัติถูกต้องไหม

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

  • คำค้นไม่ได้จัดให้ตรงกัน
  • ไม่ระบุว่าแสดงกี่ครั้งจากทั้งหมด
  • บริบทแคบเกินไปจนตีความไม่ได้

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

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

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

  1. ★ เน้นคำค้นด้วยสีหรือตัวหนาให้เด่นชัด
  2. ระบุว่าแสดงกี่ครั้งจากทั้งหมดกี่ครั้ง
  3. ทำเครื่องหมายบรรทัดที่เป็นตัวอย่างสำคัญ

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

การใช้คำว่า <คำ> จำนวน <จำนวน> ครั้งจากทั้งหมด <จำนวน> ครั้ง

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

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

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

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

df = pd.read_csv("kwic-view-sample.csv")
df["count"] = pd.to_numeric(df["count"], errors="coerce")
NOTE = "align"   # ← ค่าจาก Playground

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

# KWIC เป็นการแสดงข้อความ ไม่ใช่กราฟ — สร้างเป็นตารางแล้วพิมพ์หรือ render เป็น HTML
KEYWORD, WIDTH = "ราคา", 40
lines = []
for doc in documents:
    for m in re.finditer(re.escape(KEYWORD), doc):
        left = doc[max(0, m.start() - WIDTH):m.start()].rjust(WIDTH)
        right = doc[m.end():m.end() + WIDTH].ljust(WIDTH)
        lines.append({"ซ้าย": left, "คำค้น": KEYWORD, "ขวา": right})
kwic = pd.DataFrame(lines).sort_values("ขวา")     # เรียงตามบริบทขวา
ax.axis("off")
for i, r in enumerate(kwic.head(20).itertuples()):
    ax.text(0.0, 1 - i * 0.05, r.ซ้าย, ha="right", family="monospace", fontsize=8,
            transform=ax.transAxes)
    ax.text(0.0, 1 - i * 0.05, f" {KEYWORD} ", ha="left", family="monospace",
            fontsize=8, color=C1, weight="bold", transform=ax.transAxes)
    ax.text(0.14, 1 - i * 0.05, r.ขวา, ha="left", family="monospace", fontsize=8,
            transform=ax.transAxes)

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

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

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

ข้อมูลตัวอย่าง · 14 แถว · seed 457● คำนวณใหม่ในเบราว์เซอร์ทันทีที่ปรับค่า
การจัดตรงกันคือหัวใจ
บริบทซ้ายคำค้นบริบทขวาร้านนี้ส่งเร็วมากครับ331ส่งเร็ว · พบ 331 ครั้งโดยรวมแล้วราคาพอใช้ได้179ราคา · พบ 179 ครั้งตอนแรกคิดว่าคุณภาพเกินคาด126คุณภาพ · พบ 126 ครั้งสินค้าถึงไวบริการไม่ผิดหวัง95.0บริการ · พบ 95.0 ครั้งแพ็กมาดีแพ็กเกจแต่กล่องบุบ89.0แพ็กเกจ · พบ 89.0 ครั้งราคาถูกแต่คุ้มค่าคุ้มราคา62.0คุ้มค่า · พบ 62.0 ครั้งตอบแชทเร็วสวยจะสั่งอีก61.0สวย · พบ 61.0 ครั้งครั้งหน้าช้าต้องปรับปรุง54.0ช้า · พบ 54.0 ครั้ง

ตัวอย่างที่แสดงเป็นเพียงบางส่วน — การเลือกว่าจะโชว์บรรทัดไหนเปลี่ยนข้อสรุปได้

จำนวนคำค้น8
คำที่พบบ่อยที่สุดส่งเร็ว
จัดกึ่งกลางที่ตำแหน่งของคำค้น
ดูข้อมูลเป็นตาราง (8 แถว)
keyword in context 8 คำ
คำค้นบริบทซ้ายบริบทขวาจำนวนครั้ง
ส่งเร็วร้านนี้มากครับ331
ราคาโดยรวมแล้วพอใช้ได้179
คุณภาพตอนแรกคิดว่าเกินคาด126
บริการสินค้าถึงไวไม่ผิดหวัง95.0
แพ็กเกจแพ็กมาดีแต่กล่องบุบ89.0
คุ้มค่าราคาถูกแต่คุ้มราคา62.0
สวยตอบแชทเร็วจะสั่งอีก61.0
ช้าครั้งหน้าต้องปรับปรุง54.0

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

  • สังเกตอะไร: ลองมองคอลัมน์ซ้ายในแนวตั้ง จะเห็นคำที่ซ้ำกัน — นี่คือรูปแบบที่การนับความถี่มองไม่เห็นเลย

ข้อควรระวัง

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

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

  • ต้องการภาพรวมของคำทั้งชุดใช้แทน: word-frequency-bar
  • ต้องเทียบระหว่างกลุ่มเอกสารใช้แทน: term-document-heatmap
  • สนใจแนวโน้มตามเวลาใช้แทน: topic-stream

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

เทคนิคถัดไป · แท่งความเห็นสองขั้ว