კანონმდებლობა არის ჩვენი საზოგადოების წყარო კოდი, მაგრამ ეს ხშირად ჩაწერილი გზა, რომელიც არ არის ხელმისაწვდომი მათთვის, ვინც იგი მართავს. ბლოკები შეიძლება იყოს ათასობით გვერდზე ხანგრძლივი, შეფუთული მშრალი legalese და cross-references, რაც მათ თითქმის არ არის შესაძლებელი წაიკითხოთ ჩვეულებრივ. როგორც Developer მე ვფიქრობ, რომ გამოიყენოთ ტექნოლოგია, რათა მთავრობა უფრო გადარჩენა და ხელმისაწვდომი. მე ეწვიეთ Texas Legislature ვებგვერდზე და იხილე მოვლენას. რა თქმა უნდა, თუ ვიყენებ მონაცემებს AI- ის სასწავლოთვის, რათა წაიკითხოთ ნებისმიერი ანგარიშს და წაიკითხოთ საკუთარი შეტყობინება? ეს არის ისტორია, თუ როგორ მე აშენდა end-to-end მილები, რათა გააკეთოთ მხოლოდ ეს: მონაცემების scraping, გაწმენდა რთული, გააუმჯობესოს ძლიერი ენის მოდელი. პირველი ნაბიჯი იყო, რომ მიიღოთ URL-ები თითოეული ანგარიში, რომელიც უკვე გადაიხადოს, ერთად სრული ტექსტი და ოფიციალური შეტყობინება. ძირითადი ინსტრუმენტები: BeautifulSoup მარტივი HTML გვერდებზე და Python- ის urllib არის სრულყოფილი ინსტრუმენტები. მე დაიწყე სკრიპტი (all_house_texas.py) წავიდეთ Bills Filed გვერდებზე, იპოვოთ ყველა ბმულები თითოეული ანგარიში ისტორიები, და ატვირთოთ ძირითადი ინფორმაცია, როგორიცაა ავტორი და ქვემოთ. Part 1: Scraping 20th Century Government საიტზე # 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) ეს მუშაობს კარგი პირველი მონაცემები, მაგრამ მე სწრაფად დატვირთვა wall. გაუმჯობესება Selenium for JavaScript ყველაზე ღირებულებული მონაცემები არ იყო სტანდარტული ბმული. ეს შეიცვალა JavaScript onclick ეფექტი, რომელიც გახსნა ახალი popup window. BeautifulSoup არ შეუძლია გააკეთოს JavaScript, ასე რომ არ შეუძლია ნახოთ ბმული. ეს არის თანამედროვე საიტზე scraping.The გადაწყვეტილება? , ინსტრუმენტი, რომელიც ავტომატებს რეალური ვებ ბრაუზერი. Selenium- ის გამოყენებით, ჩემი სკრიპტი შეიძლება დატვირთოთ გვერდს, დაველოდოთ JavaScript- ის render, და შემდეგ ინტეგრირებას ღილაკს, ისევე როგორც ადამიანური. 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, სრული რეგისტრირებული ტექსტი, და ოფიციალური შეტყობინება ტექსტი. Part 2: The Cleanup Crew - გადარჩენა HTML Chaos სუფთა მონაცემები Web მონაცემები რთულია. scraped ტექსტი შეიცვალა დამატებითი whitespace, non-breaking space characters (\xa0), და სხვა HTML არქიტექტები. სანამ მე შეუძლიათ feed ეს მოდელი, ეს საჭიროა სერიოზული გაწმენდა. ჩემი start_analysis_0.py სკრინშოტი განთავსებულია ამ მნიშვნელოვანი ნაბიჯზე. პირველი, მე წაიკითხე მარტივი სუფთა ფუნქცია გამოყენებით regex სტანდარტიზაციის whitespace და გააუმჯობესოს junk ფუნქციები. # 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% სრული ანგარიშის სიგრძე. ეს გადარჩენა ცუდი შეტყობინებები და უარყოფითი მონაცემები. შემდეგ დამუშავების ათასობით ანგარიშები, მე დაჯავშნა histogram ამ სიგრძე. ეს ვიზუალიზაცია დადასტურა, რომ ბევრი ჩემი მონაცემები შევიდა ჯანმრთელობის გაფართოება, გაფართოების ჩემი ფილტრაციის ლოგიკა. ბოლო, გაწმენდა მონაცემთა კომპლექტი გადარჩენა როგორც ერთი JSON ფაილი, მზად ძირითადი მოვლენები. ნაწილი 3: Fine-Tuning a T5 მოდელი ახლა მე ვფიქრობ, რომ მე ვფიქრობ, რომ მე ვფიქრობ, რომ მე ვფიქრობ, რომ მე ვფიქრობ. ეს არის ძლიერი და მრავალფუნქციური ტექსტი-ტექსტი გადამცემი ტანსაცმელი. T5 არის შესანიშნავი ინსტრუქციონირების შემდეგი სამუშაოები. მას შემდეგ, რაც ტექსტი დასაწყისში შეტყობინება, მე შეიძლება ჩემი სასწავლო pipeline შეიქმნა start_analysis_1.py და start_analysis_2.py გამოყენებით Hugging Face გადამცემები და TensorFlow ბიბლიოთეკები. T5 მცირე მოდელი განიცდიან მოდელი ძირითადი პროცესი ისახავს ეს: Tokenization: ეს ნაბიჯი კონვერტებს ტექსტი ნომერი IDs, რომ მოდელი შეუძლია გაიგოს. მე შეიქმნა წინასწარ დამუშავების ფუნქცია, რათა გააკეთოთ ეს, როგორც ფოლადის ტექსტი (ინსპორტი) და შეტყობინება (ზარი label). # 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 მონაცემთა დატვირთვა: მე დატვირთო დასუფთავებული JSON- ს Hugging Face Dataset- ში და გამოიყენა tokenization. სასწავლო: საბოლოოდ, მე კონფიგურაცია მოდელი, დააყენა ოპტიმიზერი, და დაწყებული სასწავლო პროცესი model.fit(). ეს არის, სადაც magic ხდება. მოდელი განახლება მონაცემები, გააკეთა პროგნოზიები, შედარებით მათ ოფიციალური შეტყობინებები, და შეესაბამება მისი შიდა წონა, რათა იყოს უკეთესი და უკეთესი. # 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") Part 4: The Verdict - ეს მუშაობს? მას შემდეგ, რაც საათის განმავლობაში ტრენინგი, ღონისძიება დასაწყისში. მე დააყენა მოდელი ფულადი, რომ ის არასდროს ვიყავი წინ, რათა ნახოთ, რა იქნება წარმოებული. აქ არის მაგალითია: ** დასაწყისში ბლოკზე (Snippet): \ "...ან ქსელის დაკავშირებით შეზღუდვა შეზღუდვა საერთო რაოდენობის ad valorem სატვირთო, რომელიც შეიძლება დააყენოს სკოლა district- ის მცხოვრებელი სახურავი სახურავი ასაკის ან მოცულობა, რათა იმიტომ, ნებისმიერი შეზღუდვა სკოლა district- ის სატვირთო და დაცვა სკოლა district- ის ნებისმიერი შემდეგი დაკარგვა ადგილობრივი შემოსავლების ... " ** დასაწყისში ბლოკზე (Snippet): \ "...ან ქსელის დაკავშირებით შეზღუდვა შეზღუდვა საერთო რაოდენობის ad valorem სატვირთო, რომელიც შეიძლება დააყენოს სკოლა district- ის მცხოვრებელი სახურავი სახურავი ასაკის ან მოცულობა, რათა იმიტომ, ნებისმიერი შეზღუდვა სკოლა district- ის სატვირთო და დაცვა სკოლა district- ის ნებისმიერი შემდეგი დაკარგვა ადგილობრივი შემოსავლების ... " ** ოფიციალური შეტყობინება (გონტალური სიტყვები): \ "გონტალური ამჟამად შეზღუდვა სასწავლო რეგიონებში ad valorem სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სა ** ოფიციალური შეტყობინება (გონტალური სიტყვები): \ "გონტალური ამჟამად შეზღუდვა სასწავლო რეგიონებში ad valorem სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სატვირთო სა **AI-Generated შეტყობინება: \ "ბეჭდვა დაკავშირებულია შეზღუდვის საერთო რაოდენობის ad valorem სატვირთო, რომელიც შეიძლება დააყენოთ სკოლა district on residence homesteads of elderly or disabled. ბეჭდვა ასევე დაცვა სკოლა district against any resulting loss in local revenue." **AI-Generated შეტყობინება: \ "ბეჭდვა დაკავშირებულია შეზღუდვის საერთო რაოდენობის ad valorem სატვირთო, რომელიც შეიძლება დააყენოთ სკოლა district on residence homesteads of elderly or disabled. ბეჭდვა ასევე დაცვა სკოლა district against any resulting loss in local revenue." ანალიზი: მოდელი სწრაფად აღინიშნა ძირითადი თემები (ad valorem სატვირთო, სკოლა districts, ძველი / მოცულობა სახლში) და ძირითადი ეტაპზე (გამცირება სატვირთო შეზღუდვა). მიუხედავად იმისა, რომ არ არის, როგორც ცოდნა, როგორც ადამიანის შეტყობინება, ეს არის საკმარისი და მოპოვებს სინათლის ფასი სრულყოფილი. ეს არის ფუნქციური და სასარგებლო TL;DR. მოდელი სწრაფად აღინიშნა ძირითადი თემები (ad valorem ტომარა, სკოლა districts, ასაკის / შეუზღუდავი homesteads) და ძირითადი საქმიანობა (გამცირება ტომარა შეზღუდავი). მიუხედავად იმისა, რომ არ არის, როგორც ცოდნა, როგორც ადამიანური შეტყობინება, ეს არის სწორი და მოპოვებს სინამდვილეში ანგარიში სრულყოფილი. ეს არის ფუნქციური და სასარგებლო TL;DR. Analysis: კონტაქტი ეს პროექტის ძლიერი აღწერილი, რომ ყველაზე ეფექტური AI განაცხადები ხშირად დამოკიდებულია რბილი მონაცემთა ინჟინერიზაციის საფუძველზე. მოდელის შექმნა იყო სამუშაო ბოლო 20%; პირველი 80% იყო მონაცემების მიღება და გაწმენდა. საბოლოო მოდელი არ არის სრულყოფილი, მაგრამ ეს არის ძლიერი კონცეფცია. ეს აჩვენებს, რომ ჩვენ შეგვიძლია გამოიყენოთ თანამედროვე AI, რათა მოკლე საზოგადოებრივი ინფორმაცია უფრო ხელმისაწვდომია ყველას. What's next? განაყენეთ როგორც API: გადაიხადეთ ეს საზოგადოებრივი მომსახურება, სადაც ვინმეს შეუძლია შეტყობინოს ფულადი ტექსტი და მიიღოთ შეტყობინება. Robot- ის შექმნა: ახალი ფულადი გამოქვეყნება. გააუმჯობესება სხვა ქვეყნებში: თითოეული პარამეტრები აქვს იგივე პრობლემა. ეს მთელი pipeline შეიძლება განკუთვნილია. თუ თქვენ აწარმოებელი, მე გთხოვთ, რომ იხილეთ თქვენი ადგილობრივი მთავრობის მონაცემები. თქვენ შეიძლება იპოვოთ მსგავსი შესაძლებლობა შექმნას რაღაც, რომელიც არა მხოლოდ გააუმჯობესებს თქვენი უნარებს, არამედ მომსახურებს თქვენს საზოგადოებას.