วิธีการทำ PDF Extraction ด้วย Python
ในยุคที่ข้อมูลเป็นสิ่งที่มีค่าสูง หากคนมีข้อมูลเยอะ คุณสามารถเอามาทำ Data Analysis เพื่อวางแผนการตลาด หรือคุณสามารถเอามาทำ Data Science เพื่อผลิตเครื่องมือใหม่ๆ แต่สิ่งที่คุณต้องมีให้ได้ก่อน นั่นคือมี Data
วันนี้ผมจะมาพูดถึงเครื่องมือการ Extract ข้อมูลจากไฟล์ PDF ที่เป็นวิธีการเก็บไฟล์ที่นิยมของหลายๆบริษัท ผมจะแค่เกริ่นสั้นๆ ถึงวิธีการ extract ต่างๆ แต่จะยังไม่ลงลึก วิธีการทำใน blog นี้ ถ้าหากคุณสนใจการ extract วิธีไหนที่กล่าวใน blog นี้ สามารถเขียน comment ทิ้งไว้ได้ครับ แล้วผมจะพยายามเขียน blog อธิบายลงลึกอีกที
Structured Data vs Non Structured Data
ก่อนอื่นเราต้องมารู้จักกับสิ่งที่เรียกว่า Structured Data กับสิ่งที่เรียกว่า Non Structured Data กันก่อน
Data สามารถแบ่งออกเป็นสองประเภทนี้
Structured Data
- ข้อมูลที่เก็บใน relational database เช่น Postgres, MySQL หรือที่สามารถแสดงเป็น rows, column ได้
- ข้อมูลเป็นประเภท ตัวเลข วันที่ และตัวหนังสือ
Unstructured Data
- ไม่สามารถแสดงเป็น rows, column และไม่ได้เก็บอยู่ใน relational database
- เป็นไฟล์จำพวก รูปภาพ คลิปเสียง วีดีโอ ไฟล์ Word, Email, Spreadsheet
ข้อเสียหลักๆของ unstructured data คือการนำออกมาใช้ยาก เพราะฉะนั้นหน้าที่หลักๆของการทำ extraction คือการแปลง unstructured data ให้กลายเป็น structured ให้ได้
Searchable and Non-Seachable
PDF หรือ Portable Document Format เป็นประเภทไฟล์ที่ Adobe สร้างขึ้น ใน PDF นั้นสามารถมี text, image, vector graphic, image และอื่นๆอีกมากมาย
ส่วนใหญ่เวลาเราทำ extraction ข้อมูลที่เราต้องการเอาออกมาก็คือ ตัวหนังสือ หรือตัวเลขที่อยู่ในไฟล์ PDF
ถ้าเราโชคดี ในไฟล์ PDF นั้น text ที่เราจะดึงออกมาจะถูกเก็บแบบเป็น “Text data” ซึ่งสามารถดึงออกมาได้ง่ายและแม่นยำ วิธีการเช็คง่ายๆ ก็ลองเปิดไฟล์ PDF และลาก text ดู ว่าสามารถ highlight text ได้ไหม ผมเรียกไฟล์เหล่านี้ว่า Searchable PDF
ไฟล์อีกประเภทนึง คือไฟล์ที่เหมือนจะเป็นไฟล์ text ที่แปลงมาจากโปรแกรมอื่น แต่จริงๆแล้วเป็นไฟล์ image ที่ถูกแสกนขึ้นมา ทำให้เราไม่สามารถไปอ่าน Text Data ได้ เพราะมันคือรูปภาพ ผมเรียกไฟล์ประเภทนี้ว่า Non-Searchable PDF
⚠️ จงระวัง Fake Searchable หรือ ชื่อที่ผมใช้เรียกไฟล์ที่ถูกแปลงจาก Non-Searchable ให้กลายเป็น Searchable ด้วยโปรแกรมเช่น Acrobat Pro
เท่าที่เจอมา ข้อมูลที่ถูกแปลงมาจะนำมาใช้งานไม่ได้เลย แนะนำให้ลองลากและ copy text ออกมาดูว่า มันใช้งานได้ไหม ถ้าใช้ไม่ได้ อาจจะเป็นไฟล์แบบ Fake Searchable
Free Searchable PDF Extraction
การ Extract ข้อมูลจากไฟล์ Searchable นั้น ผมแนะนำให้ลองไปใช้
PDF Plumber สามารถ extract text, images, และแม้กระทั่งข้อมูลที่อยู่ใน format ของ table และนำออกมาเป็น DataFrame ให้ได้เลย หากข้อมูลที่ extract ไม่ถูกต้อง ให้ลองไปปรับ config ต่างๆที่อยู่ใน README ดู ผมเชื่อว่าสำหรับไฟล์ส่วนใหญ่ คุณสามารถ extract ด้วย PDF Plumber ได้เลย โดยแทบไม่ต้องทำอะไรเพิ่มเติมเลย
สำหรับไฟล์ประเภท Table ต่างๆ และใช้ PDF Plumber ก็ยังไม่เวิร์ค ผมแนะนำให้ไปลอง
Free Non-searchable PDF Extraction
สำหรับไฟล์ประเภท Non-Searchable นั่น การ extract ออกมานั้นยากกว่า Searchable เยอะเลย คุณต้องใช้ OCR (Optical Character Recognition) เพื่อแปลงตัวอักษรและตัวเลขจากภาพ ให้กลายเป็น “Text data”
สำหรับข้อมูลที่คุณต้องการเป็น paragraph คุณสามารถแยกภาพ paragraph นั้นออกมา และโยนเข้าไปในโปรแกรม OCR ได้เลย
แต่หลายๆครั้งข้อมูลที่คุณต้องการจะอยู่ใน table ถ้าคุณโยน table เข้า OCR เลย สิ่งที่คุณได้กลับมาจะเละตุ๋มเป๊ะ วิธีการที่ผมทำแล้วผมว่าเวิร์ค คือพยายามตัด text ออกออกมาเป็นเป็นกล่องๆ แล้วค่อยประกอบ table กลับมาใหม่ แต่การที่คุณจะทำอย่างนั้นได้คุณจะต้องมีความรู้เรื่อง Image Processing พอสมควร
พวกหัวข้อที่เกี่ยวข้องคือพวกการทำ Hough lines และการหา Contours สองอย่างนี้จะช่วยให้คุณหาเส้นของ table ใน image ได้ เพื่อหาว่าจุดที่คุณจะต้องเอาออกมาอยู่ตรงไหน
เครื่องมือสำหรับ Image Processing / PDF Processing
สิ่งที่สำคัญที่คุณควรจะตระหนักไว้ตลอดเวลาคือ ณ ปัจจุบัน OCR ไม่มีทางแปลงข้อมูลออกมาได้ถูก 100% เพราะฉะนั้นคุณต้องระวัง ว่าข้อมูลที่คุณต้องการนำออกมาใช้ สามารถมีการผิดได้บ้าง
คุณสามารถลองใช้ OCR program เช่น tesserocr ที่เป็น wrapper ของ Tesseract หรือถ้าไม่เวิร์คก็ลองเขียน model OCR ขึ้นมาเองก็ได้นะครับ
Commercial Tools
นอกจากการใช้ tools ฟรี นั้นก็มี tools ที่เสียตังค์และสามารถใช้งานการ extract ได้ดีมากๆอยู่สองตัวที่ผมอยากแนะนำก็คือ
สุดท้ายผมเชื่อว่ายังไม่มี tools ไหนที่เป็นเครื่องมือเดียวที่ทำได้ทุกอย่าง และอาจเป็นไปไม่ได้ด้วยซ้ำ เนื่องจากข้อมูลที่อยู่ใน PDF ได้นั้นหลากหลายมาก และแต่ละคนก็เก็บข้อมูลไม่เหมือนกัน สิ่งที่เราทำได้ก็คือพยายามเรียนรู้เครื่องมือที่เรามี และนำมาใช้ให้ถูกต้องครับ