A jogszabályok társadalmunk forráskódja, de gyakran olyan módon vannak megírva, amelyhez az emberek nem férnek hozzá. A törvények több tucat oldal hosszúak lehetnek, sűrű jogi és keresztreferenciákkal vannak tele, amelyek szinte lehetetlenné teszik őket, hogy véletlenszerűen olvassák. Fejlesztőként hiszek a technológia használatában, hogy a kormányzat átláthatóbbá és hozzáférhetőbbé váljon. Megnéztem a texasi törvényhozás honlapját, és kihívást láttam. Mi lenne, ha az adatokat egy mesterséges intelligencia képzésére használhatnám, hogy bármilyen számlát elolvassak és saját összefoglalót írjak?Ez a történet arról, hogy hogyan építettem fel egy end-to-end csővezetéket, hogy pontosan ezt tegyem: az adatok levágásától a rendetlenség tisztításáig, egy erős nyelvi modell finomhangolásáig. Az első lépés az volt, hogy megkapja az URL-eket minden elhalasztott számla, valamint a teljes szöveg és a hivatalos összefoglaló. Az alapvető eszközkészlet: BeautifulSoup Az egyszerű HTML oldalak és Python urllib a tökéletes eszközök. Elkezdtem írni egy forgatókönyvet (all_house_texas.py), hogy navigáljon a Bills Filed oldalak, megtalálja az összes linket az egyes számlák történetét, és kivonja az alapvető információkat, mint a szerző és a felirat. 1. rész: A 20. századi kormányzati weboldal eltávolítása # 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) Ez jól működött a kezdeti adatokhoz, de gyorsan ütöttem egy falat. Segítség a Selenium JavaScript használatához A legértékesebb adat nem egy szabványos hivatkozás volt, hanem egy JavaScript kattintási esemény mögött rejtőzött, amely egy új pop-up ablakot nyitott meg.A BeautifulSoup nem tudja végrehajtani a JavaScriptet, így nem láthatja a hivatkozást. Ez egy közös kihívás a modern webes kaparás. a megoldás? Segítségével Selenium, a script töltheti az oldalt, várja meg, hogy a JavaScript renderelni, majd kölcsönhatásba lépni a gombot, mint egy ember lenne. Selenium A szkriptem texas_leg_txt_from_list.py használta ezt a megközelítést, hogy végre megkapja az összefoglaló URL-t. # 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() Ezzel megbízhatóan összegyűjthettem a három kulcsfontosságú adatot több ezer számla esetében: a főoldali URL-t, a teljes bejegyzett szöveget és a hivatalos összefoglaló szöveget. 2. rész: A tisztítási csapat - A HTML káosz tiszta adatokká alakítása A levágott szöveg tele volt extra fehér térrel, nem törő tér karakterekkel (\xa0), és más HTML-artefaktumokkal.Mielőtt ezt egy modellhez tudtam adni, komoly tisztításra volt szükség. A start_analysis_0.py scriptemet erre a kulcsfontosságú lépésre szenteltem. Először egy egyszerű tisztítási funkciót írtam a regex használatával, hogy szabványosítsam a fehér helyet és eltávolítsam a szemét karaktereket. # 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() Ezután egy kritikus minőségellenőrzési ellenőrzést hajtottam végre. A jó összefoglalónak jelentősen rövidebbnek kell lennie, mint az eredeti szövegnek, de nem olyan rövidnek, hogy haszontalan legyen. Úgy döntöttem, hogy csak olyan párokat tartok, ahol az összefoglaló hossza a teljes számla hossza 10% és 100% között van. Ez a vizualizáció megerősítette, hogy az adataim többsége egészséges eloszlásba esett, érvényesítve a szűrési logikámat. 3. rész: Fine-Tuning egy T5 modell Most a szórakoztató részhez. úgy döntöttem, hogy a egy erős és sokoldalú Text-to-Text Transfer Transformer. T5 nagyszerű az utasítások követő feladatokat. Az én képzési csővezeték épült start_analysis_1.py és start_analysis_2.py a Hugging Face transzformátorok és TensorFlow könyvtárak. T5 kis méretű, Tanítsd meg a modellt A fő folyamat így néz ki: Tokenizálás: Ez a lépés a szöveget numerikus azonosítókká alakítja, amelyeket a modell megérthet. létrehoztam egy előzetes feldolgozási funkciót, amely mind a számla szövegét (a bemenetet), mind az összefoglalót (a célcímkét) kezeli. # 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 Adattöltés: A megtisztított JSON-t egy Hugging Face Dataset objektumba töltöttem, és a tokenizálást alkalmaztam. Képzés: Végül konfiguráltam a modellt, beállítottam egy optimalizálót, és elindítottam a képzési folyamatot a model.fit(). Ez az, ahol a varázslat megtörténik. A modell átmegy az adatokon, előrejelzéseket készít, összehasonlítja azokat a hivatalos összefoglalókkal, és beállítja belső súlyait, hogy jobb és jobb legyen. # 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. rész: Az ítélet - működött? Órákig tartó képzés után eljött az igazság pillanata. tápláltam a modellnek egy számlát, amelyet még soha nem látott, hogy lássam, mit fog előállítani. Íme egy példa: **Original Bill Text (Snippet): \ "...A törvény, amely az iskolai kerület által az idősek vagy fogyatékkal élők lakóhelyeire kiszabható ad valorem adók teljes összegének korlátozását írja elő annak érdekében, hogy tükrözze az iskolai kerület adókulcsának bármilyen csökkentését, és megvédje az iskolai kerületet a helyi bevételekből eredő veszteségektől..." **Original Bill Text (Snippet): \ "...A törvény, amely az iskolai kerület által az idősek vagy fogyatékkal élők lakóhelyeire kiszabható ad valorem adók teljes összegének korlátozását írja elő annak érdekében, hogy tükrözze az iskolai kerület adókulcsának bármilyen csökkentését, és megvédje az iskolai kerületet a helyi bevételekből eredő veszteségektől..." **Hivatalos összefoglaló (Földigazság): \ "Ez a törvény csökkenti az idősebb vagy fogyatékkal élő háztulajdonosok iskolai kerület ad valorem adójára vonatkozó korlátozást, hogy tükrözze az adókulcs-csökkentéseket. biztosítja, hogy az iskolai kerületeket kompenzálják az ebből eredő bevételi veszteségért. **Hivatalos összefoglaló (Földigazság): \ "Ez a törvény csökkenti az idősebb vagy fogyatékkal élő háztulajdonosok iskolai kerület ad valorem adójára vonatkozó korlátozást, hogy tükrözze az adókulcs-csökkentéseket. biztosítja, hogy az iskolai kerületeket kompenzálják az ebből eredő bevételi veszteségért. **AI-generált összefoglaló: \ "A törvényjavaslat az ad valorem adók teljes összegének korlátozására vonatkozik, amelyet egy iskolai kerület az idősek vagy fogyatékkal élők lakóhelyeire vethet ki. **AI-generált összefoglaló: \ "A törvényjavaslat az ad valorem adók teljes összegének korlátozására vonatkozik, amelyet egy iskolai kerület az idősek vagy fogyatékkal élők lakóhelyeire vethet ki. Elemzés: A modell helyesen azonosította a fő témákat (ad valorem adók, iskolai körzetek, idősek / fogyatékkal élő háztartások) és a fő intézkedést (az adókorlátozás csökkentése). Bár nem olyan kiemelkedő, mint az emberi összefoglaló, pontos és tökéletesen rögzíti a számla lényegét. Elemzés: A modell helyesen azonosította a fő témákat (ad valorem adók, iskolai körzetek, idősek / fogyatékkal élő háztartások) és a fő intézkedést (az adókorlátozás csökkentése). Bár nem olyan kiemelkedő, mint az emberi összefoglaló, pontos és tökéletesen rögzíti a számla lényegét. következtetés Ez a projekt erős emlékeztető volt arra, hogy a legbefolyásosabb mesterséges intelligencia alkalmazások gyakran támaszkodnak a bonyolult adatmérnöki alapokra.A modell építése volt a munka utolsó 20% -a; az első 80% az adatok megszerzésének és tisztításának kemény folyamata volt. A végső modell nem tökéletes, de erőteljes koncepcióbizonyíték.Ez azt mutatja, hogy a modern mesterséges intelligenciát használhatjuk arra, hogy a komplex polgári információkat mindenki számára hozzáférhetőbbé tegyük. What's next? API-ként történő telepítés: Ez egy nyilvános szolgáltatássá válik, ahol bárki benyújthatja a számla szövegét és összefoglalót kaphat. Bot létrehozása: Az újonnan benyújtott számlák összefoglalásainak közzététele. Más államokba való kiterjesztés: Minden jogalkotási testületnek ugyanaz a problémája. Ha fejlesztő vagy, arra biztatom Önt, hogy vizsgálja meg a saját helyi kormányzati adatait.Hasonló lehetőséget találhat arra, hogy építsen valamit, ami nemcsak a készségeit élesíti, hanem a közösségét is szolgálja.