[系統] SQLite fts tokenizer 結合 porter + 中文 unigram

看板Database作者 (Cary)時間9年前 (2014/11/07 07:09), 9年前編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
資料庫名稱: SQLite 資料庫版本: 3.8.6 作業平台: Gentoo Linux 問題描述: 最近在用 SQLite 的 fts(full-text search) 實作簡單的 search function, 搜尋主要內容是數字、中文和英文。 fts 的資料可能如下: pacakgeId |title ------------------------------------- 1 |"horse 馬" ------------------------------------- 2 |"cute dogs 超級可愛的狗狗" ------------------------------------- 3 |"Roman 羅馬" ------------------------------------- 4 |"Purin dog 布丁狗" 其實還會有其他國的 title(像是日、韓、德等), 不過目前使用者主要是使用中、英文。 目前嘗試內建的 tokenizer,其中 porter 可以對英文做 stemming,(像是搜尋「dog」可以找到 2, 4) 但是中文就只會把整句當成一個 token,搜尋時必須搜尋整句或是開頭+wildcard 纔可以。 icu 可以對中英文或其他國語言分詞,但是有兩個問題 1. 沒有辦法像 porter 做 stemming,所以搜尋「dog」只會出現 4 2. 分詞太「聰明」,會把「羅馬」辨認成一個 token。 所以當搜尋「馬」時只會出現 1,沒有 3 簡單來說,我希望 1. 英文 stemming,可以搜尋 dog 就找到 2, 4 2. 中文 unigram,搜尋「馬」時找到 1, 3 3. 搜尋「羅馬」時找到「羅 AND 馬」(ex: 3,兩字分開也沒關係),「羅 馬」時找「羅 OR 馬」到 1, 3 (第三點似乎是內建的行為?不太確定。目前 icu 可以達到。例如:「可愛狗」可以找到 2,不會找到4) 4. (option)其他語言按照 icu 來分詞。 我對 custom tokenizer 並不是很熟,文件和程式碼看起來都不太友善XD 自己從頭學習+實作是下下策,希望可以先找到有經驗的前輩,看有沒有類似功能的實作或是其他意見。 PS. 我也有在尋找 database 以外的解決辦法,譬如把資料轉移到 Lucene 上。 相關提案暫時還在摸索,所以這裡還是以可以用現有 SQLite 解決的方法為主。 -- 最後我發現是 ICU 的 word boundary 演算法讓 break iterator 會判斷多個漢字為一個單字, 而改中文 word boundary analysis 演算法可能沒有比較簡單 加上除非把 column 分成不同 virtual table 不然無法每個 column 用不同的 tokenizer 所以我最後是把 CJK 字元之間都加上空格(實作上不是,但大概是這個意思)然後用 porter 這樣除了第四點以外都 OK 了 還有第三點是我的誤會,他的每個 token 本來就是 AND 的關係,所以「羅 馬」也是找到「羅 AND 馬」。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.34.244.41 ※ 文章網址: http://www.ptt.cc/bbs/Database/M.1415315399.A.97C.html ※ 編輯: carylorrk (1.34.244.41), 11/07/2014 09:06:02 ※ 編輯: carylorrk (1.34.244.41), 11/10/2014 04:23:58
文章代碼(AID): #1KM__7by (Database)