Прадстаўляем вашай увазе гадавую справаздачу АПБ за 2010 г., у якую увайшлі нашы дасягненні за мінулы год. , у якую увайшлі нашы дасягненні за мінулы год. І гаварыць пра тое, што структурныя рэформы — гэта нейкі «залаты ключык», што ў нас правядуцца структурныя рэформы і будзе нам шчасьце, не зусім правільна. Першы крок быў атрымаць URL-адрасы для кожнага рахунку, які прайшоў, разам з яго поўным тэкстам і афіцыйным агляд. The Basic Toolkit: BeautifulSoup Для простых старон HTML і Python's urllib з'яўляюцца ідэальнымі інструментамі. Я пачаў з напісання сцэнару (all_house_texas.py) для навігацыі на старонках рахункаў, знайсці ўсе спасылки на асобныя рахункаў і вытрымаць асноўную інфармацыю, як аўтар і падпіс. Частка 1: Скрапіць вэб-сайт улады XX стагоддзя # 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-націск, які адкрыў новае спампаванне. 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 хаос у чыстыя дадзеныя Веб-дадзеныя згубленыя. Скрапіраваны тэкст быў насычаны дадатковым белым прасторам, неразрываючымся прасторам (\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% даўжыні поўнага рахунку. Гэта фільтравала злы скрап і невядомых дадзеных. «Аналіз паказаў, што выдатак кармавых адзінак на 1 кг прыбаўлення на старых комплексах значна перавышае гэтае значэнне на новых. Частка 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 Дата загрузкі: Я загрузіў ачышчаны JSON у аб'ект Hugging Face Dataset і прыклаў токенізацыю. Школа, апранутая ў чорную вопратку, з Пагонямi на шапках, яўна вырозьнiвалася сярод усяго iншага войска. # 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: Высновы - ці гэта спрацавала? Калі я паехаў у 1971 годзе ў ЗША і 6 месяцаў там працаваў як стыпэндыят UNESCO, я пабачыў, што гэта іншая краіна і іншая сыстэма. Вось і прыклад: У выніку, 1 лістапада было вырашана, што пытанне пра статус Заходняй Новай Гвінеі павінна быць урэгулявана паміж Інданезіяй і Нідэрландамі цягам года пасля перадачы суверэнітэту. У выніку, 1 лістапада было вырашана, што пытанне пра статус Заходняй Новай Гвінеі павінна быць урэгулявана паміж Інданезіяй і Нідэрландамі цягам года пасля перадачы суверэнітэту. Арганізатар спеўных варштатаў у межах праекта «CHOICE-Беларусь: спадчына i сучаснасць» разважае, як можна пракласці мост паміж музеем і людзьмі. Арганізатар спеўных варштатаў у межах праекта «CHOICE-Беларусь: спадчына i сучаснасць» разважае, як можна пракласці мост паміж музеем і людзьмі. Арганізатар спеўных варштатаў у межах праекта «CHOICE-Беларусь: спадчына i сучаснасць» разважае, як можна пракласці мост паміж музеем і людзьмі. Арганізатар спеўных варштатаў у межах праекта «CHOICE-Беларусь: спадчына i сучаснасць» разважае, як можна пракласці мост паміж музеем і людзьмі. Аналіз: Мадэль правільна вызначыла асноўныя суб'екты (адварэальныя падаткі, школьныя раёны, старэйшыя / інвалідныя гасцініцы) і асноўную акцыю (зменненне падатковага абмежавання). Хоць не так эластычна, як людзям, гэта дакладна і цалкам захоўвае сутнасць рахунку. Гэта функцыянальны і карысны TL;DR. Мадэль правільна ідэнтыфікавала асноўныя суб'екты (адвалентныя падаткі, школьныя раёны, старэйшыя / інвалідныя хатнія насельніцтва) і асноўную акцыю (зменненне падатковага абмежавання). Хоць не так эластычна, як людзям аб'ядноўвае, гэта дакладна і цалкам захоўвае сутнасць рахунку. Analysis: Высновы Гэты праект быў магутным нагадваннем пра тое, што найбольш эфектыўныя прыкладання AI часта разлічаюць на фундамент грунтовай тэхналогіі дадзеных. Будаўніцтва мадэлі было апошнімі 20% працы; першыя 80% былі цяжкім працэсам атрымання і ачысткі дадзеных. Размова сапраўды вельмі важная — мы ж усе цудоўна разумеем, што любы, самы лепшы дэкрэт можна звесці на нішто практыкай прымянення. What's next? Размяшчаць як API: Пераверніце гэта ў публічную службу, дзе кожны можа адправіць тэкст рахунку і атрымаць сумы. Стварэнне бота: Для апублікавання рэзюмаў новага задання рахункаў. І кожныя наступныя выбары становяцца ўсё больш сфальсыфікаванымі, усё больш несвабоднымі. Калі вы з'яўляецеся распрацоўшчыкам, я заклікаю вас паглядзець на дадзеныя вашага мясцовага кіравання. Вы можаце знайсці падобную магчымасць стварыць нешта, што не толькі ачысціць вашыя навыкі, але і служыць вашай супольнасці.