天天看點

用ChatGPT提取PDF中的結構化資料

作者:新缸中之腦

我将大量文本文檔(如 PDF)轉換為電子表格。 這是一項乏味且昂貴的工作。 是以,每次人工智能技術的新疊代出現時,我想知道它是否能夠滿足許多人的要求:t送出 PDF,請求電子表格。 在 OpenAI 的 ChatGPT 上抛出幾個程式設計問題并獲得可行的結果後,我想知道我們是否終于成功了。

用ChatGPT提取PDF中的結構化資料
推薦:用 NSDT場景設計器 快速搭建3D場景。

當 OpenAI 的 GPT-3 是熱門新事物時,我看到蒙特利爾記者 Roberto Rocha 嘗試進行類似的測試。 結果平淡無奇,但 OpenAI 的最新模型 ChatGPT 有幾項改進,使其更适合提取:它比 GPT-3 大 10 倍,是以通常更連貫,它經過訓練可以明确遵循指令,并且它了解 程式設計語言。

為了測試 ChatGPT 從 PDF 中提取結構化資料的能力,我編寫了一個 Python 腳本(我将在最後分享!)将兩個文檔集轉換為電子表格:

  • New York洩露的通知單, 7,000 頁 PDF。 有五種不同的形式,糟糕的 OCR 和一些自由格式的字母混合在一起。
  • 來自警方内部調查的 1,400 份備忘錄。 這些是完全非結構化的,包含電子郵件和文檔掃描。 超級亂。

我的總體政策如下:

  • 重做 OCR,盡可能使用最高品質的工具。 這一點非常重要,因為 ChatGPT 拒絕處理品質不佳的 OCR 文本。
  • 盡我所能清理資料,維護實體布局并删除垃圾字元和樣闆文本。
  • 将檔案分成單獨的記錄。
  • 要求 ChatGPT 将每條記錄轉換為 JSON。

我花了大約一周的時間來熟悉這兩個資料集并進行所有這些預處理。 完成後,讓 ChatGPT 将一段文本轉換為 JSON 非常容易。 你可以粘貼一條記錄并說“傳回此的 JSON 表示”,它就會執行。 但是對多條記錄執行此操作是一個壞主意,因為 ChatGPT 将使用從文本中随機選擇的字段名稱來發明自己的模式。 它還将決定自己解析值的方式。 例如,位址有時會以字元串結尾,有時會以 JSON 對象或數組結尾,位址的組成部分會分開。

提示詞設計是獲得一緻結果的最重要因素,你的語言選擇也會産生巨大差異。 一個小技巧:找出 ChatGPT 在提到一項任務時使用的措辭并模仿它。 (如果你還不知道,你可以随時問:“請解釋你如何使用 _____________。”)

因為 ChatGPT 了解代碼,是以我設計了我的提示來詢問符合給定 JSON 模式的 JSON。 這是我的提示:

```
Text document goes here, truncated if longer than 4000 chars
```

For the given text, can you provide a JSON representation that strictly follows this schema:

```
{
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "descriptive name of field here": { "type": "data type here" },
        ...
      }
}
```           

我嘗試從每個響應中提取一個 JSON 對象,并對它運作一些驗證檢查。 有兩項檢查特别重要:1) 確定 JSON 完整,沒有被截斷或損壞,以及 2) 確定鍵和值與模式比對。 如果驗證檢查失敗,我會重試,通常我會在第二次或第三次嘗試時得到有效的 JSON。 如果它繼續失敗,我會記下來并跳過記錄。 有些記錄 ChatGPT 就是不喜歡。

提取結果

令人印象深刻的是,ChatGPT 建構了一個非常有用的資料集。 乍一看,我甚至以為我有一個完美提取的資料集。 但是,一旦我浏覽了頁面并比較了值,我就開始注意到錯誤。 有些名字拼錯了。 有些人完全失蹤了。 有些數字是錯誤的。

這些錯誤雖然微妙且相對不常見,但足以阻止我進行大多數資料記者想要做的基本分析。 平均值、直方圖、最小值和最大值均已出局。

但對于我的項目來說,錯誤是可以容忍的。 我想在違規資料庫中找到大玩家,是以我不在乎某些名稱是否錯誤或某些數值是否偏離零。 對于警方的資料,我基本上是在尋找一個摘要來識别某些事件和涉及的個人。 如果我錯過了什麼,那也沒關系。

總的來說,這些是 ChatGPT 引入的錯誤類型:

  • ChatGPT 産生了幻覺資料,這意味着它編造了一些東西。 通常以微妙且難以察覺的方式。 例如,它把“2222 Colony Road, Moorcroft”(注意“r”)變成了“2222 Colony Road, Mooncroft”。 “Mooncroft”(帶有“n”)這個詞沒有出現在文本中的任何地方。 ChatGPT 似乎在将殖民地和月亮這兩個詞聯系起來。 多麼古怪。
  • 它偶然發現了人們的名字并假設了性别。 有些表格有一個“稱呼”字段,這似乎導緻 ChatGPT 在不合适的時候添加稱呼(“小姐”、“先生”),甚至在給出(“博士”和“教授”)時也會省略它們。 當記錄中出現多個名稱時,它也無法使用正确的名稱,更喜歡最後一個。
  • ChatGPT 記住了以前的提示,導緻混淆。 有時它會使用早期記錄中的名稱或企業實體,盡管目前記錄的文本中出現了一個完全有效的名稱或企業實體。 例如,在一份記錄中,它使用了分别在 150 頁和 30 頁之前最後一次看到的律師和律師事務所的名稱。 這個問題迫使我確定名稱和實體确實存在于目前記錄中。
  • 它認為是拼寫錯誤的詞得到了“更正”。 通常這很有用,但有時會引入錯誤。 這對于電子郵件位址來說尤其成問題。
  • 錯誤似乎随機散布在整個資料中。 雖然某些列包含的錯誤比其他列多,但所有列的錯誤率從 1% 到 6% 以上不等。 錯誤也分散在各行中。 結合起來,這意味着我基本上需要将每一行與每條記錄進行比較以獲得完全有效的資料集——這正是我一開始就試圖避免的工作。

大型語言模型的問題現在已經得到了很好的記錄。 即使 ChatGPT 取得了巨大的進步,其中一些在我的實驗中也出現了。 試圖忽略這些問題并将 ChatGPT 衍生作品直接推給讀者将不可避免地導緻災難性的失敗。

用ChatGPT提取PDF中的結構化資料

有時,ChatGPT 隻是拒絕處理文檔并給出樣闆響應。 它回應了對警方備忘錄和紐約資料洩露資料集中幾份檔案中“敏感資訊”的擔憂,盡管它們都是公開檔案。

ChatGPT 會徹底改變資料新聞嗎?

我不這麼認為,原因有以下三個:

  • 不,出于技術原因:通過 OpenAI 的 API 使用 ChatGPT 非常緩慢。 僅從資料洩露 PDF 中提取大約 2,500 條記錄就花了将近三周的時間。 考慮到我在 ChatGPT 成為主流之前就開始了這個項目,并且能夠在實施速率限制之前使用它兩周,這一點就更加重要了。 API 也不可靠,經常出現停機和中斷,盡管這在未來可能會有所改善。
  • 不,出于經濟原因:對于 ChatGPT,我相信我們正在用一種形式的體力勞動換取另一種形式的體力勞動。 我們正在用程式設計和轉錄來換取清潔、事實核查和驗證。 因為任何行都可能不正确,是以必須檢查每個字段以建立信心。 最後,我不相信我們節省了很多工作。
  • 不,出于編輯原因:在我看來,資料幻覺和其他混淆的問題将這種方法限制在内部或面向記者的用途上。 它是比故事生成器更好的提示生成器。 将 ChatGPT 置于新聞工作流程的末尾可能會以更快的速度和數量換取更低的可信度。

總的來說,這些問題使得 ChatGPT 的大部分使用在編輯上不切實際,尤其是在規模上。 但我認為它仍然有一席之地。 對于需要将小型 PDF 轉換為表格的小型、資源不足的新聞編輯室,這可能是可行的(嘿 ChatGPT,你可以将此文本轉換為 JSON 對象數組嗎?)。

一些 PDF 也非常混亂和不統一,以至于編寫提取腳本非常耗時。 我有無數的項目因為這樣的問題而夭折。 ChatGPT 提取有可能為此類項目注入活力。

ChatGPT 提取還可以很好地用作探索工具或潛在客戶生成器,适用于錯誤和缺失值是可以容忍的用例,或者你希望在投入數周時間進行真正的清理和分析之前先了解一下資料的推測性情況。

自己試試

我在 GitHub 上提供了我的 ChatGPT 提取器腳本。 也許你有一個麻煩的資料項目,想親自嘗試一下。 或者,也許你想面對面地了解可能性和局限性。 我暗自希望有人最終破解 FCC 電視和有線政治廣告披露資料集,結束自 ProPublica 的“免費檔案”項目以來未完成的章節。

無論哪種方式,我都覺得我們會在未來一段時間内報告和使用這項技術。 熟悉任何技術的最好方法就是使用它。

原文連結:http://www.bimant.com/blog/chatgpt-information-extraction/

繼續閱讀