กฎหมายเป็นรหัสแหล่งของสังคมของเรา แต่มักจะเขียนในลักษณะที่ไม่สามารถเข้าถึงได้กับคนเดียวที่มันควบคุม Bills สามารถเป็นหลายสิบหน้ายาวเต็มไปด้วยความหนาแน่น legalese และการอ้างอิงข้ามที่ทําให้พวกเขาเกือบไม่สามารถอ่านได้เป็นแบบสุ่ม ฉันเป็นนักพัฒนาเชื่อว่าใช้เทคโนโลยีเพื่อทําให้รัฐบาลโปร่งใสและสามารถเข้าถึงได้มากขึ้น ฉันดูเว็บไซต์ของรัฐบาลเท็กซัสและเห็นความท้าทาย อะไรถ้าฉันสามารถใช้ข้อมูลเพื่อฝึกหัด AI เพื่ออ่านบัญชีใด ๆ และเขียนสรุปของตัวเอง? นี่คือเรื่องราวของวิธีที่ฉันสร้างท่อ End-to-End เพื่อทําเช่นนั้น: จากการขัดขวางข้อมูลเพื่อทําความสะอาดความสับสนจนถึงการปรับแต่งรูปแบบภาษาที่มีประสิทธิภาพ ขั้นตอนแรกคือการได้รับ URL สําหรับแต่ละใบสมัครที่ผ่านไปพร้อมกับข้อความเต็มรูปแบบและสรุปอย่างเป็นทางการ ชุดเครื่องมือพื้นฐาน: BeautifulSoup สําหรับหน้า HTML ง่ายและ urllib ของ Python เป็นเครื่องมือที่สมบูรณ์แบบ ฉันเริ่มโดยการเขียนสคริปต์ (all_house_texas.py) เพื่อเรียกดูหน้า Bills Filed ค้นหาลิงก์ทั้งหมดไปยังประวัติการสมัครใบสมัครแต่ละรายและสกัดข้อมูลพื้นฐานเช่นผู้เขียนและคําอธิบาย ส่วนหนึ่งที่ 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) นี้ทํางานได้ดีสําหรับข้อมูลต้นฉบับ แต่ฉันตีผนังอย่างรวดเร็ว การปรับระดับขึ้นด้วย Selenium สําหรับ JavaScript ชิ้นส่วนข้อมูลที่มีค่ามากที่สุดไม่ได้เป็นลิงก์มาตรฐาน มันถูกซ่อนอยู่เบื้องหลังเหตุการณ์การคลิกที่ JavaScript ที่เปิดหน้าต่าง popup ใหม่ BeautifulSoup ไม่สามารถเรียกใช้ JavaScript ดังนั้นจึงไม่สามารถเห็นลิงก์ได้ นี่คือความท้าทายที่พบบ่อยในการสกัดเว็บที่ทันสมัย โซลูชัน? เครื่องมือที่อัตโนมัติเว็บเบราว์เซอร์จริง ใช้ Selenium สคริปต์ของฉันสามารถโหลดหน้าเว็บรอให้ JavaScript แสดงแล้วโต้ตอบกับปุ่มเช่นเดียวกับมนุษย์ 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 Chaos ในข้อมูลที่สะอาด ข้อมูลเว็บเป็นความผิดปกติ ข้อความที่ถูกลบมามีพื้นที่สีขาวเพิ่มเติมตัวอักษรพื้นที่ที่ไม่ทําลาย (\xa0) และวัตถุประดิษฐ์ HTML อื่น ๆ ก่อนที่ฉันสามารถให้อาหารนี้ไปยังรูปแบบนี้ก็จําเป็นต้องทําความสะอาดอย่างจริงจัง สคริปต์ start_analysis_0.py ของฉันถูกทุ่มเทให้กับขั้นตอนที่สําคัญนี้ ครั้งแรกฉันเขียนฟังก์ชั่นการทําความสะอาดที่เรียบง่ายโดยใช้ regex เพื่อมาตรฐานพื้นที่สีขาวและลบตัวอักษรขยะ # 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 แบบ T5 ตอนนี้สําหรับส่วนสนุก ฉันเลือกที่จะใช้ เป็นเครื่องแปลงสัญญาณการถ่ายโอนข้อความเป็นข้อความที่มีประสิทธิภาพและหลากหลาย T5 เหมาะสําหรับคําแนะนําตามภารกิจ โดยการตั้งค่าข้อความด้วย summarize ฉันสามารถ การฝึกอบรมของฉันถูกสร้างขึ้นใน start_analysis_1.py และ start_analysis_2.py โดยใช้เครื่องแปลงใบหน้า Hugging และห้องสมุด TensorFlow รูปแบบ T5 ขนาดเล็ก เรียนแบบจําลอง กระบวนการหลักดูดังนี้: Tokenization: ขั้นตอนนี้แปลงข้อความเป็น ID หมายเลขที่รุ่นสามารถเข้าใจได้ ฉันได้สร้างฟังก์ชั่นการประมวลผลล่วงหน้าเพื่อจัดการเรื่องนี้ทั้งสําหรับข้อความบัญชี (การป้อนข้อมูล) และสรุป (ฉลากเป้าหมาย) # 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() นี่คือสถานที่ที่ความมหัศจรรย์เกิดขึ้น แบบจําลองจะซ้ําผ่านข้อมูลการคาดการณ์การเปรียบเทียบกับสรุปอย่างเป็นทางการและปรับน้ําหนักภายในเพื่อให้ดีขึ้นและดีขึ้น # 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: การตัดสิน - มันทํางานได้หรือไม่ หลังจากหลายชั่วโมงของการฝึกอบรมช่วงเวลาของความจริงมาถึง ฉันให้อาหารรุ่นบัญชีที่เขาไม่เคยเห็นก่อนที่จะเห็นสิ่งที่มันจะผลิต นี่เป็นตัวอย่าง: **ต้นฉบับ Bill Text (Snippet): \ "...A ACT ที่เกี่ยวข้องกับการกําหนดการลดขีด จํากัด ของจํานวนเงินทั้งหมดของภาษี ad valorem ที่อาจถูกกําหนดโดยเขตโรงเรียนบนบ้านที่อยู่อาศัยของผู้สูงอายุหรือคนที่มีความเสี่ยงเพื่อสะท้อนให้เห็นถึงการลดอัตราภาษีของเขตโรงเรียนและปกป้องเขตโรงเรียนจากการสูญเสียรายได้ท้องถิ่นใด ๆ ที่เกิดขึ้น..." **ต้นฉบับ Bill Text (Snippet): \ "...A ACT ที่เกี่ยวข้องกับการกําหนดการลดขีด จํากัด ของจํานวนเงินทั้งหมดของภาษี ad valorem ที่อาจถูกกําหนดโดยเขตโรงเรียนบนบ้านที่อยู่อาศัยของผู้สูงอายุหรือคนที่มีความเสี่ยงเพื่อสะท้อนให้เห็นถึงการลดอัตราภาษีของเขตโรงเรียนและปกป้องเขตโรงเรียนจากการสูญเสียรายได้ท้องถิ่นใด ๆ ที่เกิดขึ้น..." **ข้อสรุปอย่างเป็นทางการ (ความจริงพื้นฐาน): \ "กฎหมายนี้ลดข้อ จํากัด ของภาษีเขตโรงเรียน ad valorem สําหรับผู้สูงอายุหรือเจ้าของบ้านที่มีความยืดหยุ่นเพื่อสะท้อนให้เห็นถึงลดอัตราภาษี มันให้แน่ใจว่าเขตโรงเรียนจะได้รับการชดเชยสําหรับการสูญเสียรายได้ใด ๆ ที่เกิดขึ้น การเปลี่ยนแปลงนี้มีผลบังคับใช้ตั้งแต่ปีภาษี 2007 ขึ้นอยู่กับการอนุมัติจากผู้มีอํานาจเลือกตั้งของการแก้ไขสภาที่เกี่ยวข้อง" **ข้อสรุปอย่างเป็นทางการ (ความจริงพื้นฐาน): \ "กฎหมายนี้ลดข้อ จํากัด ของภาษีเขตโรงเรียน ad valorem สําหรับผู้สูงอายุหรือเจ้าของบ้านที่มีความยืดหยุ่นเพื่อสะท้อนให้เห็นถึงลดอัตราภาษี มันให้แน่ใจว่าเขตโรงเรียนจะได้รับการชดเชยสําหรับการสูญเสียรายได้ใด ๆ ที่เกิดขึ้น การเปลี่ยนแปลงนี้มีผลบังคับใช้ตั้งแต่ปีภาษี 2007 ขึ้นอยู่กับการอนุมัติจากผู้มีอํานาจเลือกตั้งของการแก้ไขสภาที่เกี่ยวข้อง" ** AI-Generated Summary: \ "ข้อเสนอแนะเกี่ยวข้องกับการลดขีด จํากัด เกี่ยวกับจํานวนเงินทั้งหมดของภาษี ad valorem ที่อาจถูกกําหนดโดยเขตโรงเรียนบนบ้านที่อยู่อาศัยของผู้สูงอายุหรือผู้ติดเชื้อ ข้อเสนอแนะยังจะปกป้องเขตโรงเรียนจากการสูญเสียรายได้ท้องถิ่นใด ๆ ที่เกิดขึ้น" ** AI-Generated Summary: \ "ข้อเสนอแนะเกี่ยวข้องกับการลดขีด จํากัด เกี่ยวกับจํานวนเงินทั้งหมดของภาษี ad valorem ที่อาจถูกกําหนดโดยเขตโรงเรียนบนบ้านที่อยู่อาศัยของผู้สูงอายุหรือผู้ติดเชื้อ ข้อเสนอแนะยังจะปกป้องเขตโรงเรียนจากการสูญเสียรายได้ท้องถิ่นใด ๆ ที่เกิดขึ้น" การวิเคราะห์: แบบจําลองระบุหัวข้อหลักอย่างถูกต้อง (ภาษี ad valorem, districts โรงเรียน, ผู้สูงอายุ / ที่อยู่อาศัยที่มีความเสี่ยง) และการกระทําหลัก (ลดข้อ จํากัด ของภาษี) ในขณะที่ไม่ได้เป็นคําอธิบายเช่นเดียวกับคําอธิบายของมนุษย์ก็มีความแม่นยําและจับเนื้อหาของใบเสนอราคาได้อย่างสมบูรณ์แบบ มันเป็น TL;DR ที่ใช้งานได้และมีประโยชน์ แบบจําลองระบุหัวข้อหลักอย่างถูกต้อง (ภาษี ad valorem, districts โรงเรียน, เก่า / ที่อยู่อาศัยที่มีความเสี่ยง) และกระทําหลัก (ลดข้อ จํากัด ของภาษี) ในขณะที่ไม่ได้เป็นคําอธิบายเช่นเดียวกับคําอธิบายของมนุษย์ก็มีความแม่นยําและจับเนื้อหาของใบเสนอราคาได้อย่างสมบูรณ์แบบ มันเป็น TL;DR ที่ใช้งานได้และมีประโยชน์ Analysis: ข้อสรุป โครงการนี้เป็นคําเตือนที่แข็งแกร่งว่าแอพพลิเคชัน AI ที่มีอิทธิพลมากที่สุดมักจะพึ่งพาพื้นฐานของการวิศวกรรมข้อมูลที่รุนแรง การสร้างรุ่นเป็น 20% ของงานสุดท้าย 80% ของงานแรกเป็นกระบวนการที่ยากลําบากของการรับและทําความสะอาดข้อมูล รุ่นสุดท้ายไม่สมบูรณ์แบบ แต่ก็เป็นหลักฐานแนวคิดที่มีประสิทธิภาพ มันแสดงให้เห็นว่าเราสามารถใช้ AI แบบทันสมัยเพื่อให้ข้อมูลสาธารณชนที่ซับซ้อนเข้าถึงได้มากขึ้นสําหรับทุกคน What's next? พัฒนาเป็น API: แปลงนี้เป็นบริการสาธารณะที่ทุกคนสามารถส่งข้อความของใบแจ้งหนี้และได้รับสรุป สร้างบอท: เพื่อโพสต์สรุปของใบแจ้งหนี้ที่จดทะเบียนใหม่ การขยายตัวไปยังรัฐอื่น ๆ: แต่ละรัฐอนุญาโตตุลาการมีปัญหาเดียวกัน ทั้งหมดนี้สามารถปรับเปลี่ยนได้ หากคุณเป็นนักพัฒนาฉันขอแนะนําให้คุณดูข้อมูลของรัฐบาลท้องถิ่นของคุณเอง คุณอาจพบโอกาสที่คล้ายกันในการสร้างสิ่งที่ไม่เพียง แต่ช่วยเพิ่มทักษะของคุณ แต่ยังให้บริการชุมชนของคุณ