前言
搜索團(tuán)隊(duì)正好需要計(jì)算一些詞匯的相似性,這個(gè)用Word2Vec是很方便的。于是我立馬安排算法團(tuán)隊(duì)幫個(gè)忙弄下。但回頭想想,因?yàn)檫@么點(diǎn)事,打斷了算法手頭的工作,這簡(jiǎn)直不能忍。
由于我司內(nèi)部已經(jīng)在使用基于StreamingPro的Skone平臺(tái),通過(guò)對(duì)SQL做enhance,已經(jīng)能實(shí)現(xiàn)類似hive的腳本引擎了。如果上面的word2vec能直接也用類似sql的語(yǔ)言完成,那開發(fā)只要打開web,寫幾條SQL就自己完成了。
這個(gè)時(shí)候就給自己定了個(gè)目標(biāo):簡(jiǎn)單的算法,研發(fā)可以通過(guò)這個(gè)feature自己完成,盡可能減少對(duì)正在做攻關(guān)的算法團(tuán)隊(duì)的打攪。
使用演示
詳細(xì)實(shí)現(xiàn)代碼參看xql-dsl 分支。首先我們需要啟動(dòng)StreamingPro作為一個(gè)sql server ,如何啟動(dòng)
現(xiàn)在你可以通過(guò)rest接口提交SQL腳本給該服務(wù)了。
首先,我們加載一個(gè)csv文件:
load csv.`/tmp/test.csv` options header="True" as ct;
csv內(nèi)容如下:
body
a b c
a d m
j d c
a b c
b b c
這個(gè)csv文件被映射為表名ct。只有一個(gè)字段body。現(xiàn)在我們需要對(duì)body字段進(jìn)行切分,這個(gè)也可以通過(guò)sql來(lái)完成:
select split(body," ") as words from ct as new_ct;
新表叫new_ct,現(xiàn)在,可以開始訓(xùn)練了,把new_ct喂給word2vec即可:
train new_ct as word2vec.`/tmp/w2v_model` where inputCol="words";
word2vec表示算法名, /tmp/w2v_model 則表示把訓(xùn)練好的模型放在哪。where 后面是模型參數(shù)。
最后,我們注冊(cè)一個(gè)sql函數(shù):
register word2vec.`/tmp/w2v_model` as w2v_predict;
其中w2v_predict是自定義函數(shù)名。這樣,我們?cè)趕ql里就可以用這個(gè)函數(shù)了。我們來(lái)用一把:
select words[0] as w, w2v_predict(words[0]) as v from new_ct as result;
給一個(gè)詞,就可以拿到這個(gè)詞的向量了。
我們把它保存成json格式作為結(jié)果:
save result as csv.`/tmp/result`;
結(jié)果是這樣的:
最后完整的腳本如下:
load csv.`/tmp/test.csv` options header="True" as ct;
select split(body," ") as words from ct as new_ct;
train new_ct as word2vec.`/tmp/w2v_model` where inputCol="words";
register word2vec.`/tmp/w2v_model` as w2v_predict;
select words[0] as w, w2v_predict(words[0]) as v from new_ct as result;
save overwrite result as json.`/tmp/result`;
大家可以用postman測(cè)試:

支持算法(不斷更新)
- NaiveBayes
- RandomForest
- GBTRegressor
- LDA
- KMeans
- FPGrowth
- GBTs
- LSVM
總結(jié)
通過(guò)將機(jī)器學(xué)習(xí)算法SQL腳本化,很好的銜接了數(shù)據(jù)處理和訓(xùn)練,預(yù)測(cè)。同時(shí)服務(wù)化很好的解決了環(huán)境依賴問(wèn)題。當(dāng)然終究是沒(méi)法取代寫代碼,但是簡(jiǎn)單的任務(wù)就可以用簡(jiǎn)單的方式解決了。