政府資助資料難以信任的隱藏原因

Back
Category : News

每個政府資助計畫都回答相同的五個問題:誰可以申請、金額多少、用途為何、截止日期是什麼,以及如何申請。這種一致性其實是個陷阱。當你試圖以程式方式從數千個來源中萃取這五個答案時,你會發現沒有兩個機構同意該如何表述其中任何一個——而你最不預期會出問題的欄位,也就是截止日期,結果卻是破壞最多事情的那一個。

以下是當你試圖大規模解析時實際看到的樣子。

同一個計畫,五種不同的形式

一個資助機會可能以以下形式出現:

來自機構 API 的結構化 JSON 記錄(很少見,即使有也填充不一致)
州經濟發展網站上的 HTML 表格
掃描的 PDF 資助機會通知(NOFO),資格條件埋在第四段
宣布計畫的新聞稿,連結到另一頁提供實際細節
單頁傳單,將真正規則引用為「見 2 CFR 200」而沒有其他內容

同一個底層計畫——例如 SBIR 第一階段徵求——可能在 SBIR.gov 上是機器可讀的,同時又以該資助機構自己網站上 40 頁的 PDF 形式存在,包含額外、非重複的資格細節,而這些細節在 SBIR.gov 上完全沒有。沒有單一的「標準」版本可以依賴。你需要兩者,並加以調和。

這是核心資料工程問題:你不是在解析一種格式,而是要維護解析器來處理一組開放式、不斷增長、沒有共同規格的格式。

資格條件:拒絕成為欄位的欄位

資格條件是整個資料集中價值最高的欄位——它是相關結果與浪費申請人時間之間的差別——但它也是最不可能以結構化資料形式存在的欄位。

當它被結構化時,你可能會得到類似這樣的內容:

json
{
“eligible_applicant_types”: [“small_business”, “nonprofit”],
“naics_codes”: [“541511”, “541512”]
}

當它不是(大多數情況都是如此)時,你會得到這樣的文字:

“Applications will be accepted from small business concerns as defined in 13 CFR 121.201 that are majority-owned by U.S. citizens or permanent residents, provided the applicant has not received more than one prior Phase II award under this topic in the preceding three fiscal years.”

那句話至少包含四個不同的、可分別檢查的限制條件,透過編號交叉引用外部法規,並使用只有在你已經解析過 13 CFR 121.201 的情況下才能解析成具體規則的措辭(「small business concerns as defined in…」)。要可靠地萃取這類內容,意味著要將用於知名法規用語的規則基礎模式匹配,與用於其他一切的 LLM 輔助萃取結合起來,然後將低信心的萃取標記出來供人工審核,而不是默默猜測。將這當作普通的 NLP 實體萃取任務是低估了它——一半的工作在於知道一句話隱含指向哪些外部法規。

截止日期:小欄位,巨大的失敗成本

在資助記錄的每個欄位中,截止日期如果出錯會造成最大的損害,而且出奇地難以正確取得。有幾個原因:

它們以不相容的格式出現。「Rolling」、「Q3 2026」、「the 15th of each month」、「45 days after LOI acceptance」、「no later than 5:00 PM ET on the due date」,以及純 ISO 日期,都會在不同來源中針對同一類型計畫出現。

它們比你預期的更常是相對而非絕對的。「60 days from opportunity posting」只有在你正確捕捉到張貼日期時才能解析成真實日期——而該日期本身可能已被默默更新。計畫會被修訂,而修訂有時會改變所有下游截止日期,卻沒有明確的變更記錄。

時區和截止時間通常是缺失的。「Due August 15」如果沒有時區,在美國各地會有最多三小時的模糊性,而聯邦截止日期通常被嚴格解釋——因為你推斷的是東部時間而不是入口網站自己的伺服器時間,導致錯過提交入口網站的截止時間幾分鐘,是使用者不會原諒的那種失敗。

過時的重發很常見。一個計畫頁面被重新抓取,文字與去年的週期 99% 相同,但截止日期欄位是唯一改變的那一行。如果你的差異比對邏輯沒有特別針對截止日期進行調整,這正是那種通用「頁面是否改變」檢查可能錯過或誤判的改變類型。

對我們有效的解決方法:將截止日期萃取視為獨立子系統,而不是一般頁面解析的副作用。解析成結構化的 (date, time, timezone, confidence, relative_basis) 元組,總是將原始措辭與解析值一起保留,而且永遠不要在沒有同時顯示原始文字的情況下向使用者呈現標準化日期。當解析信心低時,顯示原始文字而不是猜測的日期——看起來錯誤的猜測比誠實的「無法解析」更糟。

建立標準化層

在實務中表現良好的模式:

特定格式的萃取,而非單一通用解析器。HTML 表格、PDF 和 API 回應需要不同的萃取策略,然後饋入相同的目標架構——不要試圖強迫一個解析器處理所有輸入形狀。
一切都對應到的標準架構。申請人類型、資助金額範圍、產業/NAICS、截止日期(結構化)以及地理位置,無論來源格式為何。
每個欄位的信心分數,而不是每個記錄。一個記錄可能有非常可靠的截止日期和垃圾的資格條件萃取。將它們混合成單一的記錄層級信心分數,會丟棄你需要用來知道該雙重檢查什麼的資訊。
在每個標準化值旁邊保留來源文字。每個結構化欄位都帶有其原始措辭。這同時是你的除錯工具、稽核軌跡,以及信心低時的後備使用者介面。
以針對高價值欄位的差異比對進行重新抓取。將截止日期和資格條件變更視為比頁面外觀變更更高優先的差異,因為這些是最可能默默改變、且錯過時成本最高的欄位。
真正的教訓

人們很容易把截止日期當作已解決的問題——日期就是日期,對吧?實際上,一個截止日期欄位的可信度,只取決於餵給它的最混亂來源,而政府資助資料無非就是混亂的來源。讓「deadline: August 15」可靠地代表申請人需要它代表的意義,需要一個專用的解析子系統,而不是一個 regex 和祈禱。把它當作它所是的重大欄位來對待,因為弄錯它不僅會損壞一筆記錄——它會讓某人失去一個真正的機會。

https://dev.to/fundnai/the-hidden-reason-government-funding-data-is-so-hard-to-trust-4g09

https://www.worldprogramming.org/posts/the-hidden-reason-government-funding-data-is-so-hard-to-trust-ygftu4