karmapa / AdarshaIos

📱 Tibetan sutra reader iOS app
GNU General Public License v3.0
5 stars 2 forks source link

全文檢索 Wildcard 搜尋規則 #14

Closed chiehan1 closed 8 years ago

chiehan1 commented 8 years ago

全文檢索除了單純的輸入關鍵字句以外,還可以用下列三種Wildcard規則 Wildcards: ? * (1) ? match single unknown syllable: e.g: bde ? snying 1 syllable in between e.g: མི་2?་པ 2 syllables in between 最多 9? (前後藏文音節字串中間夾9個音節) ,超過 9? 例如 མི་10?་པ,就不能搜尋。

(2) match a range of unknown syllables: e.g: mi 5 pa 1 to 5 syllables in between e.g: རབ་9་དཀའ 1 to 9 syllables in between 最多 9 (前後藏文音節字串中間夾1-9個音節) ,超過 9 例如 མི་10་པ,就不能搜尋。

(3) Word separator:/ or ། (shad) e.g: bde/snying e.g: རབ།དཀའ bde/snying 表示會 match到 bde音節字串 和 snying音節字串。 第三個規則最多搜尋兩個,輸入三個以上就不能搜尋,例如 bde/snying/gyas 就不能搜尋。

ps. 藏文音節(Tibetan syllable) 藏文音節用 ་ (tsheg)分隔,例如 བི་ན་ཡ་བསྟུ 可分成四個音節(syllable), Wylie 轉寫法就是用英文字符表示藏文的方法, 藏文的 ་ (tsheg),在Wylie轉寫法中,用 空白鍵 表示。

Wildcard搜尋的三種規則,以下舉例說明: (1)使用 རབ་?་ཐོབ 當關鍵字,會找到 རབ 和 ཐོབ 中間有 1 個藏文音節的音節字串,如 རབ་བྱུང་ཐོབ་ 54 1

使用 རབ་9?་དཀའ 當關鍵字,會找到 རབ 和 དཀའ 中間有 9 個藏文音節的音節字串, 如 རབ་བྱུང་ཐོབ་ནས་ཡུལ་སྤྱད་དག་གིས་དགའ་ཐོབ་དཀའ 54 2

(2)使用 མི་3*་པ 當關鍵字,會找到 མི 和 པ 中間夾 1至3 個藏文音節的音節字串, 例如match到 མི་ན་པ (中間夾一個音節),མི་ན་ཡ་པ (中間夾兩個音節),མི་ན་ན་ཡ་པ(中間夾三個音節)

使用 རབ་9*་དཀའ 當關鍵字,會match 到 རབ 和 དཀའ 中間夾 1至9 個藏文音節的音節字串, 例如 རབ་བྱུང་དཀའ (中間1個音節) རབ་བྱུང་ཐོབ་དཀའ(中間2個音節) རབ་བྱུང་ཐོབ་ནས་དཀའ (中間3個音節) རབ་བྱུང་ཐོབ་ནས་ཡུལ་དཀའ(中間4個音節) རབ་བྱུང་ཐོབ་ནས་ཡུལ་སྤྱད་དཀའ(中間5個音節) རབ་བྱུང་ཐོབ་ནས་ཡུལ་སྤྱད་དག་དཀའ(中間6個音節) རབ་བྱུང་ཐོབ་ནས་ཡུལ་སྤྱད་དག་གིས་དཀའ(中間7個音節) རབ་བྱུང་ཐོབ་ནས་ཡུལ་སྤྱད་དག་གིས་དགའ་དཀའ(中間8個音節) རབ་བྱུང་ཐོབ་ནས་ཡུལ་སྤྱད་དག་གིས་དགའ་ཐོབ་དཀའ (中間9個音節)

以下圖為例,རབ་9་དཀའ 在1.1b 段落第一個 match 到的是 རབ་བྱུང་ཐོབ་ནས་ཡུལ་སྤྱད་དག་གིས་དགའ་ཐོབ་དཀའ (中間夾9個音節) 在1.26a 段落第一個match到的是 རབ་བྱུང་དཀའ (中間夾1個音節) 點選左圖的1.1b,進入右圖經文閱覽模式,1.1b 段落中符合 རབ་9་དཀའ 的都要標紅(中間夾1至9個音節) 54 4

(3)使用 རབ།དཀའ 當關鍵字,會match到 རབ 音節和 དཀའ 音節,例如 ཐོབ་དཀའ་ཐོབ ,ཐོབ་རབ་ཐོབ ,བ་རབ་ན་ན་ཡ་དཀའ་ན

以下圖為例, རབ།དཀའ 在1.1b 段落第一個 match 到的是 རབ , 在1.2a 段落第一個match到的也是 རབ་,但是後面剛好也有一個དཀའ可顯示, 點選左圖的1.1b,進入右圖經文閱覽模式,1.1b 段落中 རབ和དཀའ 都要標紅 70 6

chiehan1 commented 8 years ago

套用Wildcard規則時, 例如 bde ? snying 或 mi 5 pa 或 bde/snying 以及 མི་2?་པ 或 མི་3་པ 或 རབ།དཀའ等情形, 因為 ? * / 符號用 fromWylie 會分別轉成藏文符號 ྄ ༌ ། 阿拉伯數字也會轉寫為藏文數字

寫信請教葉老師之後, 這個問題可先將可轉成藏文的符號預先處理。 fromWylie 後再轉為符號。

可參考 https://github.com/karmapa/adarsha/blob/master/src/searcharea.jsx dosearch

kmsheng commented 8 years ago

@yapcheahshen 這個部分我可以依照 https://github.com/karmapa/adarsha/blob/master/src/searcharea.jsx#L102 沒問題, 但我覺得似乎應該做在 kse.search() 的底層比較好 ? 不然上層每次都還要重複寫..

yapcheahshen commented 8 years ago

wylie 轉換應在AP層做,因為這是和特定語言相關,而且未來可能會加上其他的轉寫規則。

盡量不要直接call kse.search 用 ksa.filter 同時找 經錄和經文。(搜尋畫面有兩個 inputbox , one for 經錄, one for 經文) https://github.com/ksanaforge/ksana-api-tutorial/blob/master/lesson4-1.js 在經錄中有「玄奘」,並且經文中有「淨土」二字。 意義就是找出所有玄奘法師所譯,並且有「淨土」二字的經文。

,field:"mulu" 要去掉,因為jiangkangyur 沒有mulu 欄位。

詳細範例見:http://rawgit.com/ksanaforge/dualfilter-cbeta/master/ dualfilter

yapcheahshen commented 8 years ago

wildcard 已內建在搜尋引擎之中。 藏文搜尋和英文/中文主要的差異在 phrase_sep 中文和英文詞皆以空白隔開,而短句以 雙引號隔開 ,這是google 的習慣。 即:"this is a phrase" "this is another phrase" 但藏文要用 shad U+0f0d 隔開短句。 所以要傳入 phrase_sep:"།" 見 https://github.com/karmapa/adarsha/blob/master/src/searcharea.jsx#L102

我建議請懂藏文的同仁,確定一組有意義的查詢字串(單一詞,多詞,wildcard ,短句) , 寫成 node.js testsuite ,這樣App 比較好測。

kmsheng commented 8 years ago

@yapcheahshen 為什麼 ksa.filter 的 items 只有 uti ? 如果想要他 return 完整的 text 資訊我該怎麼做 ?

yapcheahshen commented 8 years ago

@kmsheng 請提供node.js 能跑的sample code, 並寫下還要那些欄位。

kmsheng commented 8 years ago

@yapcheahshen https://gist.github.com/kmsheng/479d469b2853b6b38f52 # realHits, text, segname / uti, 經名能順便就更好

yapcheahshen commented 8 years ago

因為breadcrumb (On) 和 抓內文都比較慢 ( 會增加不少random seek ) filter 很有可能會返回數千筆,等於把大半個kdb內容都載入memory,很慢。 所以不能在filter直接做fetch/breadcrumb動作。

建議的做法是: 當搜尋輸入盒有修改,做一次filter,排序結果。 然後選出最前面的10~20個uti,做fetch的動作(fetch uti 可以吃array), 畫面捲動或使用者按「下一批」時,不必再做filter, 抓下一批uti,再做fetch 即可

ksana-simple-api@1.3.1
fetch 加上 breadcrumb (目錄名) 參數

sample code //jiangkangyur 的目錄名是 "head" , 如果寫breadcrumb:"" 就會抓預設的toc, 即 meta.toc=="head" ( ks jiangkangyur.meta ) 。 最好還是寫 breadcrumb:"head", 未來有可能會有其他的 toc 。

var uti=["1.1b","1.2a"]
q="པར";
ksa.fetch({db:"jiangkangyur",q:q,breadcrumb:"head",uti:uti},function(err,items){console.log(items)});
kmsheng commented 8 years ago

@yapcheahshen 請問原本的 realHits 呢 ? hits 要如何轉換成 realHits ?

yapcheahshen commented 8 years ago

ksa.fetch 返回的就是 realHits ksa 原則上就是返回realHits 以方便AP 塗紅。

低階 API (kse,kde)為方便caller 做特別的posting list 運算,才需要 hits (即以 vpos 為單位的 hits)

2015-12-15 20:48 GMT+08:00 kmsheng notifications@github.com:

@yapcheahshen https://github.com/yapcheahshen 請問原本的 realHits 呢 ? hits 要如何轉換成 realHits ?

— Reply to this email directly or view it on GitHub https://github.com/karmapa/AdarshaIos/issues/14#issuecomment-164754592.

kmsheng commented 8 years ago

@yapcheahshen 不是耶, 我是說 ksa.filter 出來的東西, gist 上的也是 ksa.filter

kmsheng commented 8 years ago

@yapcheahshen 上面說的 རབ།དཀའ 的案例應該也是 ksa.filter 的 realHits 要修正吧 ?

kmsheng commented 8 years ago

རབ།དཀའ 的標記問題已修正

kmsheng commented 8 years ago

@chiehan1 麻煩看一下此 issue 還有什麼沒處理 ?

kmsheng commented 8 years ago

已在 v1.0.27 使用 ksa.filter + ksa.fetch 取代 kse.search

yapcheahshen commented 8 years ago

https://github.com/karmapa17/jiangkangyur/blob/master/test/testspeed.js see test6()

須新增一個TextInput,以regex 傳入 ksa.filter 此TextInput的place holder 為"title",原來的為"full text" (q) ksa.filter({db:db,q:q,regex:regex,field:"head"}) //head 為jiangkangyur 的目錄名 ( tag in jiangkangyur*.xml)

ksa.filter 返回一定是array of { text, uti, hits, vpos} 如果沒有指定 regex ,那 text ===uti 如果有指定regex , 那text 是符合的目錄節點或其子孫節點的名稱。 如果只有指定regex ,而q為空,那 ksa.filter 就是執行目錄檢索。

regex 的作用是「限定全文搜尋的範圍」,可以是regular expression 。 通常會在 regex 輸入「部份經名」, 這樣只會列出在符合regex 限定條件的經之中的全文檢索結果。 比方說regex =「華嚴」,q =「淨土」,這樣只會在「八十華嚴」「四十華嚴」「華嚴經探玄記」等著作中找。 如果不用regex 限定,「淨土」會找到太多筆。

取得 jiangkangyur 目錄的指令: ks jiangkangyur.fields.head

如果不指定 field, 會採用 uti 做為統計和分群的單位 (回報每一uti的hits)。 因為 head 的數量只有 5224 ,而 uti 有60267 ,所以用 head 分群大約可以再快一倍。

另外,搜尋結果應列出「總筆數」,每一row 前面要有序號,這樣user才知道往後還有多少筆。

regards, yap

2015-12-22 23:14 GMT+08:00 kmsheng notifications@github.com:

已在 v1.0.27 使用 ksa.filter + ksa.fetch 取代 kse.search

— Reply to this email directly or view it on GitHub https://github.com/karmapa/AdarshaIos/issues/14#issuecomment-166642894.

kmsheng commented 8 years ago

screen shot 2015-12-23 at 1 51 47 pm