एक अर्ली पार्सर से एक पार्स वन पुनर्प्राप्त करना?


25

मैं हाल ही में अर्ली पार्सर पर पढ़ रहा था और मुझे लगता है कि यह सबसे सुरुचिपूर्ण एल्गोरिदम में से एक है जिसे मैंने आज तक देखा है। हालांकि, अपने पारंपरिक अर्थों में एल्गोरिथ्म एक पहचानकर्ता है और एक पार्सर नहीं है , जिसका अर्थ है कि यह पता लगा सकता है कि क्या एक स्ट्रिंग एक विशेष सीएफजी से मेल खाती है लेकिन इसके लिए एक पार्स ट्री का उत्पादन नहीं करता है। मेरा प्रश्न यह है कि किसी पार्स ट्री को कैसे नहीं पुनर्प्राप्त किया जाए , बल्कि दिए गए इनपुट स्ट्रिंग के सभी संभावित पार्स के पार्स वन

ग्यून और जैकब की "पार्सिंग तकनीक: एक प्रैक्टिकल गाइड" में वे एक एल्गोरिथ्म का वर्णन करते हैं, जिसका उपयोग ईयरली पहचानकर्ता के परिणाम से पार्स वन को पुनर्प्राप्त करने के लिए किया जा सकता है, लेकिन यह Unger की पार्सिंग विधि पर आधारित है, जिसका रनटाइम O (n k + है) 1 ), जहां कश्मीर व्याकरण में सबसे लंबे उत्पादन की लंबाई है। इसका मतलब यह है कि व्याकरण के आकार में रनटाइम एक बहुपद नहीं है। इसके अलावा, एल्गोरिथ्म में ईयरली का मूल पेपर, जो पार्स वन को पुनर्प्राप्त करने के लिए एक एल्गोरिदम का सुझाव देता है, गलत है (उदाहरण के लिए, टॉमिता द्वारा इस लेख के पृष्ठ 762 ), हालांकि कई स्रोत अभी भी इसे पार्स वन को पुनर्प्राप्त करने के लिए उपयुक्त तरीके के रूप में उद्धृत करते हैं। ।

मेरा सवाल है कि क्या यह संभव है, बहुपद समय में, किसी दिए गए इनपुट स्ट्रिंग के लिए पार्स वन को पुनर्प्राप्त करना। मुझे यहां एक पेपर मिला है जो पीडीए के सिमुलेशन का उपयोग करते हुए किसी भी पार्स के लिए क्यूबिक-आकार के पार्स वन अभ्यावेदन के उत्पादन के लिए एक एल्गोरिदम प्रदान करता है, इसलिए ऐसा लगता है कि यह संभव होना चाहिए, लेकिन मुझे अभी तक ऐसा करने का कोई तरीका नहीं मिला है। आदर्श रूप से, मैं इनपुट ग्रामर को CNF (जो वास्तव में समस्या का समाधान करेगा) में परिवर्तित किए बिना ऐसा करना चाहूंगा, क्योंकि परिणामस्वरूप पार्स वन बहुत गन्दा होगा।

आप जो भी सहायताकर सकें, उसके लिए धन्यवाद!


क्या इयरली पार्सिंग के आधार पर एक एल्गोरिथ्म होना चाहिए, या आप एक अलग सामान्य सीएफजी पार्सर का उपयोग करने से मन नहीं करेंगे?
एलेक्स टेन ब्रिंक

1
मैं अर्ली पार्सर के आधार पर एक एल्गोरिथ्म पसंद करूंगा। मैं एक कंपाइलर कोर्स पढ़ा रहा हूं और कुछ दिन बिताकर इस सवाल के जवाब को ट्रैक करने की कोशिश कर रहा हूं, और यह वास्तव में मुझे परेशान कर रहा है।
templatetypedef

घातीय रनटाइम्स आश्चर्यजनक नहीं हैं क्योंकि शब्दों में घातीय रूप से कई पार्स पेड़ हो सकते हैं। वास्तव में, वे असीम रूप से कई हो सकते हैं यदि आप मनमाने ढंग से CFG की अनुमति देते हैं।
राफेल

3
@ राफेल पार्स वनों की भूमिका एक साझा तंत्र के लिए ठीक है जो सभी पेड़ों का प्रतिनिधित्व करने की अनुमति देगा, यहां तक ​​कि असीम रूप से कई, एक परिमित संरचना के साथ, छोटे स्थान की जटिलता के साथ। बेशक, यह लम्बरजैक के लिए कुछ काम छोड़ सकता है।
Babou

आप मारपा को देखना चाह सकते हैं । यह एक पर्ल मॉड्यूल और सी लाइब्रेरी है जो एक अर्ली पार्सर को लागू करता है और इसमें पूर्ण पार्स वन समर्थन है।
हिप्पिट्रैसिल

जवाबों:


14

ऐसा करना निश्चित रूप से एक "पैक वन" के लिए सही प्रतिनिधित्व पर निर्भर करेगा जो किसी दिए गए वाक्य के लिए सभी पार्स पेड़ों का प्रतिनिधित्व करता है।

मुझे लगता है कि जिस स्थान को आप देखना शुरू करना चाहते हैं वह जोशुआ गुडमैन की थीसिस (हार्वर्ड, 1999 के अंदर पार्सिंग) है। मूल रूप से, विचार यह है कि आप एक निश्चित संगोष्ठी के तहत पार्सिंग एल्गोरिथ्म को परिभाषित कर सकते हैं। सेमिनार के आधार पर, आप नंगे पार्स ट्री (एक पहचानकर्ता या एक पार्सर के रूप में) के बजाय सभी प्रकार की मात्राओं और संरचनाओं की गणना करने में सक्षम होंगे। एक संगोष्ठी जिसे आप परिभाषित कर सकते हैं (जो कि गुडमैन अपनी थीसिस में करता है) एक संगोष्ठी है जहाँ मूल्य परियों के सेट हैं। जब आप अंततः एक वाक्य को समाप्त कर देते हैं, तो आपको मुख्य पार्स नोड में सभी पार्स पेड़ मिलेंगे।

फिर, आपको सही प्रतिनिधित्व के माध्यम से इसे संभव बनाने के बारे में सावधान रहना होगा।


संदर्भ के लिए धन्यवाद! यह एक महान संसाधन की तरह लग रहा है और मैं इसे देखने के लिए कुछ समय बिताने जा रहा हूं।
templatetypedef

8

एक पेपर है जो बताता है कि यह कैसे करना है:

एसपीएफ-शैली एलिसबेथ स्कॉट द्वारा अर्ली रिकॉगनाइजर्स से पार्सिंग

यह वर्णन करता है कि क्यूबिक समय में एक बिनाराइज्ड पार्स वन कैसे बनाया जाए।


2
ऐसा लगता है कि लिंक अब टूट गया है। क्या आपके पास एक संदर्भ (पेपर शीर्षक, जहां प्रकाशित किया गया है, लेखकों की सूची) और / या एक अद्यतन लिंक है?
DW

1
देखें web.archive.org/web/20130508170633/http://thor.info.uaic.ro/... "SPPF-शैली पार्सिंग Earley Recognisers से", एलिजाबेथ स्कॉट:। एक और लिंक: dinhe.net/~aredridel/.notmine/PDFs/…
a3nm

यह इस सवाल का सही उत्तर है कि "अर्ली पहचानकर्ता से पार्स वन कैसे प्राप्त करें"।
tjvr

जेएस में इसका एक अच्छा कार्यान्वयन यहां है: joshuagrams.github.io/pep
tjvr

इस संदर्भ में बिनारीकृत का क्या अर्थ है?
ब्रूस एडम्स

6

आपको कभी भी CNF की आवश्यकता नहीं है। इसमें व्याकरण संरचना को बदलने का दोष है। लेकिन आपको मध्यवर्ती गैर-टर्मिनलों को पेश करने की आवश्यकता है ताकि आरएचएस की लंबाई जटिलता को निर्धारित करने के बाद से कोई भी दाहिने हाथ की तरफ 2 (2-फॉर्म) से लंबा न हो। यह बताने का सबसे अच्छा प्रयास है कि सहज ज्ञान युक्त है, यदि मेमोरी सेवा करता है, तो ब्यू शील का एक पेपर, "ऑब्जर्वेशन ऑन कॉन्टेक्स्ट फ्री पार्सिंग", 1976 में एक कम्प्यूटेशनल भाषाविज्ञान सम्मेलन में प्रकाशित हुआ। ईयरली के एल्गोरिथ्म में अंतर्निहित रूप से 2-फॉर्म का उपयोग किया गया है। यह सिर्फ एल्गोरिथ्म में छिपा हुआ है। पार्स वन की वसूली और हैंडलिंग के बारे में, आपको "पार्सिंग चौराहा जंगल" पर वेब देखना चाहिए। यह वास्तव में बहुत सीधा है। कई पेपर वेब पर होते हैं, यदि आपको सीधे शीर्षक या लेखक से उन्हें खोजने के लिए (उद्धरण या तालिकाओं से) मिलता है।

वास्तव में, आप सीएफ से बहुत अधिक कर सकते हैं, और अभी भी बहुपद समय में पार्स-वन प्राप्त कर सकते हैं। सवाल यह है कि कभी-कभी: आपके पास एक बार होने के बाद आप इसके साथ क्या कर सकते हैं?

आपके द्वारा बताए गए अंतिम लेख का एक उद्देश्य यह दिखाना है कि जटिल एल्गोरिदम (जैसे जीएलआर) आवश्यक रूप से समय या अंतरिक्ष में कुछ भी नहीं खरीद रहे हैं, और आपके पार्स वन को बदल सकते हैं।

शिक्षण के बारे में एक टिप्पणी। मुझे लगता है कि अर्ली, सेमिनल जैसा कि यह शिक्षण के लिए बहुत जटिल है, और अनिवार्य रूप से समान शैक्षिक सामग्री के साथ सरल एल्गोरिदम द्वारा प्रतिस्थापित किया जा सकता है। शिक्षण अवधारणाओं या प्रौद्योगिकी के बारे में है। अर्ली के एल्गोरिथ्म में, आवश्यक अवधारणाएं विवरणों की जटिलता में छिपी हुई हैं, और प्रौद्योगिकी के दृष्टिकोण से यह पुराना है। यह एक महान पेपर था, लेकिन इसका मतलब यह नहीं है कि यह सबसे अच्छा शैक्षणिक दृष्टिकोण है।

सामान्य कंप्यूटर विज्ञान चैनलों की तुलना में कम्प्यूटेशनल भाषाविज्ञान साहित्य में अधिक जानकारी हो सकती है। मेरे पास सेरिएल-ग्यून-जैकब्स पुस्तक नहीं है, लेकिन मुझे आश्चर्य होगा कि अगर उनके पास सभी उचित संदर्भ नहीं थे (हालांकि मुझे उनके चयन मानदंडों के बारे में निश्चित नहीं है)।


एक टिप्पणी में एक अनुरोध के बाद पूरक (जुलाई 7, 2013)

यह ईयरली की तुलना में सरल एल्गोरिदम के अस्तित्व को पूरक करता है।

जैसा कि मैंने कहा, "पार्सिंग चौराहे के जंगल" पर वेब पर खोज करने से आपको तुरंत संदर्भ देना चाहिए, जिससे आप आगे खुदाई कर सकते हैं।

मूल विचार यह है कि एक साझा वन के निर्माण के साथ पार्स करने वाले सभी मार्ग कुछ भी नहीं है लेकिन एक नियमित रूप से भाषा और एक संदर्भ-मुक्त भाषा के लिए बार हिइल, पर्ल्स और शमीर के पुराने चौराहे का निर्माण एक परिमित ऑटोमेटन और एक संदर्भ-मुक्त व्याकरण का उपयोग करते हुए किया जाता है। सीएफ व्याकरण को देखते हुए, आप निर्माण को एक तुच्छ ऑटोमेटन पर लागू करते हैं जो केवल आपके इनपुट स्ट्रिंग को पहचानता है। बस इतना ही। साझा वन चौराहे के लिए सिर्फ व्याकरण है। यह एक समरूपता के माध्यम से मूल व्याकरण से संबंधित है, केवल दिए गए स्ट्रिंग को पहचानता है, लेकिन मूल व्याकरण के सभी पार्स-वृक्षों के साथ उस होमोमोर्फिज्म (यानी, गैर-टर्मिनलों का सरल नामकरण)।

परिणामी व्याकरण में बहुत सारे बेकार सामान, गैर-टर्मिनलों और नियम शामिल हैं, जो या तो स्वयंसिद्ध से अनुपलब्ध हैं (प्रारंभिक प्रतीक से प्राप्त स्ट्रिंग में नहीं पाया जा सकता) या जो गैर-उत्पादक हैं (एक टर्मिनल में प्राप्त नहीं किया जा सकता है) स्ट्रिंग)।

फिर, या तो आपको इसे अंत में एक अच्छे ब्रश के साथ साफ करना होगा (संभवतः लंबे समय तक लेकिन एल्गोरिदमिक रूप से सरल), या आप निर्माण को बेहतर बनाने की कोशिश कर सकते हैं ताकि अंत में ब्रश करने के लिए बेकार बेकार कम हो।

उदाहरण के लिए, CYK निर्माण बिल्कुल वही है, लेकिन संगठित है ताकि बनाए गए सभी नियम और गैर-टर्मिनल उत्पादक हैं, हालांकि कई अनुपयोगी हो सकते हैं। यह एक बॉटम-अप तकनीक से उम्मीद की जानी है।

टॉप-डाउन तकनीक (जैसे एलआर (के) आधारित)) अगम्य नियमों और गैर-टर्मिनलों से बचेंगे, लेकिन अनुत्पादक बनाएंगे।

ब्रश करने का एक बहुत वास्तव में संकेत के पर्याप्त उपयोग से प्राप्त किया जा सकता है, मुझे लगता है, लेकिन मैंने लंबे समय तक इस पर ध्यान नहीं दिया है।

सभी मौजूदा एल्गोरिदम वास्तव में अनिवार्य रूप से उस मॉडल का पालन करते हैं। तो यह वास्तव में इस मामले का दिल है, और यह बहुत सरल है। फिर इसे जटिलता में क्यों दफनाया?

कई "ऑप्टिमाइज़ेशन" का प्रस्ताव प्रायः एलआर (के), एलएल (के) परसर निर्माण के परिवार के आधार पर किया जाता है, संभवतः इन निर्माणों के कुछ स्थैतिक फैक्टरिंग के साथ (अर्ली में कोई स्थैतिक फैक्टरिंग नहीं है)। यह वास्तव में सभी ज्ञात तकनीकों पर लागू किया जा सकता है, जिसमें पुराने पूर्ववर्ती पार्सर्स भी शामिल हैं। मैंने उद्धरणों के बीच "अनुकूलन" रखा क्योंकि यह आमतौर पर स्पष्ट नहीं है कि आप क्या अनुकूलन कर रहे हैं, या यहां तक ​​कि आप वास्तव में इसे अनुकूलित कर रहे हैं या नहीं, या सुधार का लाभ आपके पार्सर की अतिरिक्त जटिलता के लायक है या नहीं। आपको इस पर थोड़ा उद्देश्य डेटा, औपचारिक या प्रयोगात्मक मिलेगा (कुछ है), लेकिन कई और दावे। मैं यह नहीं कह रहा हूं कि ब्याज की कोई बात नहीं है। कुछ स्मार्ट विचार हैं।

अब, एक बार जब आप मूल विचार जान लेते हैं, तो "अनुकूलन" या सुधार को अक्सर व्याकरण से पुश-डाउन ऑटोमेटन बनाकर, जिस तरह के पार्सर निर्माण तकनीक में आप रुचि रखते हैं, का अनुसरण करके और फिर आवेदन करके अक्सर सांख्यिकीय (संभवतः वृद्धि) पेश किया जा सकता है। क्रॉस-प्रोडक्ट का निर्माण उस ऑटोमेटन के प्रतिच्छेदन के लिए होता है (लगभग इसे व्याकरण के समान करने के लिए) या उस ऑटोमेटन से प्राप्त व्याकरण के लिए।

फिर आप घंटियाँ और सीटी बजा सकते हैं, लेकिन यह ज्यादातर तकनीकी विवरण है।

आइज़ैक न्यूटन के फिलोसोफी नेचुरलिस प्रिंसिपिया मैथेमेटिका कथित तौर पर भौतिकी और गणित का एक बड़ा टुकड़ा है। मुझे नहीं लगता कि यह कई छात्रों की पढ़ने की सूची में है। अन्य सभी चीजें समान हो रही हैं, मुझे नहीं लगता कि यह अर्ली के एल्गोरिथ्म को सिखाने के लिए बहुत उपयोगी है, हालांकि यह एक महत्वपूर्ण ऐतिहासिक टुकड़ा है। छात्रों के पास सीखने के लिए पर्याप्त है। कई लोगों द्वारा गोली मारे जाने के जोखिम पर, मैं नूथ एलआर (के) पेपर के लिए बहुत कुछ सोचता हूं। यह सैद्धांतिक विश्लेषण का एक शानदार टुकड़ा है, और शायद एक सैद्धांतिक के लिए एक महत्वपूर्ण पढ़ना है। मुझे इस बात पर संदेह है कि यह हार्डवेयर और सॉफ्टवेयर दोनों की वर्तमान स्थिति को देखते हुए पार्सर्स के निर्माण के लिए आवश्यक है। समय बीता है जब पार्सिंग संकलन समय का एक महत्वपूर्ण हिस्सा था, या जब संकलक की गति एक महत्वपूर्ण मुद्दा था (मुझे पता था कि एक निगम जो कुछ 30 साल पहले संकलन लागत से मर गया था)। पार्सिंग विशेषज्ञ कुछ बिंदु पर उस विशेष ज्ञान को सीखना चाह सकते हैं, लेकिन कंप्यूटर विज्ञान, प्रोग्रामिंग या इंजीनियरिंग में औसत छात्र को इसकी आवश्यकता नहीं है।

यदि छात्रों को पार्सिंग पर अधिक समय बिताना चाहिए, तो ऐसे अन्य एक्सटेंशन हैं जो अधिक उपयोगी और अधिक प्रारंभिक हो सकते हैं, जैसे कि कम्प्यूटेशनल भाषा विज्ञान में उपयोग किए जाने वाले। शिक्षण की पहली भूमिका वैज्ञानिक ज्ञान की संरचना करने वाले सरल विचारों को निकालने के लिए है, न कि छात्रों को यह जानने के लिए मजबूर करने के लिए कि अनुसंधान वैज्ञानिकों को क्या नुकसान उठाना पड़ा (डॉक्टरेट छात्रों को छोड़कर: यह बीतने का संस्कार है :-)।

लेखक से लाइसेंस CC BY-SA 3.0


2
"अर्ली ... शिक्षण के लिए बहुत जटिल है, और सरल एल्गोरिदम द्वारा प्रतिस्थापित किया जा सकता है ..."। क्या आप इस तरह के एक सरल एल्गोरिथ्म का एक उदाहरण प्रदान कर सकते हैं?
22

@wjl मैं आपको उत्तर के लिए एक परिशिष्ट में उत्तर देता हूं। मैं एक विशिष्ट एल्गोरिथ्म की ओर संकेत नहीं करता हूं, हालांकि अगर आप मेरी सलाह के अनुसार कुछ खोज करते हैं, तो आप कुछ हद तक पा सकते हैं। मैंने इसके बजाय यह समझाने की कोशिश की कि सरल, अभी तक कुशल एल्गोरिदम बनाना बहुत आसान है। अर्ली की शायद उन सभी में सबसे जटिल है। बार हिलेल एट अल की व्याख्या करते हुए। निर्माण पाठ्यपुस्तक का लगभग आधा पृष्ठ है, प्रमाण के साथ एक पृष्ठ कहें।
Babou

@wjl आपके अनुरोध का उत्तर देने में मुझे कुछ समय लगा। क्या इसने आपकी मदद की? । । । । । यदि आप एक वास्तविक एल्गोरिथ्म चाहते थे, तो प्रारंभिक प्रश्न के अंतिम लिंक में एक है।
Babou

हाँ धन्यवाद; मैं अतिरिक्त विस्तार की सराहना करता हूं। मैं एक सामान्यीकृत पार्सर लाइब्रेरी पर कुछ काम कर रहा हूं जो मैं कर रहा हूं और विभिन्न एल्गोरिदम में एक टन अनुसंधान कर रहा हूं। मैं वर्तमान में एक प्रारंभिक-शैली के कार्यान्वयन की ओर झुक रहा हूं, मेरे लिए, एल्गोरिथ्म को समझना बहुत आसान लग रहा था, और कंजंक्टिव व्याकरण और "ब्लैक बॉक्स" (संभवतः संदर्भ संवेदनशील) टर्मिनलों तक विस्तार करना आसान है। मैंने कुछ कागजात जो आपने इंगित किए थे, मैंने स्किम्ड और प्रिंट आउट किया; लेकिन मैंने उन्हें अभी तक बयाना में नहीं पढ़ा है।
wjl

@wjl यदि आप ऐसा कर रहे हैं, तो आपको निम्नलिखित विषयों पर ध्यान देना चाहिए: हल्के संदर्भ संवेदनशील भाषाएं, रैखिक संदर्भ-मुक्त पुनर्लेखन प्रणाली (LCFRS), और सीमा व्याकरण। सुनिश्चित नहीं है कि मैं समझता हूं कि "ब्लैक बॉक्स" टर्मिनल क्या है। - - ईमेल: babou atbox.com - -
Babou

5

पेपर जो बताता है कि क्यूबिक समय में एक बिनाराइज्ड पार्स वन का निर्माण कैसे किया जाता है (एंजेलो बोरसोटी द्वारा पोस्ट में उल्लेख किया गया है) है: एलिजाबेथ स्कॉट द्वारा "एसपीएफएफ-स्टाइल पार्सिंग फ्रॉम एर्ली रिकॉगनाइजर्स"। आप इसे यहाँ देख सकते हैं: http://dx.doi.org/10.1016/j.entcs.2008.03.044

इस पत्र में एक साझा पैक्ड जंगल (एसपीपीएफ) का निर्माण वर्णित है जो सभी संभावित पार्स पेड़ों का प्रतिनिधित्व करता है। जब भी संभव हो उप पेड़ों को साझा किया जाता है, और एक ही nonterminal से एक ही प्रतिस्थापन के विभिन्न व्युत्पन्न के अनुरूप नोड्स संयुक्त होते हैं।


सूचक के लिए धन्यवाद। घन समय में बिनाराइज्ड पार्स-वन का निर्माण मानक है। क्यूबिक टाइम पाने के लिए बिनराइजेशन ही एकमात्र तरीका है, जिससे ओपी की जटिलता के व्याकरण के आकार पर टिप्पणी अप्रासंगिक है। एक और मुद्दा यह समझने का है कि किस तरह से पार्स-वन का बाइनाराइज़ किया गया है। यह एल्गोरिथ्म पर निर्भर हो सकता है। अन्य मुद्दे साझा-फ़ॉरेस्ट में साझा करने की मात्रा, और पार्सिंग रणनीति की व्यावहारिक दक्षता (अर्ली एक बुरा विचार हो सकता है)। यह सब ओपी के अंतिम संदर्भ में विकसित किया गया है। इस मुद्दे पर एक सामान्य औपचारिक विचार मेरे उत्तर में दिया गया है।
बबौ

1

मैं ऊपर दिए गए उत्तरों की प्रतिध्वनि करना चाहता हूं ताकि आप इस पत्र को पढ़ सकें।

http://dx.doi.org/10.1016/j.entcs.2008.03.044

मैं हालांकि यह कहकर अर्हता प्राप्त करना चाहूंगा कि मैंने इस पेपर में एल्गोरिथम लागू किया है और मुझे विश्वास है कि कोई त्रुटि है। विशेष रूप से, खंड के दूसरे पैराग्राफ का पहला वाक्य 4. पूर्ववर्ती लेबल जो आप ईयरली "स्कैनिंग" चरण को शांत करने के लिए बनाते हैं, उसे पी से क्यू तक इंगित करना चाहिए और अन्य तरीके से नहीं।

विशेष रूप से, निम्नलिखित पंक्ति:

आइटम होने के लिए E0 सेट करें (S :: = · α, 0)। I> 0 के लिए प्रत्येक q = के लिए आइटम p = (A :: = αai · β, j) जोड़कर Ei प्रारंभ करें (A :: = α · aiβ, j) i Ei and 1 और, यदि α =, पूर्ववर्ती सूचक लेबल i - 1 से q तक p

"पी से क्यू तक पढ़ना चाहिए" और "क्यू से पी तक" नहीं

मैंने एल्गोरिथ्म को लागू किया है क्योंकि यह मूल रूप से कहा गया है, जिसने मुझे कुछ हाथ से निर्मित परीक्षण मामलों पर त्रुटियां दीं, जो एक बार मैंने यहां सूचक की दिशा बदल दीं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.