新手調香師 · 111
新手調香師 #111:一個括號值兩千筆——名稱正規化哪一步真的有用
· 10 分鐘
上一篇我說「加上正規化應該還能再提高,我還沒試」。這一篇是試的結果。我把名稱正規化拆成四層,逐層量它救回多少筆配方紀錄。去掉標點與空白、統一 cis 與 (Z) 這些立體描述,加起來只多對到 147 筆;剝掉「50% in DPG」這類稀釋標示只多 16 筆。而剝掉資料庫名稱結尾的品牌括號——(IFF)、(Firmenich)、(Givaudan)——多對到 2,003 筆,是前面全部加起來的十倍以上。因為資料庫存的是「hedione (Firmenich)」,配方師寫的是「hedione」,而那一個名字就佔 165 份配方。解析率從 60.32% 推到 72.81%。但括號不能無腦剝:全庫 1,096 筆結尾帶括號的名稱裡,有 26 筆是「(mixture of isomers)」、22 筆是「(salt)」,那些剝掉會把不同的東西併在一起。
閱讀約 5 分鐘。
太長不看
- 名稱正規化拆成四層,逐層量它多救回多少筆配方紀錄:
| 步驟 | 對到的名稱 | 涵蓋紀錄 | 邊際增益 |
|---|---|---|---|
| ① 完全相符(基準) | 1,050 | 10,545(60.32%) | — |
| ② 去標點空白 + 統一立體描述 | 1,106 | 10,692(61.16%) | +147 |
③ 剝稀釋標示(50% in DPG) |
1,117 | 10,708(61.26%) | +16 |
④ 剝品牌括號((IFF)) |
1,382 | 12,711(72.71%) | +2,003 |
- 第四步的增益是前三步加起來的十倍以上
- 因為資料庫存
hedione (Firmenich),配方師寫hedione——那一個名字佔 165 份配方 - 但括號不能無腦剝:全庫 1,096 筆結尾帶括號裡,有
(mixture of isomers)、(salt)、(whole plant)
上一篇留下的作業
我上一輪查了資料庫的別名欄, 發現 95,214 條別名只多對到 3 個名字,因為 87.9% 是殘缺片段。
那篇結尾我在「這篇沒有建立的」裡寫了一句:
我沒有算模糊比對能救回多少。我做的全是完全相符的字串比對。 加上正規化(去空格、去連字號、統一 cis/(Z))應該還能再提高,我還沒試。
這一篇就是試的結果。而結果跟我當時的猜測不一樣。我列出來的那三種正規化,正好是最沒用的三種。
四層各值多少
我把 954 份語料的 2,429 個相異名稱拿去對資料庫的 name 與 head_synonym,
一層一層加上正規化:
② 去標點空白、統一立體描述:+147 筆
新對上的長這樣:
| 語料寫 | 資料庫寫 |
|---|---|
dihydro myrcenol |
dihydromyrcenol |
camphor |
(±)-camphor |
allyl alpha-ionone |
allyl-alpha-ionone |
dihydro beta ionone |
dihydro-beta-ionone |
**一個空格、一個連字號、一個 (±)。**這些確實會擋住比對,但它們只影響 147 筆。
③ 剝稀釋標示:+16 筆
| 語料寫 | 資料庫寫 |
|---|---|
maltol 5% in phenethyl alcohol |
maltol |
oakmoss absolute 50% in benzyl benzoate |
oakmoss absolute |
geraniol 980 |
geraniol |
我原本以為這一類很多——配方裡到處都是稀釋液。 實際上語料多半在成分名之外另外記濃度,不會寫進名字裡。16 筆。
④ 剝品牌括號:+2,003 筆
這是唯一真正有用的一步。
| 語料寫 | 資料庫寫 | 語料出現次數 |
|---|---|---|
hedione |
hedione (Firmenich) |
165 |
iso e super |
iso e super (IFF) |
104 |
galaxolide 50 ipm |
galaxolide 50 IPM (IFF) |
82 |
triplal |
triplal (IFF) |
63 |
lyral |
lyral (IFF) |
50 |
vertofix |
vertofix (IFF) |
50 |
這六個名字加起來就是 514 筆。
而它們是誰?Hedione、Iso E Super、Galaxolide、Lyral,現代香水最常用的幾支合成料。 資料庫把製造商標在名字後面,配方師不會寫那個括號。一個括號,把整個現代調香的骨幹擋在門外。
全庫 name 或 head_synonym 結尾帶括號的有 1,096 筆,最常見的:
| 括號內容 | 筆數 |
|---|---|
(iff) |
168 |
(givaudan) |
100 |
(symrise) |
69 |
(firmenich) |
53 |
(bedoukian) |
16 |
(takasago) |
11 |
但不能無腦剝
同樣那 1,096 筆裡,有一些括號不是品牌:
| 括號內容 | 筆數 |
|---|---|
(mixture of isomers) |
26 |
(fixed) |
24 |
(salt) |
22 |
(mixed isomers) |
15 |
(whole plant) |
14 |
(salt) 是鹽類,跟游離酸是不同的東西。(mixture of isomers) 跟單一異構物不是同一支。
(whole plant) 跟根部萃取物不是同一支。
把這些剝掉會把不同的材料併成一支,那比對不上更糟。
所以正確的做法是列一張製造商白名單去剝,不是剝掉所有括號。 我用的白名單只有十二個名字(IFF、Givaudan、Firmenich、Symrise、Takasago、Bedoukian 等)。
我上一篇有一句話說得不夠準
在甲基柏木酮那篇我寫:語料用五個名字叫它,
「只用資料庫的正式名 methyl cedryl ketone 會少 60 份配方」。
那句話本身沒錯,但我讓它聽起來像是無解的。實際上資料庫的 head_synonym 欄就寫著 vertofix (IFF),
剝掉一個括號,那 50 份 vertofix 立刻對上。
真正需要手工的只有 acetyl cedrene(7 份)那一種寫法。難的部分比我當時說的小。
剩下的 27.19% 是什麼
推到 72.81% 之後還有 1,044 個名稱、4,753 筆紀錄對不上。它們有幾種清楚的類型:
| 類型 | 例子 | 語料次數 |
|---|---|---|
| 縮寫 | dipg(dipropylene glycol) |
445 |
| 舊式醛編號 | aldehyde c-14、aldehyde c-10、aldehyde c-12 mna |
64 / 64 / 60 |
| 俗名骨架不同 | cis-3-hexenol vs 資料庫的 (Z)-3-hexen-1-ol |
100 |
| 加了修飾語的天然油 | bergamot oil bergaptene reduced、ylang ylang oil |
132 / 113 |
| 拼寫變體 | styrallyl acetate(資料庫是 styralyl acetate) |
78 |
醛的 C 編號是最頑固的一類。aldehyde c-10 是壬醛還是癸醛,
aldehyde c-12 mna 跟 aldehyde c-12 lauric 是兩支完全不同的材料共用一個代號。
那套編號是二十世紀初的商業慣例,跟化學結構沒有一對一的關係。
沒有任何字串正規化救得了它,只能查對照表。
你可以直接用的規則
如果你要把自己的配方清單對回這個資料庫:
- 先剝製造商括號(白名單,不要剝所有括號)——這一步值 11.5 個百分點
- 去掉空白與連字號,統一
cis/(Z)、alpha/a——值 0.8 個百分點 - 剝
N% in 溶劑的尾巴——值 0.1 個百分點 - 剩下的手工處理,優先處理縮寫與 C 編號
第 1 步就佔了全部增益的 92%。先做那一步,其餘的視情況。
這篇沒有建立的
- **我沒有驗證新對上的 2,003 筆全都正確。**我看了頻次最高的六個,它們是對的。 剩下的我用的是「白名單括號」這個規則,沒有逐筆檢查。
- **白名單是我手打的十二個製造商。**漏掉的製造商會讓數字偏低。
- 72.81% 是這 954 份語料的數字,換一批配方會不同。
- **我沒有做編輯距離之類的真模糊比對。**這裡全部都是先正規化、再完全相符。 真的模糊比對能再推高多少,我還是沒試——但它會帶進偽陽性,得先想好怎麼驗。
- **C 編號對照表我沒有建。**我只確認了它是個問題(
aldehyde c-12有兩支不同材料共用), 沒有去解決它。 - 化學名稱的比對本來就是一個有專門文獻的問題。 Krallinger 等人 2015 年在 J Cheminform 上發表過 CHEMDNER 語料與它的標註原則(PMID 25810773), Akhondi 等人 2012 年比對過多個資料庫間識別碼的一致性(PMID 23237381)。 我這裡做的是四條規則,不是那個層級的工作。