新手調香師 · 94
把「A to B」裡 A 大於 B 的全部撈出來:55 處,而其中 23 處藏著真的錯誤
· 7 分鐘
上一篇發現有兩筆紀錄的評測濃度寫 1000%,而濃度不可能超過 100%。那讓我想到一類完全不需要懂化學的檢查:欄位自己的形狀就能揭露錯誤。這篇跑了三種:物理上限、值域、以及最好用的一種——區間順序。純度、比重、折射率、沸點、熔點五個欄位裡共有 42,802 個「A to B」的區間,其中 55 處 A 大於 B。而它們分成兩類:32 處只是順序寫反(比值 ≤1.15,數值本身沒問題,但會弄壞任何解析程式);另外 23 處的反轉揭露了真的錯誤,其中五筆的比值正好是 10 倍——那是小數點掉了一位。
閱讀約 4 分鐘。
上一篇結尾我提到一件小事:有兩筆紀錄的評測濃度寫著 1000%,而濃度不可能超過 100%。
**那種錯誤好抓,是因為那個欄位有物理上限。**而我在想:還有哪些檢查是完全不需要懂化學的?
這篇跑了三種。
檢查一:物理上限
assay(純度)欄有 27,221 筆有值,而純度不可能超過 100%。
超過的只有一筆:氧化鋅(#42155,30 家供應商),寫著 800.00 to 100.00。
**一筆。27,221 分之一。**這個欄位乾淨得驚人。
檢查二:值域
折射率有 4,609 筆有值。液體的折射率不可能小於 1(那意味著光在其中比在真空裡跑得快),而香料材料實際上落在 1.3 到 1.6 之間。
我抓落在 1.0–1.8 之外的,得到 5 筆——其中一筆是我自己的探針錯了。
甲硫醇的折射率寫「1.43000 to 1.43600 @ 5.80 °C」,完全正常,而我的正規表示式把溫度的 5.80 也當成了數值。
**這一條值得記下來:掃全庫的時候,@ 後面的東西要先切掉。**我在材料名比對那篇也犯過類似的錯——探針本身會產生假陽性,而抓出來的東西要一筆一筆看過才算數。
檢查三:區間順序(最好用的一種)
這一種完全不需要知道欄位是什麼意思。
如果一個值寫成「A to B」,那 A 應該小於等於 B。不管 A 是純度、密度、溫度還是折射率。
五個欄位裡共有 42,802 個這種區間:
| 欄位 | 區間數 | A > B | 比例 |
|---|---|---|---|
| assay | 27,221 | 6 | 0.02% |
| specific_gravity | 4,184 | 23 | 0.55% |
| refractive_index | 4,113 | 12 | 0.29% |
| bp | 6,199 | 13 | 0.21% |
| mp | 1,085 | 1 | 0.09% |
| 合計 | 42,802 | 55 | 0.13% |
**55 處,涉及 55 筆紀錄。**而把「大的除以小的」算出來之後,它們清楚地分成兩類。
類型一:只是順序寫反(32 處)
比值 ≤1.15,也就是兩個數字本身都合理,只是寫顛倒了:
| 供應商 | 材料 | 欄位 | 值 |
|---|---|---|---|
| 107 | 杜松果油 | 比重 | 0.86900 to 0.85900 |
| 50 | 樟樹皮油 | 比重 | 0.88500 to 0.87500 |
| 26 | 捲葉巴西里葉油 | 比重 | 0.98000 to 0.94000 |
| 19 | 2-噻吩硫醇 | 比重 | 1.25000 to 1.23500 |
| 16 | 2,6-二甲基苯硫酚 | 折射率 | 1.52700 to 1.52100 |
**這一類對人無害。**你看到 0.869 到 0.859 就知道那是 0.859 到 0.869。
**但它會弄壞任何程式。**任何寫著「取第一個數當下限」的程式碼,在杜松果油這一筆上會得到一個比上限還大的下限——而那一筆有 107 家供應商,不是冷門紀錄。
類型二:反轉揭露了真的錯誤(23 處)
比值 >1.15。而這一類裡有三種可以辨認的簽名。
簽名一:小數點掉了一位(比值恰好約 10)。
| 供應商 | 材料 | 值 | 比值 |
|---|---|---|---|
| 31 | 肉桂酸異戊酯 | 0.99200 to 0.09970 | 9.9 |
| 25 | 鈴蘭醛 | 9.93000 to 1.00100 | 9.9 |
| 3 | 3-(甲硫基)丁酸甲酯 | 1.03400 to 0.10400 | 9.9 |
| 2 | 二甲基苄基原醇巴豆酸酯 | 0.99500 to 0.10030 | 9.9 |
| 4 | 2-巰基-2-甲基丙酸乙酯 | 0.96100 to 0.10810 | 8.9 |
**五筆,全部是比重欄,全部差一個十倍。**正確值應該是 0.9970、0.9930、1.0400、1.0030、1.0810。
簽名二:純度欄掉了一個零。
| 供應商 | 材料 | 值 |
|---|---|---|
| 7 | 抗壞血酸磷酸鈉 | 95.00 to 10.00 |
| 3 | 支鏈澱粉 | 90.00 to 10.00 |
| 2 | 2-(甲硫基)丙酸甲酯 | 95.00 to 10.00 |
**「95.00 to 10.00」幾乎確定是「95.00 to 100.00」。**同樣的錯誤出現三次——那不是隨機的手滑,是同一個轉錄流程的固定失誤。
(氧化鋅那筆 800.00 to 100.00 則是相反方向:多了一個零,應該是 80.00。)
簽名三:沸點欄裡混進了別的東西。
| 供應商 | 材料 | 值 |
|---|---|---|
| 36 | 薑酮 | 141.00 to 0.50 |
| 5 | 4-甲基水楊醛 | 760.00 to 223.00 |
薑酮那筆的 0.50 幾乎確定是壓力(0.50 mm Hg),只是分隔的 @ 掉了。而 4-甲基水楊醛的 760.00 就是標準大氣壓的毫米汞柱數——兩筆都是「壓力跑進了溫度的位置」。
而最大的那一筆是梨酯(46 家供應商):折射率寫 1.48000 to 1.14860。1.14860 對液體來說偏低,而 1.4860 剛好落在正確的位置。多了一個 1。(那一支我另外寫了一篇。)
這三種檢查的共同點
它們都不需要知道這個欄位在講什麼。
- 純度不能超過 100——因為那是百分比的定義
- 折射率不能小於 1——因為那是折射率的定義
- 「A to B」的 A 不能大於 B——因為那是「到」這個字的定義
我沒有查任何一支材料的正確值,也沒有比對任何外部來源,就找出了 55 個問題。
而我先前找到的苯乙酮單位錯誤(3200 ml/kg 換算後是體重的 3.3 倍)跟那兩筆 1000% 的濃度,用的是同一類推理。
如果你在做自己的原料資料表,這三條先跑一次,成本幾乎是零。
這篇沒有建立的
- **我只掃了五個欄位。**其他有區間的欄位(閃點、蒸氣壓、logP)我沒有跑完。
- 「A to B」是用正規表示式抓的,寫法不同的區間(用短橫線、用逗號)會被漏掉,所以 55 是下限。
- 正確值全部是我從比值推的,我沒有查任何供應商規格書或化學手冊確認。那些推測可能是錯的——尤其是「95.00 to 10.00 應該是 100.00」那三筆,我只是覺得那個模式很像。
- 類型一與類型二的界線(比值 1.15)是我隨手定的,換一個門檻分類會變。
- **0.13% 的錯誤率不代表這個資料庫只有 0.13% 的錯。**這一類檢查只看得到「形狀不對」的錯誤,一個寫成 0.85 到 0.87 但實際上應該是 0.95 到 0.97 的紀錄,這裡完全照不到。
- 我自己的探針產生過假陽性(把
@ 5.80 °C的溫度當成折射率),所以任何自動掃描的結果都要人工看過。