新手調香師 · 105
有 14 筆紀錄的分子量欄裝的是「只算碳原子」的質量,而我是因為錯誤重複才找到的
· 5 分鐘
上一篇用 logP 對分子量抓到一筆錯,這篇把那個手法做完整:從分子式直接算分子量,跟欄位對。20,626 筆可解析的紀錄裡,只有 22 筆差超過 1%——99.89% 一致,是我量過最乾淨的一對欄位。而那 22 筆有一個模式:180.16 出現三次、228.21 兩次、252.23 兩次、276.25 兩次,而它們的分子式完全不同。共同點是碳數:那三筆 180.16 全部是 C15,兩筆 228.21 全部是 C19。而 C15 × 12.011 = 180.165、C19 × 12.011 = 228.209。這 14 筆的分子量欄裝的是分子式裡碳原子的總質量,氫與氧被丟掉了。
閱讀約 4 分鐘。
上一篇我用 logP 對分子量抓到一筆錯,並說那是「跨欄位」的檢查。這篇把那個手法做到底。
從分子式算分子量
分子量不是一個需要相信的數字——**它可以從分子式算出來。**每個元素的原子量是常數,加起來就是。
20,626 筆同時有分子式與分子量、而且分子式可以解析的紀錄裡,算出來與欄位差超過 1% 的只有 22 筆——0.11%。
99.89% 一致。這是我量過最乾淨的一對欄位。
(對照組:純度欄有 83.7% 是同一個預設值、閃點有 794 筆講反話。這一對沒有那些問題。)
但那 22 筆有一個模式
我原本要一筆一筆看,然後注意到欄位裡的錯值重複了:
| 欄位寫的分子量 | 出現次數 | 那幾筆的分子式 |
|---|---|---|
| 180.16 | 3 | C15vH18vO3、C15H26O、C15H 24 |
| 228.21 | 2 | C19H28O2、C19H31NO3 |
| 252.23 | 2 | C21H32O2、C21H22O12 |
| 276.25 | 2 | C23H42O4、C23bH48bO6 |
每一組的分子式完全不同,但碳數一樣。
而碳的原子量是 12.011。
| 碳數 | × 12.011 | 欄位寫的 |
|---|---|---|
| C15 | 180.165 | 180.16 |
| C19 | 228.209 | 228.21 |
| C21 | 252.231 | 252.23 |
| C23 | 276.253 | 276.25 |
那個欄位裝的是分子式裡碳原子的總質量。氫、氧、氮全部被丟掉了。
逐一驗證之後,22 筆裡有 14 筆完全符合這個簽名——包括 C54 的 648.59、C30 的 360.33、C22 的 264.24、C20 的 240.22、C7 的 84.08。
為什麼會這樣
線索在分子式欄本身。看那幾筆:
C15vH18vO3C23bH48bO6C15H 24C1 8H25 N O8
碳數後面多了一個雜字元。C15v、C23b、C15H 後面一個空格。
最可能的解釋是:解析分子式的程式在那個雜字元停下來,只算完了第一個元素,然後把結果寫進分子量欄。
但這個解釋不完整——6-epi-beta-bisabolol 的分子式是乾淨的 C15H26O,而它的分子量還是 180.16。所以髒字元是原因之一,不是全部。
剩下的 8 筆不符合這個簽名
它們的錯法各不相同(碘丙炔基丁基胺甲酸酯寫 154.19 而正確是 281.09;哈爾滿醇寫 170.23 而正確是 200.24)——看起來是散落的個別錯誤,不是同一個 bug。
這個對比本身就是重點。
這篇真正的方法論
一個重複出現的錯值,跟一堆各不相同的錯值,是兩種完全不同的東西。
- 散落的獨特錯值=打錯字。一筆一筆修。
- 重複的同一個錯值=有一個程式在做同一件錯事。修那個程式,一次修掉全部。
**我是先看到「180.16 出現三次」才去找原因的。**如果那 14 筆各錯各的,我大概只會記下「有 22 筆不符」然後跳過。
所以檢查資料的時候,不要只數錯誤的個數,要看錯誤的分布。
而這個 bug 不影響任何人
我查了那 14 筆的供應商數。
全部是 0。
這個 bug 只發生在沒有人賣的紀錄上——那又是同一個模式,我在純度欄與閃點欄都量過:這個資料庫對「商品」與對「條目」的處理品質是兩回事。
(那 22 筆裡供應商最多的是碘丙炔基丁基胺甲酸酯的 6 家,而它不屬於碳質量那一類。)
實務上
- **分子量可以驗,而且應該驗。**一個
GROUP BY加一張原子量表就夠了。 - **錯值重複出現時,先算算看它等於什麼。**180.16 不是隨機的數字。
- **這一對欄位可以信任。**99.89%,而剩下的 0.11% 集中在沒人買的紀錄上。
- 分子式欄有 42 筆帶著非字母數字的雜字元(像
Al Ca Na O4 Si +2),那些解析不了但不一定是錯的。
這篇沒有建立的
- 我用的原子量表只涵蓋 32 個常見元素,含其他元素的分子式被跳過(95 筆)。
- **1% 的門檻是我定的。**同位素、水合物、鹽類的計算方式差異可能造成小於 1% 的合理偏差,而我沒有處理那些。
- 「解析程式在雜字元停下來」是推論,我沒有看過那個資料庫的產生程式。而且它解釋不了乾淨分子式的那幾筆。
- 剩下 8 筆我沒有找出它們的錯法,只確認它們不符合碳質量的簽名。
- **99.89% 是「兩欄互相一致」,不是「兩欄都對」。**如果分子式本身錯了,這個檢查抓不到。
- 這是 2026 年 9 月的快照。