कानून हमारे समाज का स्रोत कोड है, लेकिन यह अक्सर ऐसे तरीके से लिखा जाता है जो उन लोगों के लिए अपरिहार्य है जिन्हें यह नियंत्रित करता है. बिल दर्जनों पृष्ठों लंबे हो सकते हैं, घने कानूनी और क्रॉस संदर्भों से भरे हुए हैं जो उन्हें लगभग असंभव बनाते हैं। एक डेवलपर्स के रूप में, मैं सरकार को अधिक पारदर्शी और सुलभ बनाने के लिए प्रौद्योगिकी का उपयोग करने में विश्वास करता हूं। क्या होगा अगर मैं किसी भी बिल को पढ़ने और अपने स्वयं के संक्षेप को लिखने के लिए एक एआई को प्रशिक्षित करने के लिए डेटा का उपयोग कर सकता हूं? यह कहानी है कि मैं सिर्फ ऐसा करने के लिए एक अंत से अंत तक पाइपलाइन कैसे बनाया: डेटा को स्क्रैपिंग से, गड़बड़ी को साफ करने के लिए, एक शक्तिशाली भाषा मॉडल को ठीक करने के लिए। पहला कदम प्रत्येक बिल के लिए URL प्राप्त करना था जो पारित किया गया था, इसके पूर्ण पाठ और आधिकारिक संक्षेप के साथ। बुनियादी टूलकिट: BeautifulSoup सरल HTML पृष्ठों के लिए और पियथन का urllib सही उपकरण हैं। मैंने एक स्क्रिप्ट (all_house_texas.py) लिखने से शुरू किया, बिल फ़ाइल पेजों पर नेविगेशन करने के लिए, व्यक्तिगत बिल इतिहास के सभी लिंक ढूंढें, और लेखक और उपनाम जैसे बुनियादी जानकारी निकालें। भाग 1: एक 20 वीं शताब्दी की सरकार वेबसाइट का स्क्रैपिंग # From: leg_module_test.py # A simple function to turn a URL into a BeautifulSoup object import urllib.request from bs4 import BeautifulSoup def make_soup(url): thepage = urllib.request.urlopen(url) soupdata = BeautifulSoup(thepage, "lxml") return soupdata website ='https://capitol.texas.gov/BillLookup/History.aspx?LegSess=89R&Bill=SB1' soup = make_soup(website) # Find the author's name by its specific HTML ID for data in soup.findAll('td', id = 'cellAuthors'): print(data.text) यह प्रारंभिक डेटा के लिए अच्छी तरह से काम कर रहा था, लेकिन मैंने जल्दी से एक दीवार का सामना किया। JavaScript के लिए Selenium के साथ leveling Up डेटा का सबसे मूल्यवान टुकड़ा एक मानक लिंक नहीं था. यह एक जावास्क्रिप्ट onclick घटना के पीछे छिपा हुआ था जो एक नया पॉपअप विंडो खोलता था. BeautifulSoup जावास्क्रिप्ट को निष्पादित नहीं कर सकता है, इसलिए यह लिंक नहीं देख सकता था. यह आधुनिक वेब स्क्रैपिंग में एक आम चुनौती है. समाधान? , एक उपकरण जो एक वास्तविक वेब ब्राउज़र को स्वचालित करता है. सेलेनिम का उपयोग करके, मेरा स्क्रिप्ट पृष्ठ लोड कर सकता है, जावास्क्रिप्ट रेंज करने के लिए इंतजार कर सकता है, और फिर बटन के साथ बातचीत कर सकता है जैसे एक इंसान होगा। Selenium मेरा स्क्रिप्ट texas_leg_txt_from_list.py अंततः संक्षेप URL प्राप्त करने के लिए इस दृष्टिकोण का उपयोग किया। # From: texas_leg_txt_from_list.py # Using Selenium to find an element and extract its JavaScript-based URL from selenium import webdriver from selenium.webdriver.common.by import By import time # ... (driver setup code) ... driver.get('https://capitol.texas.gov/BillLookup/Text.aspx?LegSess=75R&Bill=HB1') time.sleep(1.5) # Wait for the page to load # Find the summary link by its ID bill_summary_link = driver.find_element(By.ID, 'lnkBillSumm') # Get the 'onclick' attribute, which contains the JavaScript function call onclick_attribute = bill_summary_link.get_attribute('onclick') # A bit of string manipulation to extract the URL from the JavaScript start_index = onclick_attribute.find("('") + 2 end_index = onclick_attribute.find("'", start_index) bill_summary_url = 'https://capitol.texas.gov/BillLookup/' + onclick_attribute[start_index:end_index] print(f"Successfully extracted summary URL: {bill_summary_url}") driver.quit() इसके साथ, मैं हजारों बिलों के लिए तीन महत्वपूर्ण डेटा टुकड़ों को विश्वसनीय रूप से इकट्ठा कर सकता था: मुख्य पृष्ठ URL, पूर्ण पंजीकृत पाठ, और आधिकारिक संक्षेप पाठ। भाग 2: क्लिनअप टीम - HTML अराजकता को साफ डेटा में बदलना वेब डेटा गड़बड़ है. स्क्रैपिड टेक्स्ट अतिरिक्त व्हाइटस्पेस, गैर-बूट स्पेस वर्ण (\xa0), और अन्य HTML आर्टिफैक्ट्स के साथ भरा हुआ था. इससे पहले कि मैं इसे एक मॉडल को खिला सकता था, इसे एक गंभीर सफाई की आवश्यकता थी. मेरा start_analysis_0.py स्क्रिप्ट इस महत्वपूर्ण कदम के लिए समर्पित था। सबसे पहले, मैंने व्हाइटस्पेस को मानकीकृत करने और मशरूम वर्णों को हटाने के लिए रिजक्स का उपयोग करके एक सरल सफाई फ़ंक्शन लिखा। # From: start_analysis_0.py # A function to clean raw text scraped from the web import re def clean_text(text): if not isinstance(text, str): return "" # Handle cases where data might not be a string text = re.sub(r'\s+', ' ', text) # Collapse all whitespace into single spaces text = text.replace('\xa0', ' ') # Remove non-breaking spaces text = text.replace('__','') # ... other replacements ... return text.strip() इसके बाद, मैंने एक महत्वपूर्ण गुणवत्ता नियंत्रण जांच लागू की। एक अच्छा संक्षेप मूल पाठ की तुलना में काफी छोटा होना चाहिए, लेकिन इतना छोटा नहीं है कि यह बेकार है. मैंने केवल जोड़े रखने का फैसला किया जहां संक्षेप की लंबाई पूरे बिल की लंबाई के 10% और 100% के बीच थी. इसने खराब स्क्रैप और अपरिवर्तनीय डेटा को फ़िल्टर किया. हजारों बिल को संसाधित करने के बाद, मैंने इस अनुपात का एक हिस्टोग्राम बनाया। यह विज़ुअलाइज़ेशन पुष्टि की कि मेरे अधिकांश डेटा एक स्वस्थ वितरण में गिर गए, मेरी फ़िल्टरिंग तर्क की पुष्टि. अंतिम, साफ डेटासेट को एकल JSON फ़ाइल के रूप में संग्रहीत किया गया था, मुख्य घटना के लिए तैयार। भाग 3: Fine-Tuning एक T5 मॉडल अब मजेदार हिस्सा के लिए. मैं उपयोग करने के लिए चुना एक शक्तिशाली और बहुमुखी टेक्स्ट-टेक्स्ट ट्रांसफर ट्रांसफार्मर. T5 निर्देशों के बाद कार्यों के लिए अच्छा है. संक्षेप के साथ पाठ को प्रीपेड करके, मैं कर सकता हूं मेरे प्रशिक्षण पाइपलाइन को start_analysis_1.py और start_analysis_2.py में Hugging Face ट्रांसफार्मर और TensorFlow पुस्तकालयों का उपयोग करके बनाया गया था। T5 छोटे मॉडल सिखाएं मॉडल मुख्य प्रक्रिया इस तरह दिखती है: Tokenization: यह चरण पाठ को संख्यात्मक आईडी में परिवर्तित करता है जिसे मॉडल समझ सकता है. मैंने एक प्री-प्रसंस्करण फ़ंक्शन बनाया है ताकि यह बिल पाठ (आउट) और संक्षेप (आधारित लेबल) दोनों के लिए संसाधित हो। # From: start_analysis_1.py # This function tokenizes the text and prepares it for the model from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained('t5-small') prefix = "summarize: " def preprocess_function(examples): # Prepare the input text with the "summarize: " prefix inputs = [prefix + doc for doc in examples["source_text"]] model_inputs = tokenizer(inputs, max_length=512, truncation=True) # Tokenize the target summaries with tokenizer.as_target_tokenizer(): labels = tokenizer(examples["target_text"], max_length=128, truncation=True) model_inputs["labels"] = labels["input_ids"] return model_inputs डेटा लोड: मैंने शुद्ध जेएसओएन को एक हगिंग फेस डेटासेट ऑब्जेक्ट में लोड किया और टोकनाइज़ेशन लागू किया। प्रशिक्षण: अंत में, मैंने मॉडल को कॉन्फ़िगर किया, एक ऑप्टिमाइज़र सेट किया, और model.fit() के साथ प्रशिक्षण प्रक्रिया को शुरू किया। यह वह जगह है जहां जादू होता है. मॉडल डेटा के माध्यम से पुनरावृत्ति करता है, पूर्वानुमान करता है, उन्हें आधिकारिक सारांशों के साथ तुलना करता है, और बेहतर और बेहतर होने के लिए अपने आंतरिक वजन को समायोजित करता है। # From: start_analysis_1.py # The final training call in TensorFlow import tensorflow as tf from transformers import TFAutoModelForSeq2SeqLM, AdamWeightDecay # ... (dataset and data_collator setup) ... optimizer = AdamWeightDecay(learning_rate=2e-5, weight_decay_rate=0.01) model = TFAutoModelForSeq2SeqLM.from_pretrained("t5-small") model.compile(optimizer=optimizer) # Let's train! model.fit( x=tf_train_set, validation_data=tf_test_set, epochs=3 ) # Save the fine-tuned model for later use model.save_pretrained("./t5_small_texas_bills") भाग 4: फैसले - क्या यह काम करता है? प्रशिक्षण के घंटों के बाद, सच्चाई का क्षण आया. मैंने मॉडल को एक बिल खिलाया जिसे उसने पहले कभी नहीं देखा था, यह देखने के लिए कि यह क्या पैदा करेगा। यहाँ एक उदाहरण है: **Original Bill Text (Snippet): \ "...एक अधिनियम जो स्कूल क्षेत्र के कर दर में किसी भी कमी को प्रतिबिंबित करने और स्थानीय आय के किसी भी नुकसान के खिलाफ एक स्कूल क्षेत्र की रक्षा करने के लिए स्कूल क्षेत्र द्वारा बुजुर्गों या विकलांगों के निवास घरों पर लगाए जा सकते हैं कि कुल राशि पर ad valorem करों की सीमा को कम करने के लिए प्रदान करता है ..." **Original Bill Text (Snippet): \ "...एक अधिनियम जो स्कूल क्षेत्र के कर दर में किसी भी कमी को प्रतिबिंबित करने और स्थानीय आय के किसी भी नुकसान के खिलाफ एक स्कूल क्षेत्र की रक्षा करने के लिए स्कूल क्षेत्र द्वारा बुजुर्गों या विकलांगों के निवास घरों पर लगाए जा सकते हैं कि कुल राशि पर ad valorem करों की सीमा को कम करने के लिए प्रदान करता है ..." **Official Summary (Ground Truth): \ "यह अधिनियम बुजुर्ग या विकलांग घर मालिकों के लिए स्कूल जिले पर ad valorem करों पर सीमा को कम करता है ताकि कर दर में कमी को प्रतिबिंबित किया जा सके. यह सुनिश्चित करता है कि स्कूल जिलों को किसी भी परिणामस्वरूप आय हानि के लिए क्षतिपूर्ति दी जाती है. बदलाव 2007 कर वर्ष से लागू होता है, संबंधित संविधान संशोधन के मतदाता अनुमोदन पर निर्भर करता है। **Official Summary (Ground Truth): \ "यह अधिनियम बुजुर्ग या विकलांग घर मालिकों के लिए स्कूल जिले पर ad valorem करों पर सीमा को कम करता है ताकि कर दर में कमी को प्रतिबिंबित किया जा सके. यह सुनिश्चित करता है कि स्कूल जिलों को किसी भी परिणामस्वरूप आय हानि के लिए क्षतिपूर्ति दी जाती है. बदलाव 2007 कर वर्ष से लागू होता है, संबंधित संविधान संशोधन के मतदाता अनुमोदन पर निर्भर करता है। **AI-Generated संक्षेप: \ "अधिनियम कुल राशि पर सीमा को कम करने के लिए संदर्भित करता है जो एक स्कूल जिले द्वारा बुजुर्ग या विकलांग लोगों के निवास घरों पर लगाया जा सकता है। **AI-Generated संक्षेप: \ "अधिनियम कुल राशि पर सीमा को कम करने के लिए संदर्भित करता है जो एक स्कूल जिले द्वारा बुजुर्ग या विकलांग लोगों के निवास घरों पर लगाया जा सकता है। विश्लेषण: मॉडल ने मुख्य विषयों (ad valorem कर, स्कूल जिलों, बूढ़े / विकलांग घरों) और कोर कार्रवाई (टॉक्स सीमा को कम करना) को सही ढंग से पहचाना है। हालांकि मानव संक्षेप के रूप में उल्लेखनीय नहीं है, यह सटीक है और बिल का सार पूरी तरह से कब्जा करता है. यह एक कार्यात्मक और उपयोगी TL;DR है विश्लेषण: मॉडल ने मुख्य विषयों (ad valorem कर, स्कूल जिलों, बूढ़े / विकलांग घरों) और कोर कार्रवाई (टॉक्स सीमा को कम करना) को सही ढंग से पहचाना है। हालांकि मानव संक्षेप के रूप में उल्लेखनीय नहीं है, यह सटीक है और बिल का सार पूरी तरह से कब्जा करता है. यह एक कार्यात्मक और उपयोगी TL;DR है निष्कर्ष यह परियोजना एक शक्तिशाली स्मृति थी कि सबसे प्रभावशाली एआई अनुप्रयोग अक्सर ग्रिटी डेटा इंजीनियरिंग के आधार पर भरोसा करते हैं. मॉडल का निर्माण काम का अंतिम 20% था; पहला 80% डेटा प्राप्त करने और साफ करने की कठिन प्रक्रिया थी। अंतिम मॉडल सही नहीं है, लेकिन यह एक शक्तिशाली अवधारणा सबूत है. यह दिखाता है कि हम जटिल नागरिक जानकारी को हर किसी के लिए अधिक सुलभ बनाने के लिए आधुनिक एआई का उपयोग कर सकते हैं। What's next? एक एपीआई के रूप में तैनात करना: इसे एक सार्वजनिक सेवा में परिवर्तित करें जहां कोई भी एक बिल का पाठ भेज सकता है और एक सारांश प्राप्त कर सकता है। एक बॉट बनाना: हाल ही में जमा किए गए बिलों की सारांश पोस्ट करने के लिए। अन्य राज्यों में विस्तार: प्रत्येक संसद में एक ही समस्या है. इस पूरे पाइपलाइन को अनुकूलित किया जा सकता है. यदि आप एक डेवलपर हैं, तो मैं आपको अपने स्वयं के स्थानीय सरकार के डेटा को देखने के लिए प्रोत्साहित करता हूं. आप कुछ ऐसा बनाने का एक समान अवसर पा सकते हैं जो न केवल आपके कौशल को तेज करता है, बल्कि आपके समुदाय की सेवा भी करता है।