สำรวจโครงสร้างของต้นฉบับวอยนิชด้วยการโมเดลโดยใช้ SBERT
(github.com/brianmg)- รีโพสitory นี้ใช้การทำคลัสเตอร์ การอนุมานชนิดคำ การเปลี่ยนสถานะ Markov และแพตเทิร์นแยกตามเซกชัน โดยไม่พึ่งการคาดเดาคำแปล เพื่อดูว่าต้นฉบับวอยนิชมี แพตเทิร์นเชิงโครงสร้าง ที่ทำงานเหมือนภาษาจริงหรือไม่
- ไปป์ไลน์การวิเคราะห์จะลบสิ่งที่ดูเหมือนปัจจัยท้ายซ้ำ ๆ เช่น
aiin,dy,chyเป็นต้น จากนั้นใช้ multilingual SBERT ฝังเวกเตอร์รากคำและสร้างคลัสเตอร์ พร้อมแมปแต่ละบรรทัดของต้นฉบับให้เป็นลำดับคลัสเตอร์ - ผลลัพธ์ชี้ให้เห็นความแตกต่างเชิงโครงสร้าง เช่น Cluster 8 มีความถี่สูง ความหลากหลายต่ำ และปรากฏที่ตำแหน่งต้นบรรทัดบ่อย จึงดูเหมือนกลุ่มคำหน้าที่ ส่วน Cluster 3 มีความหลากหลายและความยืดหยุ่นของตำแหน่งสูง จึงดูเหมือนคลาสรากคำเนื้อหา
- การลบปัจจัยท้ายทำให้รากคำที่คล้ายกันถูกจัดกลุ่มแน่นขึ้น และทำให้เมทริกซ์การเปลี่ยนสถานะสะอาดขึ้น แต่ก็เป็นทางเลือกการประมวลผลล่วงหน้าที่หนัก เพราะอาจลบข้อมูลรูปคำจริง บดบังความแปรผันเชิงการผันที่มีความหมาย หรือสร้าง อคติที่เน้นด้านหน้าที่ ได้
- โปรเจกต์นี้ไม่ได้พยายามแปลความหมาย แต่มุ่งตรวจสอบด้วยข้อมูลว่าต้นฉบับวอยนิชแสดงโครงสร้างคล้ายภาษา เช่น วากยสัมพันธ์ การแยกคำหน้าที่/คำเนื้อหา และการเปลี่ยนแปลงทางภาษาตามเซกชันหรือไม่
วัตถุประสงค์ของโปรเจกต์
- ต้นฉบับวอยนิชยังไม่ถูกถอดรหัส และยังไม่มี คำตอบทางภาษาศาสตร์หรือวิทยาการรหัสลับ ที่เป็นที่ยอมรับร่วมกัน
- โปรเจกต์นี้เลือกเส้นทางกึ่งกลางระหว่างการตรวจสอบเอนโทรปีเชิงสถิติกับการตีความที่ไร้หลักฐาน โดยใช้เทคนิคภาษาศาสตร์เชิงคำนวณเพื่อประเมินว่าต้นฉบับเข้ารหัสพฤติกรรมคล้ายภาษาที่มีโครงสร้างหรือไม่
- ไม่ทำการแปลหรือคาดเดาแบบ GPT แต่มุ่งเฉพาะว่ามี โครงสร้างที่ทำงานเหมือนภาษา หรือไม่
ไปป์ไลน์การวิเคราะห์และโครงสร้างไฟล์
/data/มีสำเนาถอดความทั้งหมด ไฟล์คำราก รายการรากคำที่ถูกลบ ตารางค้นหาคลัสเตอร์ และลำดับคลัสเตอร์รายบรรทัด/scripts/แยกขั้นตอนการวิเคราะห์สำหรับรันcluster_roots.py: การทำคลัสเตอร์ด้วย SBERT และการลบปัจจัยท้ายmap_lines_to_clusters.py: แมปบรรทัดของต้นฉบับเป็น ID คลัสเตอร์pos_model.py: อนุมานบทบาททางไวยากรณ์จากพฤติกรรมของคลัสเตอร์transition_matrix.py: สร้างและแสดงภาพการเปลี่ยนสถานะของคลัสเตอร์lexicon_builder.py: สร้างตารางคำศัพท์ผู้สมัครตามเซกชันและบทบาทcluster_language_similarity.py: เปรียบเทียบคลัสเตอร์กับภาษาจริงแบบเลือกทำได้
/results/เก็บภาพคลัสเตอร์ที่ลดมิติด้วย PCA, ฮีตแมปเมทริกซ์การเปลี่ยนสถานะ Markov, สรุปบทบาทของคลัสเตอร์, CSV เมทริกซ์การเปลี่ยนสถานะ และ CSV คำศัพท์ผู้สมัคร
คุณูปการหลัก
- ใช้ multilingual SBERT เพื่อทำคลัสเตอร์ รากคำที่ลบปัจจัยท้ายแล้ว
- แยกคลัสเตอร์ที่ดูเหมือนคำหน้าที่ออกจากคลัสเตอร์ที่ดูเหมือนคำเนื้อหา
- ทำ การโมเดลการเปลี่ยนสถานะแบบ Markov บนลำดับคลัสเตอร์
- แมปโครงสร้างวากยสัมพันธ์ตามเซกชันของต้นฉบับ เช่น Botanical, Biological
- สร้าง ตารางสมมติฐานคำศัพท์ จากข้อมูลตามเซกชันและบทบาท
ทางเลือกการประมวลผลล่วงหน้าและผลกระทบ
- ลบ
aiin,dy,chyและรูปแปรคล้ายกันที่ดูเหมือนปัจจัยท้ายซ้ำ ๆ ออกจากแต่ละคำ - จุดประสงค์ของทางเลือกนี้คือการแยก รูปของรากคำ ที่เกิดซ้ำพร้อมกับรูปแปร
- มองว่าปัจจัยท้ายอาจเป็นหนึ่งในสิ่งต่อไปนี้
- การเติมเสียง
- อนุภาคทางไวยากรณ์
- การซ้ำแบบคาถาหรือช่วยจำ
- สัญญาณรบกวน
- หลังลบปัจจัยท้าย รากคำที่คล้ายกันถูกจัดกลุ่มแน่นขึ้น และเมทริกซ์การเปลี่ยนสถานะแสดงแพตเทิร์นโครงสร้างที่สะอาดขึ้น
- อย่างไรก็ตาม การประมวลผลล่วงหน้านี้ไม่เป็นกลาง
- อาจลบข้อมูลรูปคำจริงออกไป
- อาจบดบังความแปรผันของการผันคำที่มีความหมาย
- อาจทำให้ผลลัพธ์เอนเอียงไปทาง ด้านหน้าที่ มากกว่าเนื้อหา
- สามารถเปรียบเทียบได้โดยรันไปป์ไลน์ใหม่แบบไม่ลบปัจจัยท้าย หรือจัดการปัจจัยท้ายเป็นคลาสโทเค็นแยกต่างหาก
โครงสร้างที่สังเกตได้
- Cluster 8 มีความถี่สูง ความหลากหลายต่ำ และมักปรากฏที่ตำแหน่งต้นบรรทัด จึงอาจเป็นกลุ่มคำหน้าที่
- Cluster 3 มีความหลากหลายสูงและตำแหน่งยืดหยุ่น จึงอาจเป็นคลาสคำเนื้อหาที่เป็นรากคำ
- เมทริกซ์การเปลี่ยนสถานะแสดงโครงสร้างภายในที่แข็งแรงและห่างไกลจากความสุ่ม
- การใช้คลัสเตอร์และแพตเทิร์นชนิดคำแตกต่างกันไปตามเซกชันของต้นฉบับ เช่น Biological, Botanical
สมมติฐานและข้อจำกัด
- ตั้งสมมติฐานว่าต้นฉบับเข้ารหัส ภาษาประดิษฐ์ที่มีโครงสร้าง หรือภาษาช่วยจำ ซึ่งใช้การเติมพยางค์และการซ้ำตามตำแหน่ง
- แม้ไม่มีการแปลโดยตรง ก็เห็นวากยสัมพันธ์ การแยกคำหน้าที่/คำเนื้อหา และการเปลี่ยนแปลงทางภาษาที่รับรู้เซกชัน
- ระบุข้อจำกัดไว้ด้วย
- การแมประหว่างคลัสเตอร์กับคำเป็นแบบอ้อม จึงอาจมีการซ้อนทับในการประมาณความถี่
- การลบปัจจัยท้ายเป็นฮิวริสติก และอาจลบคำลงท้ายที่มีความหมายออกไป
- ไม่พยายามแปลความหมาย ทำเพียง การโมเดลโครงสร้าง เท่านั้น
การทำซ้ำและการเปลี่ยนแปลงล่าสุด
- ขั้นตอนการทำซ้ำคือ ติดตั้ง dependencies แล้วรันสคริปต์แต่ละตัวตามลำดับ
pip install -r requirements.txtpython scripts/cluster_roots.pypython scripts/map_lines_to_clusters.pypython scripts/pos_model.pypython scripts/transition_matrix.pypython scripts/lexicon_builder.py
- นอกจาก PCA แล้ว การแสดงภาพยังเพิ่มการรองรับ UMAP, PaCMAP, LocalMAP
- CLI reducer ใช้ PCA เมื่อไม่มีอาร์กิวเมนต์ และรองรับ
--reducer umap,--reducer pacmap - โปรเจกต์มีข้อจำกัดว่าเคยทำงานได้บน Windows แต่ยังทำให้ทำงานได้ถูกต้องบน MacOS ไม่ได้
- โมเดลถูกเปลี่ยนจาก
all-MiniLM-L6-v2ไปเป็นparaphrase-multilingual-mpnet-base-v2ที่ใหญ่กว่า- README ระบุการเปรียบเทียบขนาดไว้ว่า
22M vs 110M
- README ระบุการเปรียบเทียบขนาดไว้ว่า
1 ความคิดเห็น
ความเห็นจาก Hacker News
ถ้ากำลังมองหาคลัสเตอร์จากการฉายภาพด้วย PCA ก็น่าจะลองใช้อัลกอริทึมลดมิติรุ่นใหม่อย่าง PaCMAP หรือ LocalMAP เพื่อดูโครงสร้างที่ลึกขึ้น
ผมกำลังทำโปรเจกต์ที่เกี่ยวข้องกับเครื่องมือทำความเข้าใจความหมายชื่อ Pol.is [1] และพอลองฉายข้อมูลแบบสอบถามวิกิใหม่ด้วยอัลกอริทึมพวกนี้แทน PCA ก็ได้มุมมองใหม่ที่น่าทึ่งพอสมควร
https://patcon.github.io/polislike-opinion-map-painting/
Painted groups: https://t.co/734qNlMdeh
น่าเสียดายที่ใช้งานได้ดีจริง ๆ แค่บนเดสก์ท็อป
[1]: https://www.technologyreview.com/2025/04/15/1115125/a-small-...
มันต่างจาก “factor analysis” แบบเก่า
โมเดล text embedding ที่ใช้ตรงนี้คือ paraphrase-multilingual-MiniLM-L12-v2(https://huggingface.co/sentence-transformers/paraphrase-mult...) ซึ่งเป็นโมเดลเมื่อราว 4 ปีก่อน
ในโลก NLP มันแทบจะนับว่าโบราณแล้ว และด้วยความก้าวหน้าของ LLM โดยรวม แม้แต่โมเดล embedding ขนาดเล็กก็พัฒนาขึ้นมากทั้งด้านความสามารถในการแทนข้อมูลและการแยกความต่างใน embedding space
ทุกวันนี้โมเดล text embedding หลายตัวทำงานกับข้อมูลแบบนี้ได้ดีพอสมควร แม้จะไม่ได้ฝึกให้รองรับหลายภาษาอย่างชัดเจน จึงอาจเหมาะกับภาษาอย่างต้นฉบับวอยนิชที่ค่อนข้างไม่เป็นที่รู้จักมากกว่า
เทคนิค NLP แบบดั้งเดิมอย่างการตัด suffix หรือการระบุชนิดคำอาจกลับทำให้คุณภาพ embedding แย่ลงได้ เพราะข้อมูลบริบทที่จำเป็นต่อ embedding ทั้งหมดหายไป
เลยอยากรู้ว่าโมเดลอย่าง all-mpnet-base-v2 หรือ text-embedding-ada-002 จะให้ผลอย่างไร โดยเฉพาะถ้าใช้embedding แบบบริบทเต็มโดยคง suffix ไว้และไม่ย่อให้เหลือแค่รูปคำราก ก็น่าจะน่าสนใจกว่า
ผมไม่ค่อยรู้เรื่อง NLP แต่สงสัยว่าการมีกลุ่มควบคุมในกระบวนการนี้จะสมเหตุสมผลไหม
เช่น ให้คนเขียนข้อความที่ดูเหมือนภาษาแต่จริง ๆ ไม่ใช่ภาษา แล้วเอาไปผ่านขั้นตอนเดียวกันอย่างการตัด suffix และการจัดกลุ่ม เพื่อดูว่ามีโอกาสได้ผลคล้ายกันหรือไม่
เคยดูต้นฉบับนี้อยู่พักหนึ่ง แล้วรู้สึกว่าน่าสงสัยตรงที่บางหน้าข้อความชิดภาพประกอบมากเกินไป
ในภาษาปกติ ความกว้างของคำและตัวอักษรไม่เท่ากัน ดังนั้นเมื่อใกล้สุดบรรทัดก็มักจะตัดบรรทัดอย่างเป็นธรรมชาติเพื่อขึ้นคำใหม่และเลี่ยงข้อความล้น
แต่ต้นฉบับนี้ดูเหมือนไม่มีการขาดตอนลักษณะนั้นเลย และหลายจุดก็เหมือนยัดตัวอักษรอะไรก็ได้ที่พอใส่ลงท้ายบรรทัดได้เข้าไป
ผมอยากวิเคราะห์ว่ามีตัวอักษรอะไรบ้างที่มักปรากฏก่อนและหลังการขึ้นบรรทัดใหม่ และมันต่างจากทั้งเนื้อหาที่เหลือหรือไม่ แต่หาฉบับถอดความไม่เจอ
ถ้ามองแบบสมัครเล่นล้วน ๆ มันดูเหมือนงานศิลปะที่ประณีตมาก หรือไม่ก็เป็นเรื่องหลอกลวง
แค่ PCA ก็เห็นการแยกได้ชัดแล้ว แต่ UMAP หรือ t-SNE ก็น่าจะดีเหมือนกัน
ถ้าลองทำ baseline mapping ให้แต่ละคลัสเตอร์เทียบกับคลัสเตอร์อื่นทั้งหมด ก็น่าจะเป็นวิธีที่ดีในการดูว่ายังมีความแปรปรวนเหลืออยู่ในการวิเคราะห์อีกไหม
แต่ก็จริงที่การใช้ UMAP หรือ t-SNE อาจช่วยจับแพตเทิร์นที่ละเอียดกว่า หรือกรณีล้มเหลวจากมุมมองแบบไม่เชิงเส้นได้
ผมยังไม่ได้สร้างเมทริกซ์ความคล้ายระหว่างคลัสเตอร์ แต่พอฟังแล้วมันก็ดูเป็นขั้นต่อไปที่เป็นธรรมชาติสำหรับตรวจว่าจับสัญญาณจริงได้มากแค่ไหน
ผมอยากลองเอาไปใช้กับ embedding รูปแบบอื่นดู แต่ไม่ได้มีประสบการณ์ด้าน NLP มากนัก
ส่วน t-SNE นั้นผมเลี่ยงไม่ว่าแลกกับอะไร เพราะมองว่าระยะในภาพแบบนั้นแทบไม่มีความหมาย
อันนี้ไม่ใช่คำแนะนำตายตัวนะ แค่รสนิยมส่วนตัว
น่าสนใจมาก น่าจะลองโพสต์ลิงก์ไว้ที่ https://www.voynich.ninja/index.php ด้วย
ผมไม่ได้คุ้นกับ SBERT หรือการประมวลผลภาษาธรรมชาติแบบสถิติสมัยใหม่โดยรวมมากนัก แต่ SBERT ทำงานในระดับประโยค ขณะที่ต้นฉบับ Voynich ไม่มี ตัวคั่นประโยค ที่ชัดเจน
มีแค่ตัวคั่นคำกับตัวคั่นย่อหน้าเท่านั้น
อีกจุดที่น่ากังวลคือ “การตัดคำต่อท้ายที่พบบ่อยออกจากคำใน Voynich”
คำในต้นฉบับ Voynich ดูเหมือนจะเป็นคำนำหน้า + คำต่อท้าย และคำนำหน้าก็ค่อนข้างสั้น จึงอาจสูญเสียข้อมูลไปประมาณครึ่งหนึ่งตั้งแต่ก่อนเริ่มวิเคราะห์
น่าจะดีถ้าได้ตรวจสอบว่าวิธีนี้ใช้ได้กับข้อความภาษาธรรมชาติที่มีความหมายจริง และใช้ได้กับข้อความเพ้อเจ้อไร้ความหมายด้วยหรือไม่
ข้อความเข้ารหัสน่าจะอยู่ระหว่างสองอย่างนั้น โดยยิ่งเป็นรหัสแบบง่ายก็ยิ่งใกล้ภาษาธรรมชาติ และยิ่งเป็นรหัสซับซ้อนก็ยิ่งใกล้ข้อความเพ้อเจ้อไร้ความหมาย
Gordon Rugg, Torsten Timm และตัวผมเอง ต่างก็เคยสร้างข้อความที่คล้ายต้นฉบับ Voynich มากด้วยวิธีที่ต่างกัน
ของผมอยู่ที่นี่: https://fmjlang.co.uk/voynich/generated-voynich-manuscript.h...
เวอร์ชัน EVA ที่เทียบเท่ากันอยู่ที่นี่: https://fmjlang.co.uk/voynich/generated-voynich-manuscript.t...
อาจพลาดไปใน README แต่ผมสงสัยว่ามีการเข้ารหัส “คำ” ตั้งแต่ต้นอย่างไร
ตัวอย่างเช่น ถ้ามีคำอย่าง "okeeodair" ผมอยากรู้ว่ามันแมปกลับไปยังสัญลักษณ์ดั้งเดิมตรงไหน
ดังนั้นจึงไม่ได้จัดการกับตัวกลิฟโดยตรง แต่ใช้คำถอดความมาตรฐานที่อิงกับระบบ EVA (European Voynich Alphabet)
ถอดความที่ใช้หาได้ที่นี่: https://www.voynich.nu/
ในโปรเจ็กต์นี้ไม่ได้แมปกลับไปเป็นกลิฟอีกครั้ง และทุกอย่างเริ่มต้นจากการถอดความแบบ EVA
ดังนั้นถ้าในชุดข้อมูลมีคำว่า "okeeodair" ก็เป็นเพราะมีใครสักคนที่ฉลาดกว่าผมมาก ดูลำดับกลิฟแล้วตกลงกันว่าจะเรียกมันแบบนั้น
ผมเคยมองว่านี่เป็นหนึ่งในสมมติฐานที่น่าสนใจที่สุด: http://voynichproject.org/
ผู้เขียนตั้งสมมติฐานว่า Voynichese เป็น กลุ่มภาษาเจอร์แมนิก และดูเหมือนว่าจะมีความคืบหน้าไปได้พอสมควร
ผมก็เคยเห็นด้วยว่าอาจเป็นตระกูลภาษาอูราลิกหรือฟินโน-อูกริก
แนวทางนี้ยอดเยี่ยม และผมสงสัยว่าถ้าปรับให้เข้ากับตระกูลภาษาเฉพาะเจาะจง อาจไปได้ไกลกว่านี้หรือไม่
เว็บไซต์ของ Bernholz ถือว่าโอเค แต่ผลงานของ Child ไม่ได้ช่วยให้เข้าใจการถอดรหัสต้นฉบับจริง ๆ มากนัก
อาจเป็นคนที่ไม่รู้กฎของภาษาแต่พยายามเลียนแบบภาษา: https://en.wikipedia.org/wiki/Naïve_art
ไม่ได้หมายถึงปัญหาทางจิตนะ เป็นเพียงปรากฏการณ์ที่เกิดขึ้นได้แต่ไม่บ่อย
Voynich เข้ากับเงื่อนไขของผลงาน ศิลปะแนวไร้เดียงสา ได้ค่อนข้างดี
1.https://en.wikipedia.org/wiki/Edward_Kelley
2.https://en.wikipedia.org/wiki/Cardan_grille
ถ้าเป็นศตวรรษที่ 15 เหตุผลที่ชัดเจนในการเข้ารหัสข้อความก็น่าจะเป็นเพื่อหลีกเลี่ยง ศาลไต่สวนคดีศาสนา และความรุนแรงทางศาสนาอื่น ๆ ในยุคนั้น
ดังนั้นก็น่าสนใจถ้าจะนำการประมวลผลภาษาธรรมชาติแบบเดียวกันไปใช้กับพระวรสารเพื่อหาความสัมพันธ์
ผมคิดว่าควรเริ่มจากการเปรียบเทียบแบบอิง “คำ” ก่อน แล้วค่อยตามด้วยแบบอิง “ตัวอักษร” กล่าวคือเปรียบเทียบกราฟของคัมภีร์ไบเบิลกับกราฟของ Voynich
นอกจากนี้อาจมีตัวอักษรที่ใส่มาเพื่อทำให้สับสน
ตัวอย่างเช่น สัญลักษณ์คล้ายตัวพิมพ์ใหญ่ “P” แปลก ๆ ที่มีหลายรูปแบบนั้น บางครั้งก็ปรากฏบ่อยเกินกว่าจะเป็นตัวแทนของภาษาจริง จึงอาจเป็น สัญลักษณ์พรางความหมาย ที่ควรถูกตัดออกก่อนถอดรหัส
ตัวอักษรอื่น ๆ ที่ปรากฏถี่ผิดปกติก็อาจเป็นอักขระหลอกที่ไม่ได้ใช้งานเช่นกัน
แน่นอนว่าอาการ “มี P มากเกินไป” ก็สอดคล้องกับคำอธิบายที่ว่ามันเป็นเรื่องแต่งล้วน ๆ เช่นกัน
ถ้าหนังสือลายมือแบบนั้นเป็นเพียงข้อความเพ้อเจ้อและไม่ใช่รหัสชนิดใดเลย รูปแบบ ลายมือ คำที่ใช้ หรือแม้แต่ตัวอักษรเอง ก็น่าจะ เปลี่ยนแปลง จากหน้าแรกไปถึงหน้าสุดท้าย
แน่นอนว่าหน้าอาจถูกจัดเรียงใหม่ภายหลังได้ แต่ถึงอย่างนั้นก็น่าจะสังเกตเห็นได้
เว้นแต่ผู้เขียนจะเคยเขียนหนังสือแบบนี้มาแล้วเป็นสิบเล่ม และไม่ได้หายสาบสูญไปทั้งหมด
อาจไม่ใช่ความคิดใหม่มากนัก แต่ผมสงสัยว่ามีการวิเคราะห์รูปแบบลักษณะนี้หรือไม่
ผมไม่เคยเห็นการพูดถึงความสม่ำเสมอระหว่างหน้าเลย
บางคนมองว่ามีอาลักษณ์ 2 คน (ดู Prescott Currier) ส่วน Lisa Fagin Davis มองว่ามี 5 คน
การอภิปรายการทดลองที่อิงตามมุมมองของ Fagin Davis อยู่ที่นี่: https://www.voynich.ninja/thread-3783.html