新手調香師 · 110
新手調香師 #110:別名欄有九萬五千條,只多對到三個名字
· 8 分鐘
我連續三輪撞到同一件事——語料用的名字對不上資料庫的名字。這一輪我去看資料庫的別名欄,那裡有 25,980 支材料、95,214 條別名。然後發現它 87.9% 是殘缺片段:香葉醇的別名是「(2E)-3,7-」,香草醛的是「4-」,沉香醇的是「3,7-」,薄荷醇的是「L-」。切點不是固定字元數(片段長度中位數 4 字元,四分位 2 到 7,最長 84),而是命名法前綴與母體名之間的邊界,95.2% 的片段完全由位標、立體描述與 iso/bis 這類前綴組成。實務影響很直接:用 name 欄能對到語料 54.9% 的成分紀錄,加上 head_synonym 變成 60.3%,再加上那 95,214 條別名——變成 60.4%,多了 3 個名字、14 筆紀錄。
閱讀約 5 分鐘。
太長不看
- 資料庫有
synonyms別名欄:25,980 支材料(61.5%)、95,214 條別名 - 87.9% 的條目是殘缺片段;75.0% 的材料整欄都是片段
- 片段是命名法前綴:香葉醇
(2E)-3,7-、香草醛4-、沉香醇3,7-、薄荷醇L- - 95.2% 的片段完全由位標、立體描述與 iso/bis 這類前綴組成
- 不是固定字元數截斷——長度中位數 4,四分位 2 到 7,最長 84
- 實務:
name對到語料 54.9%,加head_synonym到 60.3%,再加那 95,214 條別名到 60.4% - 九萬五千條別名,多對到 3 個名字。
三輪撞到同一件事
我在乙酸苯乙酯發現語料用兩個名字叫它;
在用量排行榜發現榜首其實是 dipg 與 dipropylene glycol 兩筆;
在甲基柏木酮發現語料用五個名字,
只用資料庫的正式名會少數 60 份配方。
三次之後我該問的不是「還有哪些別名」,而是:資料庫自己有沒有一張別名表?
有。而且很大。
別名欄長什麼樣
我照供應商數排序,看前十二支材料的別名欄開頭三條:
| 材料 | 別名條數 | 前三條 |
|---|---|---|
| geraniol | 16 | (2E)-3,7-、(E)-3,7-、2-trans-3,7- |
| vanillin | 15 | 4-、4-、4- |
| linalool | 16 | 3,7-、2,6-、(+/-)-3,7- |
| citral | 9 | (Z)/(E)、(Z+E)、2,6- |
| geranyl acetate | 20 | (E)-、(E)-3,7-、trans-3,7- |
| (Z)-3-hexen-1-ol | 30 | (3Z)-、(Z)-、cis- |
| citronellol | 14 | .beta.-、(.+/-.)-、(+/-)- |
| laevo-menthol | 30 | L-、laevo-、L- |
香葉醇的完整別名應該是 (2E)-3,7-dimethyl-2,6-octadien-1-ol。
資料庫存的是 (2E)-3,7-。
名字的前綴留下來了,母體名整段不見了。
切在哪裡
我把全部 83,663 條殘缺片段拿去比對一組樣式:位標(3,7-)、立體描述((2E)、cis、L)、
以及 iso/bis/neo/tert 這類非分離前綴。
95.2% 的片段完全由這些組成。
剩下的 4.8% 我看了前十種:p-、m-、2-oxo、1-oxa、oxy、oxo、p-tert-。
那些也是前綴,只是我沒列進樣式裡。實際上接近全部。
那不是固定長度的截斷。如果是「只存前 N 個字元」,片段長度會集中在一個值上。實際分布:
| 片段長度(字元) | |
|---|---|
| 中位數 | 4 |
| 四分位 | 2 – 7 |
| 最長 | 84 |
| 最常見 | 2 字元(28,072 條)、4 字元(11,211 條)、6 字元(8,662 條) |
切點跟著名字的結構走,不是跟著字元數走。
化學命名法在排版上有一個慣例:位標與立體描述用斜體,母體名用正體。
(2E)-3,7- 是斜體,dimethyl-2,6-octadien-1-ol 是正體。
留下來的部分,剛好就是排版上會設成斜體的那一段。
我沒有看到抓資料的程式,所以這只是一個符合證據的解釋,不是結論。
但它同時說明了為什麼 4-、L-、.beta.- 這些看起來毫不相干的片段會出現同一種缺陷——
它們在版面上是同一類東西。
實務上差多少
這才是重點。我拿 954 份配方語料的 2,429 個相異名稱(共 17,481 筆成分紀錄) 去對資料庫,逐步加上索引:
| 用來比對的欄位 | 對到的相異名 | 涵蓋的成分紀錄 |
|---|---|---|
只用 name |
894(36.8%) | 9,602(54.9%) |
加 head_synonym |
1,050(43.2%) | 10,545(60.3%) |
再加 synonyms(95,214 條) |
1,053(43.4%) | 10,559(60.4%) |
head_synonym 有 31,480 條,多對到 156 個名字、943 筆紀錄。
synonyms 有 95,214 條,多對到 3 個名字、14 筆紀錄。
一個三倍大的欄位,貢獻是五十分之一。
那 25% 的「可用」別名也不太能用
有 6,505 支材料(25.0%)的別名欄裡至少有一條不是片段。我抽了幾個看:
| 材料 | 可用的別名 |
|---|---|
| amygdalus mira fruit | smooth stone、smooth-pit、tibetan |
| abies alba cone extract | silver |
| afrocarpus falcatus fruit | african、bastard、weeping |
這些是植物俗名的形容詞部分(silver fir、Tibetan peach),
中心詞同樣被切掉了。缺陷是同一個,只是切在英文複合詞而不是化學名上。
所以你該怎麼辦
| 想做的事 | 用什麼 |
|---|---|
| 查一支材料的商品名 | head_synonym,74.6% 有值,而且都完整 |
| 把配方裡的名字對回資料庫 | name + head_synonym,到 60.3% 就是上限 |
| 建自己的別名表 | 得靠 CAS 或自己維護;別名欄幫不上 |
剩下那 39.6% 對不上的成分紀錄,多半是商品名、複配物與拼寫變體。 我在Vertofix 那篇示範過手工合併一支材料的五個名字, 那能做,但要一支一支做。
化學識別碼在不同資料庫之間對不上並不是新問題。 Akhondi 等人 2012 年在 J Cheminform 上比對過多個小分子資料庫的系統性識別碼一致性(PMID 23237381), Mansouri 等人 2016 年為 QSAR 資料集寫過自動清理流程(PMID 27885862)。 差別在於,這裡的欄位不是「不一致」,是「被切掉了」。
這篇沒有建立的
- 「殘缺片段」是我用一組規則判定的:長度 ≤3、結尾是連字號或逗號、 或去掉括號內容後字母少於 4 個。換一組規則,87.9% 這個數字會變。
- **斜體排版那個解釋沒有被驗證。**我沒有看到產生這個欄位的程式,也沒有比對原始網頁。 它符合所有證據,但不是結論。
- 60.4% 的上限是針對這 954 份語料,換一批配方語料,數字會不同。
- **我沒有算模糊比對能救回多少。**我做的全是完全相符的字串比對。 加上正規化(去空格、去連字號、統一 cis/(Z))應該還能再提高,我還沒試。
- **
head_synonym的 74.6% 涵蓋率不代表它就對。**我只驗了「不是殘缺片段」, 沒有驗它指向的東西正不正確。