分詞是搜索中最基本也是非常重要的一個功能,正確的分詞是好的搜索效果的必要條件。
1. 分詞粒度
分詞中,最主要的問題是分詞粒度問題。例如“射雕英雄傳”,下面的幾種分詞方式,哪一種最正確?
- 最細粒度分詞:【射雕,英雄,傳】
- 正常粒度分詞:【射雕,英雄傳】
- 最粗粒度分詞:【射雕英雄傳】
- 混合粒度分詞:【射雕,射雕英雄傳,英雄,英雄傳,傳】
上述4種都沒有錯,要根據具體的應用場景,來決定使用哪種分詞方式。
- 構建索引
在構建索引時,為了擴大召回,一般要求粗細粒度都要有,第4種是最好的。表示索引中,【射雕,射雕英雄傳,英雄,英雄傳,傳】這5個詞都有,用戶輸入不全時,例如輸入“射雕”,也可以把它搜出來。
如果索引中只用粗粒度分詞,例如第3種【射雕英雄傳】,索引中只有一個詞【射雕英雄傳】,用戶搜索“射雕英雄”,就會與之匹配不上,搜索不到這個結果。
- 在線查詢
在線檢索時,分詞的粗細粒度各有優劣。- 粗粒度分詞:
- 召回的數量少。例如,在線查詢時,分成了【射雕英雄傳】,那就搜索不到《射雕英雄后傳》之類的內容了。
- 搜索准確率高,只搜索出完整包含《射雕英雄傳》,不會搜索出《兒女英雄傳》之類的內容
- 性能快,只用一個粗粒度term搜索,倒排相對較短。只需要取一個倒排拉鏈,沒有其它term參與打分計算。
- 細粒度分詞:(與粗粒度分詞的優劣正好相反)
- 召回數量多,可以搜索《射雕英雄后傳》《兒女英雄傳》之類(如果多個term之間是或查詢,不要求所有term都命中)。
- 准確率會下降,搜索出部分相關的內容。
- 處理邏輯更復雜。分詞后,多個term之間的關系如何處理,是取交集還是並集?
- 粗粒度分詞:
如果是約定俗成的內容,例如成語、人名、地名等,不建議再做進一步細分詞。否則,搜索出的結果會有明顯偏差。
如果是可粗可細的,可以考慮一個折中辦法:先用粗粒度分詞去做搜索,如果搜索結果夠多、質量夠好,就不再用細粒度分詞去做檢索。否則,如果搜索結果數量偏少,或質量不佳,則再細分詞,去做進一步的查詢。
舉個例子:人名“周傑倫”,建索引時,盡可能的各種粒度都有,例如分成【周,周傑,周傑倫,傑倫】。
-
用戶搜索“周傑倫”,只用粗粒度分詞【周傑倫】,搜索出准確的內容。如果再細分出【周傑】,搜索出“周傑”相關的內容,明確主違背了用戶的意圖。
-
用戶搜索“周”或“周傑”,也可以搜索出“周傑倫”的相關內容。因為用戶有可能是想搜索周傑倫,未輸入全就點擊了搜索按鈕。輸入不全,在搜索中是一種常見的問題。
2 詞形還原&詞干提取
在涉及英語等語言時,會涉及時態、單復數等變化問題,中文里沒有這個問題。分詞時如果不考慮詞形還原&干提取問題中,會導致漏召回。
- 詞形還原(Lemmatization)
詞形還原,是將詞還原成最原始的狀態。例如過去式、過去分詞,變成原樣(running -> run)。復數變成單數等(dogs -> dog)。
也就是用戶在搜索dog時,也要能搜索出dogs的內容。同樣,搜索dogs,也要能搜索出dog的內容。所以分詞時,需要將dogs識別出原形是dog。
詞形還原一般是通過詞典實現,准確率高。也可以基於規則做,但是我們知道英語里不規則的單復數、時態例子太多了,用規則解決不了。
- 詞干提取(temming)
詞干提取是去除詞的后綴,得到詞根。與詞形還原一個很明顯的區別是,詞形還原后的仍然是一個有意義的詞,但是詞干提取出來的詞根,可能不是一個單詞,只是單詞的一部分。例如electricity的詞根是electr。
相比詞形還原,用了詞干提取后,召回更多,准確率同時也會下降。
在搜索中,如果要使用詞形還原與詞干提取,用戶輸入的原詞,與還原后的詞或詞根,這2者之間的權重可能要做些區分。否則,會搜索出一些有偏差的結果。
