01ภาพรวมของกราฟนี้
KWIC view เรียงทุกครั้งที่คำค้นปรากฏโดยจัดคำค้นให้ตรงกันกลางคอลัมน์ ทำให้เห็นรูปแบบของคำที่อยู่รอบและตีความความหมายจริงได้ ซึ่งเป็นสิ่งที่การนับความถี่ทำไม่ได้เลย แลกกับการที่ดูได้ทีละคำและใช้พื้นที่มาก
เปรียบเทียบให้เห็นภาพ
เหมือนพจนานุกรมที่ยกประโยคตัวอย่างมาให้ดู แทนที่จะให้แค่คำนิยาม
ใช้ที่ไหนบ้าง — ตรวจว่าคำที่พบบ่อยในรีวิวถูกใช้ในแง่บวกหรือลบ ตรวจสอบผลการวิเคราะห์อัตโนมัติ หรือศึกษาการใช้ภาษาจริง
สร้างอย่างไร
- ขั้นที่ 1เลือกคำค้นจากผลการนับความถี่
- ขั้นที่ 2ดึงทุกครั้งที่ปรากฏพร้อมบริบทซ้ายขวาที่กำหนด
- ขั้นที่ 3จัดคำค้นให้ตรงกันเป็นคอลัมน์กลาง
- ขั้นที่ 4เรียงตามคำที่อยู่ติดกันเพื่อให้รูปแบบปรากฏ
ตัวอย่างคลาสสิก · Concordance ในงานภาษาศาสตร์คลังข้อมูล
การเรียงคำพร้อมบริบทเป็นวิธีมาตรฐานของภาษาศาสตร์คลังข้อมูลมาตั้งแต่ก่อนมีคอมพิวเตอร์ โดยนักวิจัยทำด้วยมือบนบัตรกระดาษ การจัดคำค้นให้ตรงกันคือสิ่งที่ทำให้รูปแบบการใช้ภาษาปรากฏขึ้น และยังเป็นหัวใจของเครื่องมือวิเคราะห์คลังข้อความจนถึงทุกวันนี้
02อธิบายภาษาคนเข้าใจง่าย ๆ
การนับความถี่บอกว่าคำไหนพบบ่อย แต่ไม่บอกว่าคำนั้นถูกใช้อย่างไร ซึ่งเป็นช่องว่างที่ทำให้ตีความผิดได้ง่ายมาก
ตัวอย่างที่ชัดคือคำว่า "ราคา" ที่ติดอันดับต้นในรีวิว ซึ่งอาจมาจาก "ราคาคุ้มมาก" หรือ "ราคาแพงเกินไป" ที่ความหมายตรงข้ามกันโดยสิ้นเชิง
KWIC view แก้ด้วยการแสดงทุกครั้งที่คำนั้นปรากฏพร้อมคำที่อยู่รอบ โดยจัดคำค้นให้ตรงกันเป็นคอลัมน์กลาง
การจัดให้ตรงกันคือหัวใจ เพราะมันทำให้รูปแบบปรากฏเป็นแนวตั้ง ถ้าคำว่า "ไม่" ปรากฏก่อนคำค้นบ่อย ๆ ก็จะเห็นเป็นเสาชัดเจนทันที
ข้อดีที่สำคัญคือมันเป็นเครื่องมือตรวจสอบ ผลจากการวิเคราะห์อัตโนมัติควรถูกสุ่มมาดูด้วยวิธีนี้เสมอก่อนเชื่อ
ข้อจำกัดคือดูได้ทีละคำและใช้พื้นที่มาก จึงเป็นเครื่องมือสำหรับเจาะลึกหลังจากรู้แล้วว่าจะดูคำไหน ไม่ใช่เครื่องมือสำรวจภาพรวม
03ข้อมูลที่ต้องใช้
คอลัมน์ที่ต้องเตรียม
| คอลัมน์ | ทำหน้าที่ | ชนิด | เข้ารหัสด้วย | จำนวนค่าที่เหมาะ | หมายเหตุ |
|---|---|---|---|---|---|
word | คำค้น | ข้อความ | text | 1 คำต่อภาพ | จัดให้ตรงกันเป็นคอลัมน์กลาง |
count | จำนวนครั้งที่พบ | จำนวนนับ | text | บวกเท่านั้น | ใช้เรียงและบอกขนาดตัวอย่าง |
ต้องเตรียมข้อมูลอย่างไรก่อนวาด
- เลือกความกว้างของบริบทซ้ายขวา
- ★ ถ้าสุ่มตัวอย่างมาแสดงต้องระบุว่าสุ่มจากทั้งหมดกี่ครั้ง
- เรียงตามคำที่อยู่ติดกันเพื่อให้รูปแบบปรากฏ
ค่าที่หายไป — ครั้งที่อยู่ต้นหรือท้ายข้อความจะมีบริบทไม่ครบ ต้องแสดงตามจริงไม่ใช่ตัดทิ้ง
สเกลของแกน — ไม่มีสเกล แต่ความกว้างของบริบทต้องเท่ากันทุกบรรทัดเพื่อให้เทียบกันได้
กราฟจะเริ่มพังเมื่อไร
เกิน 200 บรรทัด ผู้อ่านเลื่อนดูไม่ไหว ต้องสุ่มตัวอย่างมาแสดง
หน้าตาไฟล์ที่ต้องเตรียม
word,count
ส่งเร็ว,331
ราคา,179
…04อ่านแล้วเห็นอะไร
สิ่งที่เห็นได้จากภาพ
- คำที่มักปรากฏก่อนหรือหลังคำค้น
- ความหมายจริงของคำค้นในบริบทนี้
- กรณีที่คำถูกใช้ผิดจากที่คาด
สิ่งที่กราฟนี้ตอบไม่ได้
- ★ ภาพรวมของข้อความทั้งชุด เพราะดูได้ทีละคำ
- ความถี่เชิงเปรียบเทียบกับคำอื่น
- บริบทที่อยู่ไกลกว่าที่กำหนดไว้
อ่านตามลำดับนี้
- กวาดสายตาลงคอลัมน์กลางเพื่อยืนยันว่าจัดตรงกัน
- มองหาคำที่ซ้ำกันในคอลัมน์ซ้ายหรือขวา
- อ่านบรรทัดที่ผิดจากรูปแบบเพื่อดูกรณียกเว้น
คำถามที่ตอบได้
- คำนี้ถูกใช้ในบริบทอย่างไร
- มีคำปฏิเสธนำหน้าบ่อยไหม
- ผลจากการวิเคราะห์อัตโนมัติถูกต้องไหม
สัญญาณว่ามีอะไรผิด
- คำค้นไม่ได้จัดให้ตรงกัน
- ไม่ระบุว่าแสดงกี่ครั้งจากทั้งหมด
- บริบทแคบเกินไปจนตีความไม่ได้
05เหมาะกับการนำเสนอแบบไหน
ทำอย่างไรให้คนอ่านได้ข้อสรุปโดยไม่ต้องบรรยาย
- ★ เน้นคำค้นด้วยสีหรือตัวหนาให้เด่นชัด
- ระบุว่าแสดงกี่ครั้งจากทั้งหมดกี่ครั้ง
- ทำเครื่องหมายบรรทัดที่เป็นตัวอย่างสำคัญ
รูปแบบชื่อกราฟที่ควรใช้
การใช้คำว่า <คำ> จำนวน <จำนวน> ครั้งจากทั้งหมด <จำนวน> ครั้ง
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), "แถว")07ลองเล่นเพื่อเข้าใจ
ตัวอย่างที่แสดงเป็นเพียงบางส่วน — การเลือกว่าจะโชว์บรรทัดไหนเปลี่ยนข้อสรุปได้
ดูข้อมูลเป็นตาราง (8 แถว)
| คำค้น | บริบทซ้าย | บริบทขวา | จำนวนครั้ง |
|---|---|---|---|
| ส่งเร็ว | ร้านนี้ | มากครับ | 331 |
| ราคา | โดยรวมแล้ว | พอใช้ได้ | 179 |
| คุณภาพ | ตอนแรกคิดว่า | เกินคาด | 126 |
| บริการ | สินค้าถึงไว | ไม่ผิดหวัง | 95.0 |
| แพ็กเกจ | แพ็กมาดี | แต่กล่องบุบ | 89.0 |
| คุ้มค่า | ราคาถูกแต่ | คุ้มราคา | 62.0 |
| สวย | ตอบแชทเร็ว | จะสั่งอีก | 61.0 |
| ช้า | ครั้งหน้า | ต้องปรับปรุง | 54.0 |
ลองแล้วจะเห็นอะไร
- สังเกตอะไร: ลองมองคอลัมน์ซ้ายในแนวตั้ง จะเห็นคำที่ซ้ำกัน — นี่คือรูปแบบที่การนับความถี่มองไม่เห็นเลย
ข้อควรระวัง
- ไม่จัดคำค้นให้ตรงกัน ซึ่งทำให้รูปแบบแนวตั้งหายไปหมด
- ไม่ระบุว่าแสดงกี่ครั้งจากทั้งหมด ทำให้ผู้อ่านคิดว่าเห็นครบแล้ว
- ใช้บริบทแคบเกินไปจนตีความไม่ได้
- ใช้เป็นเครื่องมือสำรวจภาพรวม ทั้งที่ดูได้ทีละคำ
เมื่อไหร่ไม่ควรใช้กราฟนี้
- ต้องการภาพรวมของคำทั้งชุด→ใช้แทน: word-frequency-bar
- ต้องเทียบระหว่างกลุ่มเอกสาร→ใช้แทน: term-document-heatmap
- สนใจแนวโน้มตามเวลา→ใช้แทน: topic-stream