iT邦幫忙

2026 iThome 鐵人賽

DAY 14
0

昨天說 43 個 DOI 幾秒鐘驗完。今天把那段程式攤開。

核心就三步

第一步,把 DOI 從全文抽出來。 一條正規表示式就夠:

import re
dois = re.findall(r'10\.\d{4,9}/[-._;()/:a-zA-Z0-9]+', full_text)

DOI 的格式很規律:10. 開頭、四到九位數字、斜線、後綴。大多數格式的報告都撈得出來,不需要報告配合你的格式(字元集合刻意收緊過:太寬的話,DOI 後面緊貼的中文句號、引號會被一起吞進去,害真 DOI 被誤判成查無)。

第二步,逐條打 Crossref 的公開 API。

import requests
r = requests.get(f'https://api.crossref.org/works/{doi}')

免費、免金鑰。查得到就回這篇文獻的正式資料:標題、作者、年份、期刊。

第三步,拿回傳資料跟報告裡寫的比。標題對不對得上、第一作者姓氏一不一致、年份差多少。程式只做粗比對,可疑的標記出來,人再看。

全部合起來長這樣。這是我們實際在用的縮水版;趕時間可以跳過這一段,這篇真正的重點在後面的三個取捨:

import re, sys, requests

text = open(sys.argv[1], encoding="utf-8").read()
for doi in set(re.findall(r'10\.\d{4,9}/[-._;()/:a-zA-Z0-9]+', text)):
    doi = doi.rstrip('.,;')
    try:
        r = requests.get(f'https://api.crossref.org/works/{doi}', timeout=15)
    except requests.RequestException as e:
        print(f'⚠️ 連線失敗 {doi}({e})— 這條沒驗到,不是沒問題')
        continue
    if r.status_code != 200:
        print(f'❓ 查無 {doi}(換管道人工查,別直接判假)')
        continue
    w = r.json()['message']
    title = (w.get('title') or ['(無標題)'])[0]
    year = (w.get('issued', {}).get('date-parts') or [[None]])[0][0]
    author = (w.get('author') or [{}])[0].get('family', '?')
    print(f'✅ {doi}\n   ↳ {author} ({year}):{title[:60]}')

輸出印出每個 DOI 官方登記的作者、年份、標題,你拿著它跟報告逐條對——比對不符的才是紅燈。含空行不到二十行。

設計上的幾個取捨

比對寬鬆一點,標記嚴格一點。標題比對用「報告寫的標題有沒有整段出現在官方標題裡」這種粗糙邏輯就好。因為目的不是自動判生死,是把 43 條裡可疑的那五六條挑出來給人看。工具負責縮小範圍,人負責裁決——這個分工下,誤報幾條沒關係,漏報才要命。

查無此文不等於假。昨天講過,Crossref 不收 arXiv,部分老 ACM 文獻也查不到。所以程式的輸出分三類:比對相符、查無(要換管道人工查)、比對不符(紅燈,優先處理)。真正的張冠李戴都在第三類。

它防不住的東西要心裡有數。這個檢查驗的是「DOI 指向的文獻」跟「報告宣稱的文獻」是不是同一篇。它防不住:引用真實存在的文獻但曲解其結論(下一篇講)、該引而未引、以及沒附 DOI 的引用。它是一道閘,不是全部的防線。

為什麼值得為此寫程式

有人會說:引用有沒有問題,仔細讀就看得出來。

這次的實測結果恰好否定了這句話。錯得最兇的那份報告,正是四份裡讀起來最可信的。假引用的每個零件都是真的——真的作者、真的期刊、格式漂亮的 DOI,只有組合是假的。人眼驗證組合的成本極高,程式驗證組合的成本趨近於零。

這正是該寫程式的場景:人擅長判斷內容,程式擅長核對事實。把核對交給程式,把判斷留給人。

通用的習慣

現在我們的規矩是:任何要送出去的稿子,只要有文獻引用,送出前跑一次。幾秒鐘,擋的是最貴的那種事故。

這個模式可以往外推。凡是 AI 產出裡「可以跟權威來源逐條核對」的部分,引用對 Crossref、法條對法規資料庫、統計數字對原始報表,都值得寫個小工具自動對。AI 生產內容的速度是人的十倍,驗證跟不上,速度就是負債。

明天講程式驗不了的那種錯:引用是真的,結論是反的。


上一篇
Day 19|四位隊友同做文獻研究,DOI 造假率差很大
下一篇
Day 21|純文字審查抓不到「跟外部真相打架」
系列文
一個人的 AI 團隊:Claude Code 當組長,帶四家引擎做教學工作的實測與踩坑30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言