paint-brush
पायथन में राज्य पैटर्न का उपयोग करके एक अनंत लंबा निबंध लिखनाद्वारा@aayn
2,430 रीडिंग
2,430 रीडिंग

पायथन में राज्य पैटर्न का उपयोग करके एक अनंत लंबा निबंध लिखना

द्वारा Aayush Naik10m2023/12/27
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

राज्य डिज़ाइन पैटर्न ऑब्जेक्ट-ओरिएंटेड कोड में राज्य मशीनें हैं। हम निबंध/वाक्य जनरेटर बनाने के लिए पैटर्न का उपयोग करते हैं।
featured image - पायथन में राज्य पैटर्न का उपयोग करके एक अनंत लंबा निबंध लिखना
Aayush Naik HackerNoon profile picture
0-item

आइए एक अनंत लंबा निबंध लिखें! लेकिन यह एक असंभव कार्य है. हालाँकि, हम एक ऐसी प्रक्रिया बना सकते हैं, जिसे अगर हमेशा के लिए चलाया जाए, तो एक असीमित लंबा निबंध तैयार हो जाएगा। पर्याप्त नजदीक


अब, आप स्पष्ट रूप से पायथन कोड की एक पंक्ति के साथ एक लंबा और दोहराव वाला निबंध तैयार कर सकते हैं:


 >>> "This is water. " * 20 'This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. This is water. '


जम्हाई ... उबासी! इसके बजाय, हम इस लेख में राज्य डिज़ाइन पैटर्न का उपयोग करके एक अधिक दिलचस्प निबंध तैयार करेंगे।


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


सॉफ़्टवेयर डिज़ाइन पैटर्न आम तौर पर होने वाली समस्याओं को हल करने के प्रभावी तरीके हैं। जब उचित रूप से लागू किया जाता है, तो राज्य पैटर्न जैसे सॉफ़्टवेयर डिज़ाइन पैटर्न आपको बेहतर स्केलेबल, रखरखाव योग्य और परीक्षण योग्य सॉफ़्टवेयर लिखने में मदद कर सकते हैं।

राज्य मशीन

संक्षेप में, राज्य डिज़ाइन पैटर्न एक राज्य मशीन को ऑब्जेक्ट-ओरिएंटेड कोड में अनुवादित करता है।


यदि आप राज्य मशीनों से परिचित नहीं हैं, तो यह एक बहुत ही सरल अवधारणा है। एक राज्य मशीन में अवस्थाएँ और परिवर्तन होते हैं। राज्य हमारे हित की प्रणाली के कुछ गुण हैं, और राज्य परिवर्तन ऐसी क्रियाएं हैं जो इन गुणों को बदलती हैं और इस प्रकार राज्य परिवर्तन का कारण भी बनती हैं।


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


रोबोट वैक्यूम क्लीनर को चलाने के लिए राज्य मशीन।


राज्य मशीन आरेख एक सहज चित्र पेश करता है कि रोबोट कैसे संचालित होता है, भले ही आपने कभी राज्य मशीनों का सामना नहीं किया हो। आइए इस ऑपरेशन को चरण दर चरण देखें।


  1. रोबोट डॉक की गई स्थिति में प्रारंभ होता है (काला बिंदु प्रारंभिक स्थिति को इंगित करता है)।
  2. यदि रोबोट को पता चलता है कि उसकी बैटरी कम हो गई है, तो वह स्वयं को चार्ज करना शुरू कर देता है ( चार्जिंग स्थिति) जब तक कि उसकी बैटरी पूरी न भर जाए। एक बार बैटरी भर जाने पर, यह डॉक स्थिति में वापस आ जाती है।
  3. डॉक्ड अवस्था में, यदि रोबोट को पता चलता है कि फर्श गंदा है (और उसकी बैटरी कम नहीं है), तो वह फर्श को साफ करना शुरू कर देता है ( सफाई की स्थिति)।
  4. सफाई की स्थिति में, यदि रोबोट की बैटरी कम हो जाती है, तो वह स्वयं चार्ज हो जाता है। और यदि फर्श साफ है, तो रोबोट अपनी गोदी ( डॉक्ड अवस्था) में लौट आता है।


इस प्रकार, हमारे रोबोट वैक्यूम क्लीनर की तीन स्थितियाँ हैं - डॉक्ड , क्लीनिंग और चार्जिंग - और इसमें फर्श और उसकी बैटरी की संवेदी पहचान के आधार पर बदलाव होते हैं।


अनंत निबंध के लिए सरल राज्य मशीन

अब जब हम बुनियादी स्तर पर राज्य मशीनों को समझते हैं तो आइए एक अनंत निबंध लिखने में सक्षम राज्य मशीन बनाएं।


अनंत निबंध उत्पन्न करने के लिए राज्य मशीन - संस्करण 1


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


  1. संज्ञा अवस्था से शुरू करके, हम संज्ञाओं की कुछ पूर्व-निर्धारित सूची में से चुनकर एक संज्ञा उत्पन्न करते हैं। मान लीजिए कि हमारी संज्ञा "द वर्ल्ड" है। (अब तक का वाक्य: "द वर्ल्ड")
  2. फिर हम क्रिया अवस्था में पहुँच जाते हैं, और आगे एक क्रिया उत्पन्न करते हैं (जैसे, "भौंकना")। (अब तक का वाक्य: "दुनिया भौंकती है")
  3. हम विशेषण अवस्था में एक विशेषण (मान लीजिए, "लाल") उत्पन्न करते हैं। (अब तक का वाक्य: "दुनिया लाल भौंकती है")
  4. फिर, एंडमार्क स्थिति में, हम समाप्ति विराम चिह्नों में से एक उत्पन्न करते हैं, कहते हैं "!"। (वाक्य: "दुनिया लाल भौंकती है!")
  5. अंत में, हम निबंध में अपना अगला वाक्य उत्पन्न करने के लिए संज्ञा अवस्था में वापस आ गए हैं।


यह राज्य मशीन एक (निरर्थक) निबंध उत्पन्न कर सकती है जो इस तरह दिखता है।


दुनिया लाल भौंकती है! चचेरा भाई हैरी बेईमानी से बारिश करता है? बाघ मस्ती से झिलमिलाते हैं। …


अनंत निबंध के लिए गैर-नियतात्मक राज्य मशीन

हालाँकि "गैर-नियतात्मक" जटिल लगता है, हमारे उद्देश्यों के लिए, इसका मतलब बस कुछ यादृच्छिकता जोड़ना है। मूलतः हम कुछ राज्यों में परिवर्तन करने से पहले एक प्रकार का सिक्का उछालने का कार्य जोड़ रहे हैं। आप समझ जायेंगे कि मेरा क्या मतलब है।

अनंत निबंध उत्पन्न करने के लिए गैर-नियतात्मक राज्य मशीन - संस्करण 2


उपरोक्त गैर-नियतात्मक राज्य मशीन पहले वाली के समान ही है। एकमात्र अंतर ये हैं:

  • निषेधन "नहीं" या "नहीं" जैसे शब्द हैं और संयोजक शब्द "और" और "लेकिन" जैसे शब्द हैं।
  • क्रिया अवस्था में, हम एक क्रिया उत्पन्न करते हैं और फिर एक सिक्का उछालते हैं। यदि यह शीर्ष पर पहुँचता है (50% संभावना), तो हम नकार अवस्था में चले जाते हैं; अन्यथा हम विशेषण अवस्था में चले जाते हैं।
  • इसी प्रकार, विशेषण अवस्था में, हम एक विशेषण उत्पन्न करते हैं और फिर एक सिक्का उछालते हैं। यदि शीर्ष, हम संयोजन अवस्था में जाते हैं; यदि यह पूँछ है, तो हम एंडमार्क स्थिति में जाते हैं।


यादृच्छिकता, निषेध और संयोजन की शुरूआत के साथ, अब हम अधिक दिलचस्प और परिवर्तनीय-लंबाई वाले वाक्य उत्पन्न कर सकते हैं।


राज्य डिज़ाइन पैटर्न

अब, आइए समझें कि राज्य डिज़ाइन पैटर्न कैसे काम करता है। दोबारा, याद रखें कि हम एक स्टेट मशीन को ऑब्जेक्ट-ओरिएंटेड कोड में अनुवाद करने का प्रयास कर रहे हैं।


निबंध निर्माण राज्य मशीन में, ध्यान दें कि प्रत्येक राज्य को दो काम करने की आवश्यकता है।

  1. कुछ कार्रवाई करें. इस मामले में, एक शब्द (संज्ञा, विशेषण, आदि) उत्पन्न करना।
  2. अगले राज्य में संक्रमण. संज्ञा से क्रिया तक, इत्यादि।


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


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


राज्य डिज़ाइन पैटर्न यूएमएल आरेख


यदि हम इसे निबंध निर्माण उदाहरण पर मैप करते हैं, तो यूएमएल आरेख इस तरह दिखता है।


निबंध सृजन के लिए राज्य पैटर्न लागू किया गया


WordState अब एक इंटरफ़ेस के बजाय एक अमूर्त वर्ग (इटैलिक द्वारा दर्शाया गया) है। सार वर्गों में कुछ अमूर्त (कार्यान्वित नहीं) विधियाँ और विशेषताएँ हो सकती हैं, जबकि अन्य को परिभाषित किया जा सकता है। इंटरफ़ेस पूरी तरह से अमूर्त हैं: उनकी सभी विधियाँ अमूर्त हैं। मैंने यह बदलाव इसलिए किया क्योंकि सभी राज्यों में generateWord कार्यान्वयन समान है, और डुप्लिकेट कोड से बचना अच्छा है।


आइए उपरोक्त प्रत्येक विशेषता और विधि का विश्लेषण करें। EssayContext क्लास में, हमारे पास है:

  • state : वर्तमान WordState ऑब्जेक्ट का संदर्भ।
  • essayBody : अब तक उत्पन्न सभी शब्दों की सूची।
  • setState() : state विशेषता को बदलने के लिए सेटर।
  • addWord() : निबंध के मुख्य भाग में अगला शब्द जोड़ने की विधि।
  • generateEssay() : हम अपना निबंध तैयार करने के लिए इस विधि को कहते हैं; जब essayBody लंबाई length से अधिक हो तो हम रुक जाते हैं।
  • printEssay() : जेनरेट किए गए निबंध की एक स्ट्रिंग लौटाता है।


अमूर्त वर्ग WordState में, हमारे पास है:

  • wordList : शब्दों की एक सूची के लिए सार संपत्ति (इटैलिक द्वारा इंगित) जिसमें से हम उत्पन्न करने के लिए शब्द चुनते हैं।
  • generateWord() : वह विधि जो निबंध के संदर्भ में उत्पन्न शब्द जोड़ती है।
  • nextState() : अगली स्थिति वापस करने के लिए सार विधि।


हम WordState से प्राप्त अन्य सभी ठोस अवस्थाओं के लिए एक प्रतिनिधि उदाहरण के रूप में NounState उपयोग करेंगे।

  • wordList : संज्ञाओं की एक सूची जिसमें से हम उत्पन्न करने के लिए शब्द चुनते हैं।
  • nextState() : अगला राज्य लौटाता है।


अब, हमारे पास वास्तव में इसे कोड में लागू करने के लिए आवश्यक सब कुछ है। आइए आगे बढ़ें और ऐसा ही करें!


पायथन कोड

आइए सबसे पहले EssayContext क्लास को essay_context.py नामक फ़ाइल में लिखें। हम ऊँट का मामला छोड़ देंगे और साँप का मामला अपनाएँगे क्योंकि, ठीक है, अजगर एक... साँप है (क्षमा करें)।


 from word_state import WordState class EssayContext: def __init__(self, state: WordState): self.state = state self.essay_body: list[str] = [] def set_state(self, state: WordState): self.state = state def add_word(self, word: str): self.essay_body.append(word) def generate_essay(self, length: int): while len(self.essay_body) < length: self.state.generate_word(self) def print_essay(self) -> str: return " ".join(self.essay_body)


फिर, आइए word_state.py नामक फ़ाइल में स्थितियाँ जोड़ें।


 import abc import numpy as np class WordState(abc.ABC): word_list: list[str] @classmethod def generate_word(cls, context: "EssayContext"): word = np.random.choice(cls.word_list) context.add_word(word) context.set_state(cls.next_state()) @classmethod @abc.abstractmethod def next_state(cls) -> "WordState": pass class NounState(WordState): word_list: list[str] = ["everything", "nothing"] @classmethod def next_state(cls): return VerbState class VerbState(WordState): word_list: list[str] = ["is", "was", "will be"] @classmethod def next_state(cls): heads = np.random.rand() < 0.5 if heads: return NegationState return AdjectiveState class NegationState(WordState): word_list: list[str] = ["not"] @classmethod def next_state(cls): return AdjectiveState class AdjectiveState(WordState): word_list: list[str] = ["fantastic", "terrible"] @classmethod def next_state(cls): heads = np.random.rand() < 0.5 if heads: return ConjunctionState return EndmarkState class ConjunctionState(WordState): word_list: list[str] = ["and", "but"] @classmethod def next_state(cls): return NounState class EndmarkState(WordState): word_list: list[str] = [".", "!"] @classmethod def next_state(cls): return NounState


अंत में, आइए main.py में सब कुछ चलाने के लिए कोड जोड़ें।


 from essay_context import EssayContext from word_state import NounState if __name__ == '__main__': ctx = EssayContext(NounState) ctx.generate_essay(100) print(ctx.print_essay())


python main.py चलाने से हमें निम्नलिखित आउटपुट मिलता है (गैर-नियतिवाद के कारण हर बार अलग):


 'everything is not terrible and nothing was terrible ! everything will be not fantastic but everything is fantastic . everything will be fantastic . nothing will be fantastic and nothing will be terrible ! everything was not fantastic and everything will be not terrible . everything was terrible . nothing was terrible but nothing will be fantastic ! nothing is not terrible . nothing was not fantastic but everything was not fantastic ! everything will be not fantastic but everything will be terrible ! everything will be not fantastic . everything is fantastic but nothing will be not terrible ! everything will be not fantastic but nothing was not fantastic !'


ऐसी सरल प्रणाली के लिए बुरा नहीं है! निबंध निर्माण को और अधिक परिष्कृत बनाने के लिए हम विभिन्न शब्द सूचियों का विस्तार भी कर सकते हैं या अधिक राज्य जोड़ सकते हैं। हम अपने निबंधों को अगले स्तर पर ले जाने के लिए कुछ एलएलएम एपीआई भी पेश कर सकते हैं।


अंतिम विचार

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


यह एक अच्छी तरह से परिभाषित पैटर्न के साथ अनुक्रम उत्पन्न करने या पहचानने के लिए भी उपयुक्त है। यह हमारे निबंध पीढ़ी के उदाहरण पर लागू होता है।


अंत में, आप पूछ सकते हैं, "इस सबका मतलब क्या है?" इस "अनंत" निबंध को उत्पन्न करने के लिए हमें विभिन्न राज्यों और वर्गों को परिभाषित करने में इतनी परेशानी क्यों उठानी पड़ी? समान व्यवहार प्राप्त करने के लिए हम पायथन कोड की 20 (या उससे कम) पंक्तियाँ लिख सकते थे।


संक्षिप्त उत्तर बेहतर स्केलेबिलिटी के लिए है।


कल्पना कीजिए, यदि केवल तीन या पाँच राज्यों के बजाय, हमारे पास 50 या 500 राज्य होते। यह अतिशयोक्ति नहीं है; वास्तविक उद्यम प्रणालियों में जटिलता का वह स्तर होता है। अचानक, राज्य पैटर्न अपने विघटन और अलगाव के कारण अधिक आकर्षक लगता है। हम पूरे सिस्टम को अपने दिमाग में रखे बिना एक समय में केवल एक राज्य पर ध्यान केंद्रित कर सकते हैं। परिवर्तन लाना आसान है क्योंकि एक राज्य दूसरे को प्रभावित नहीं करेगा। यह आसान इकाई परीक्षण की भी अनुमति देता है, जो एक स्केलेबल और रखरखाव योग्य प्रणाली का एक बड़ा हिस्सा है।


अंततः, राज्य पैटर्न केवल राज्यों के प्रबंधन के बारे में नहीं है; सभी डिज़ाइन पैटर्न की तरह, यह बिल्डिंग सिस्टम के लिए एक खाका है जो परिष्कृत होने के साथ-साथ स्केलेबल और रखरखाव योग्य भी है।