ฉันใช้คำศัพท์และสัญลักษณ์จากกระดาษของเออร์ลีย์ เป็นไปได้ว่าคำอธิบายที่คุณอ่านแตกต่างกัน
ดูเหมือนว่าบ่อยครั้งที่อัลกอริธึมการแยกวิเคราะห์ CF ทั่วไปจะถูกนำเสนอครั้งแรกในรูปแบบของตัวจดจำและจากนั้นการจัดการข้อมูลที่จำเป็นในการสร้างต้นไม้แจงและป่าการแยกวิเคราะห์จะถูกเพิ่มเข้ามาในภายหลัง เหตุผลหนึ่งอาจเป็นได้ว่าการเก็บรักษาข้อมูลที่จำเป็นในการสร้างป่าที่ใช้ร่วมกันต้องใช้พื้นที่ลูกบาศก์
ที่คือความยาวของสายป้อนที่ถูกแยก แต่ต้องการพื้นที่เป็นเพียงตารางสำหรับการรับรู้ เมื่อข้อมูลนี้ไม่ได้รับการเก็บรักษาไว้ เหตุผลในการเพิ่มความซับซ้อนของพื้นที่นี้ค่อนข้างง่าย: ขนาดการแยกวิเคราะห์สามารถเป็นลูกบาศก์ได้โอ(n3)nโอ(n2)
ความซับซ้อนของเวลากรณีที่เลวร้ายที่สุดคือตามที่รู้จักกันดีโอ(n3)
การอ้างอิงที่ดีที่สุดสำหรับอัลกอริธึมของEarley นั้นแน่นอนว่าเป็นกระดาษของ Earleyแต่มันไม่ชัดเจนมากนักเกี่ยวกับการสร้างป่าแจง นี่อาจเป็นธุรกิจที่ยุ่งเหยิงมากกว่าการพูดอย่างรวดเร็วของมาตรา 7 หน้า 101 จะปรากฏขึ้น ในความเป็นจริงเออร์ลีย์ไม่ได้พูดถึงการแยกวิเคราะห์ป่าหรือป่า แต่เป็น " การเป็นตัวแทนของต้นไม้แจงที่เป็นไปได้ทั้งหมด " และมีเหตุผลที่ดีคือถ้าเขาพยายามสร้างป่าตามหลักไวยากรณ์พื้นที่ของเขา (ดังนั้นเวลา) ความซับซ้อนที่ถูกผูกไว้จะปีนขึ้นไปที่โดยที่มีขนาดที่ยาวที่สุด กฎทางด้านขวามือ นี่คือเหตุผลที่อัลกอริทึมอื่นใช้ไวยากรณ์ในรูปแบบไบนารี (ไม่จำเป็นต้องเป็น Chomsky Normal Form (CNF))โอ(ns + 1)s
ที่จริงแล้วEarley ใช้รูปแบบไบนารีโดยปริยายเพราะเป็นสิ่งที่จำเป็นสำหรับความซับซ้อนของเวลาลูกบาศก์ นี่เป็นหนึ่งในบทบาทสำคัญของกฎจุดในรัฐ แต่รูปแบบไบนารี่โดยปริยายนี้ทำให้เกิดการแยกวิเคราะห์และป่าตามไวยากรณ์แบบไบนาไนซ์ไม่ใช่แบบดั้งเดิมซึ่งฉันกลัวว่าเป็นแหล่งที่มาของความสับสน นี่คือรายละเอียดเพิ่มเติมด้านล่าง
หนึ่งวิธีที่ดีที่จะเข้าใจว่าป่าจะได้รับน่าจะเป็นที่จะมองมันในกรณีที่ง่ายขั้นตอนวิธีการ CYK มันมักจะอธิบายว่าเป็นตัวจำแนกลายมือและด้าน parserจะถูกเพิ่มในตอนท้าย คุณสามารถดูคำอธิบายในวิกิพีเดีย ข้อมูลที่จำเป็นในการสร้างฟอเรสต์คือสิ่งที่พวกเขาเก็บไว้ในตารางของ "ตัวชี้"
Backpointers นั้นเป็นตัวชี้ไปยังสตริงย่อย (สัญลักษณ์ที่เกี่ยวข้อง) ซึ่งเป็นส่วนประกอบของสตริงตามกฎบางอย่าง พวกเขาให้วิธีที่เป็นไปได้ทั้งหมดของการแยกสตริงย่อย จำได้ว่า CYK ใช้รูปแบบไบนารีโดยปกติจะเป็น CNF เพื่อให้สิ่งต่าง ๆ ง่ายขึ้น โปรแกรมแยกวิเคราะห์ CYK มีโครงสร้างการเขียนโปรแกรมแบบไดนามิกเหมือนกับ Earley โดยพื้นฐาน แต่ง่ายกว่ามาก ดังนั้นการเข้าใจว่ามันจะช่วยได้มาก
กลับไปที่อัลกอริทึมของ Earley ฉันไม่เชื่อว่าคุณต้องการเวกเตอร์ Earley เพื่อตัดสินใจยอมรับหรือสร้างต้นไม้และป่าไม้แยกวิเคราะห์ สิ่งที่ Earley เรียกเวกเตอร์ในกระดาษของเขาปรากฏเฉพาะในหน้า 97 ในย่อหน้าที่สามของการใช้งาน มันเป็นเพียงอุปกรณ์ที่จะเร่งความเร็วในการค้นหาสถานะชี้ไปที่ตำแหน่งสตริงที่กำหนดเพื่อที่จะได้รับความซับซ้อนที่ดีขึ้น แต่ข้อมูลทั้งหมดที่อยู่ในชุดรัฐดำเนินการตามรายการของรัฐ อย่างไรก็ตามข้อมูลนี้ไม่เพียงพอที่จะสร้างป่าของต้นไม้ในการแยกวิเคราะห์เนื่องจากอัลกอริทึมไม่ได้ติดตามสถานะที่อาจได้รับ แน่นอนเวกเตอร์นั้นยังใช้ในการละทิ้งสถานะที่ค้นพบแล้วอย่างมีประสิทธิภาพโดยไม่ขึ้นอยู่กับวิธีที่พบ
ในส่วนที่ 7 ของบทความของ Earley เขาอธิบายว่าเพื่อ "ทำให้ตัวจำแนกลายมือเป็น parser" เพื่อให้สามารถกู้คืนต้นไม้แยกได้จำเป็นต้องติดตามวิธีการทำสำเร็จ
ทุกครั้งที่เราทำการคอมไพล์เตอร์เพิ่มสถานะ
(ไม่สนใจ lookahead) เราสร้างตัวชี้จากอินสแตนซ์ของในสถานะนั้นไปยังสถานะซึ่งทำให้เราต้องทำการผ่าตัด สิ่งนี้บ่งบอกว่าE→การอัลฟ่าD βก.DD→γ.fD ถูกแยกวิเคราะห์เป็น γ. ในกรณีที่ D คลุมเครือจะมีชุดของพอยน์เตอร์จากนั้นหนึ่งชุดสำหรับการดำเนินการคอมไพเลอร์แต่ละอันที่ทำให้เกิดE→αD.βgที่จะเพิ่มลงในชุดสถานะเฉพาะ แต่ละสัญลักษณ์ใน
γ จะมีพอยน์เตอร์จากมัน (ยกเว้นว่ามันจะเป็นเทอร์มินัล) และอื่น ๆ ดังนั้นจึงเป็นตัวแทนของต้นไม้ที่ได้รับมา D.
โปรดทราบว่าในข้อความนี้ f และ g เป็นดัชนีในสตริงที่แจงโดยชี้ตำแหน่งที่การรับรู้ของกฎด้านซ้ายเริ่มต้น (เมื่อสัญลักษณ์ทางด้านขวาถูกทำนายไว้แล้วดังนั้น f เป็นดัชนีสตริงที่การรับรู้ D→γ เริ่มแล้วและมันก็จบที่ดัชนี g. "พอยน์เตอร์ตัวเต็ม" เหล่านี้เทียบเท่ากับ Earley ของแบ็คพอยน์ที่อธิบายไว้ (ไม่ดีในวิกิพีเดีย) สำหรับรุ่น parser ของ CYK
จากตัวชี้ดังกล่าว (ดังอธิบายในใบเสนอราคา) เรารู้ว่า D
ในอินสแตนซ์ของกฎ E→αD.βg สามารถพัฒนาตัวเองเป็นต้นไม้ (หรือป่า) ที่แยกวิเคราะห์สตริงการป้อนข้อมูล w จากดัชนี f+1 เพื่อจัดทำดัชนี gซึ่งเราทราบ wf+1:g. โหนดด้านล่างทันทีD จะได้รับตามกฎ D→γ. โดยมองหาความสมบูรณ์ที่นำไปสู่D→γ.f จากนั้นเราสามารถหาตัวชี้อื่น ๆ ที่บอกถึงสัญลักษณ์สุดท้ายของ Dได้รับและข้อมูลเพิ่มเติมเกี่ยวกับต้นแจงที่เป็นไปได้ นอกจากนี้โดยการดูความสมบูรณ์ที่รับรู้ถึงสัญลักษณ์ก่อนที่จะอยู่ในสภาพชุด earleir คุณจะพบว่ามันได้มาอย่างไรและอื่น ๆ
สมมติว่าคุณเก็บพอยน์เตอร์ที่จำเป็นทั้งหมดตามที่ระบุไว้ในกระดาษคุณสามารถรับการแสดงทรีที่ใช้ร่วมกันทั้งหมดที่เริ่มต้นจากสัญลักษณ์สุดท้ายที่ parser รู้จักซึ่งแน่นอนว่าเป็นสัญลักษณ์เริ่มต้นของไวยากรณ์
แต่ฉันก็ข้ามส่วนที่ยุ่งเหยิงไปด้วย สมมติว่าคุณมีกฎ
U→XYZซึ่งฉันเลือกด้วยมือขวาที่ยาวเกินกว่า 2 สัญลักษณ์และกฎอื่น W→UVสำหรับไวยากรณ์ที่ไม่ชัดเจน
มันอาจเกิดขึ้นได้ดีที่ parser จะแยกวิเคราะห์ wf+1:g เข้าไป X,
wg+1:h เข้าไป Y และทั้งคู่ wh+1:i และ wh+1:j เข้าไป
Z. ดังนั้นด้วยกฎU→XYZ, ทั้งคู่ wf+1:i และ
wf+1:j แยกเป็น U.
จากนั้นอาจเป็นได้ว่าทั้งสองอย่าง wi+1:k และ wj+1:k ทั้งแยกวิเคราะห์ V. จากนั้นด้วยกฎW→UVสตริง
wf+1:k แยกเป็น W ในสองวิธีที่แตกต่างซึ่งสอดคล้องกับความกำกวมของไวยากรณ์
แน่นอนว่าเพื่อหลีกเลี่ยงการคำนวณซ้ำอัลกอริธึมของ Earley จะพยายามแบ่งปันให้มากที่สุดเท่าที่จะทำได้ในการคำนวณแบบแยกวิเคราะห์สองครั้ง สิ่งที่มันจะแบ่งปันจริง ๆ แล้วก็คือการจดจำ (และการแยกวิเคราะห์) ของwf+1:g และ wg+1:h เข้าไป X และ Y. แต่มันจะทำอะไรได้มากกว่าเดิม: มันจะแบ่งปันจุดเริ่มต้นของการแยกวิเคราะห์สองแบบที่รับรู้U ด้วยกฎ U→XYZ. สิ่งที่ฉันหมายถึงคือรัฐU→XY.Zf จะพบเพียงครั้งเดียว (ในส่วนที่เกี่ยวกับสิ่งที่ฉันอธิบาย) ในสถานะที่กำหนด Sh. มันจะเป็นส่วนทั่วไปของทั้งสองแยกวิเคราะห์ แน่นอนสิ่งต่าง ๆ จะแตกต่างชั่วคราวในขณะที่แยกวิเคราะห์Z ตั้งแต่พวกเขาสอดคล้องกับสารตั้งต้นที่แยกจากกันจนกว่าพวกเขาจะมาบรรจบกันอีกครั้งเมื่อทุกอย่างแยกวิเคราะห์เป็น W เมื่อรัฐ W→UV.f ผลิตสองครั้งในชุดรัฐ Sk.
ดังนั้นป่าของต้นไม้ไวยากรณ์อาจเป็นสิ่งที่แปลกมากด้วยทรีย่อยของสยามคู่ที่อาจแบ่งสองขอบแรกของบางโหนด แต่ไม่ใช่ขอบที่สาม มันอาจเป็นโครงสร้างที่น่าอึดอัดใจมาก นี่อาจอธิบายได้ว่าทำไม Earley เรียกมันว่า " การเป็นตัวแทนของต้นแจงที่เป็นไปได้ทั้งหมด " โดยไม่เจาะจงมากขึ้น
ความสามารถในการผ่าตัดแยกแฝดสยามโดยไม่ต้องเปลี่ยนไวยากรณ์จะส่งผลให้ความซับซ้อนเพิ่มขึ้น วิธีที่ถูกต้องในการทำมันคือการเรียนรู้ไวยากรณ์
ฉันหวังว่านี่จะช่วยคุณได้ แจ้งให้เราทราบ แต่ฉันยืนยันว่าความเข้าใจที่ดีเกี่ยวกับการแยกวิเคราะห์ CYK สามารถช่วยได้ มีอัลกอริธึมอื่น ๆ ที่ง่ายกว่า Earley ที่สามารถแยกภาษา CF ทั้งหมดได้อย่างมีประสิทธิภาพ
คุณอาจพบข้อมูลทั่วไปเกี่ยวกับปัญหาป่านี้แยกเป็นสองคำตอบอื่น ๆ ฉันให้: /cstheory/7374#18006และhttps://linguistics.stackexchange.com/questions/4619#6120 แต่พวกเขาไม่ได้ลงรายละเอียดเฉพาะของอัลกอริทึมของ Earley