本次分享主要會介紹一下ES是如何幫咱們完成NLP的任務的。在作NLP相關任務的時候,ES的類似度算法並不足以支撐用戶的搜索,須要使用一些與語義相關的方法進行改進。可是ES的不少特性對咱們優化搜索體驗是很是有幫助的。算法
內容來源:2017年6月10日,趨勢科技我的消費者部機器學習工程師楊文俊在「Elastic Meetup 南京」進行《Elasticsearch輔助的智能客服機器人》演講分享。IT 大咖說做爲獨家視頻合做方,經主辦方和講者審閱受權發佈。
數據庫
閱讀字數:1605 | 4分鐘閱讀app
咱們主要服務的項目是MAC上的APP——Dr.cleaner以及Dr.X系列產品。機器學習
Dr.cleaner在多個國家、地區的清理類MAC APP中排名第一,日活接近百萬。
性能
多語言、跨時區:咱們的APP在國內可能還不是很是出名,它的目前的客戶基本都在海外,其中美國是主要客戶,同時也有其它國家跟地區的用戶。學習
數量跟不上:隨着用戶數的急劇增長,客服的數量跟不上用戶數的增加。
優化
客服機器人首要能解決產品相關的問題,其次要能解決MAC/IOS相關的技術問題,多語言的問題須要經過翻譯API翻譯成英語再嘗試給出解決方案。
網站
任何智能客服若是沒有足夠的知識庫支撐,即便它的算法再強大也不行。因此咱們把不少MAC相關的網站抓下來塞進咱們的數據庫中。插件
StackExcangeApple分論壇(公開數據源)、Apple Discussion、Mac world、WikiHow…
翻譯
當用戶問題出現的時候,咱們如何從文檔知識庫中找出咱們須要的東西?咱們以前嘗試過直接使用ES,可是距離語義仍是太遠了,效果並很差。
WMD也有明顯缺點,它的算法複雜度很是高,計算速度很慢。WMD不是銀彈,即便WMD以後也可能會獲得一些不太好的結果。
咱們的知識庫會先通過ES過濾一層。原始的知識庫大概是幾十萬級別,若是直接用WMD計算的話速度會很是慢。ES在必定程度上保證了它的字面差得不會那麼離譜,當字面比較相近的時候它仍是能匹配出一些東西。
這個是最原始的mapping,咱們基於這個mapping一步步去作優化。
採用BM25以後,當一個詞的出現頻率越高,到必定的閾值以後,它的影響是很是小的。
咱們作了一個實驗,修改了mapping,分別使用BM25 or TFIDF。從知識庫中隨機選取100個問題和10個回答,讓ES進行查詢,而後對比兩邊的結果。
咱們一共進行了10輪,每輪會有100個回答。如上圖可見,兩個算法的重複度大概是91%。
根據實驗得出,BM25的做用仍是比較明顯的,最終咱們採用了BM25去作類似度的算法。
咱們的方案:Term Suggester + Custom Analyzer
支持直接輸入一句話:How to replace macbookk SSD?
設定最小出現次數爲3,修改了」string_distance」,把它改成」jarowinkler」。它默認的類似度是基於編輯距離的一些定製化,編輯距離默認會輸出整數。
增長用戶行爲數據的支撐。Google的算法很大一部分就是有用戶行爲數據支撐。
「瞻前顧後」,從咱們的角度來講,要考慮先後兩個詞的關係。
首先使用Gensim生成備選詞組,而後使用規則過濾出比較精確的候選詞組。當咱們得到一個正確的詞組後,能夠根據候選詞組生成常見的錯誤寫法。最後再實時處理用戶輸入和批量處理ES存儲的知識庫。
規則就是純英文字符,去掉數字。主要是品牌名和版本號。
WMD的計算強度比較大,若是咱們在輸入詞中能把一些不重要的詞去掉,就能夠下降WMD的計算強度。
在咱們的一些知識庫中,它的表達方式不同。但重要的詞換一個表達方式,可以提升準確率。
當前咱們的解決方案用Python NLTK進行分析過濾,輸出每一個詞的詞性,ES存儲結果。
咱們更爲推薦的是使用ES分析、過濾、存儲一條龍解決方案,可是這種解決方案須要本身寫一個ES的Pos插件。
性能:Java實現的東西通常來講要比純Python的快,特別是在比較消耗CPU資源的時候。
簡單:邏輯不須要在ES和Python兩邊同時維護。
節省空間:NLTK的模型文件也比較大,多個Docker鏡像就意味着佔用多個內存、磁盤。
人爲地定義同義詞很難,咱們是基於Word2vec生成「同義詞」。
咱們的同義詞方案是經過同義詞進行查詢改寫。
基於Machine Learning的重排序,模型按照預測的點擊機率進行從新排序。
我今天的分享就到這裏,謝謝你們!