2016年6月21日 (火)

memo::EB版広辞苑の検索漏れの詳細

■EB版広辞苑の検索漏れの詳細
                                   .
●不具合の発生するインデックス
・前方一致かなインデックス,または,後方一致かなインデックス
                                   .
●発見時の現象
広辞苑5版での,"うぐい" の検索
・EPWING版:問題なし
・EB版  :先頭部の7項目(うぐい~うぐいすかぐら)が欠落.
      "うづいすかん" から表示が始まる.
デバッグモードでの検索
・正しいインデックスのブロック番号を表示していることを確認
                                   .
●EBDumpのテキストダンプ(該当項目の先頭付近)
EB版
80:うくい[6]<1個>
C0:うぐい[6]    [83DB:48][5A71:2EC]
80:うくいす[8]<1個>
C0:うぐいす[8]    [83DB:144][5A71:308]
80:うくいすあわせ[14]<1個>
C0:うぐいすあわせ[14]    [83DC:96][5A71:324]
80:うくいすいろ[12]<1個>
C0:うぐいすいろ[12]    [83DC:144][5A71:352]
80:うくいすかい[12]<1個>
C0:うぐいすがい[12]    [83DC:1C8][5A71:378]
80:うくいすかき[12]<1個>
C0:うぐいすがき[12]    [83DC:2F0][5A71:3A0]
80:うくいすかくら[14]<1個>
C0:うぐいすかぐら[14]    [83DC:37A][5A71:3C6]
80:うくいすかん[12]<1個>
C0:うぐいすかん[12]    [83DC:4EE][5A71:3F0]
....................................
EPWING版
80:うくい[6]<2個>
C0:うぐい[6]    [5ED:124][5ED:124]
C0:ウグイ[6]    [5ED:124][5ED:124]
80:うくいす[8]<2個>
C0:うぐいす[8]    [5ED:23C][5ED:23C]
C0:ウグイス[8]    [5ED:23C][5ED:23C]
80:うくいすあわせ[14]<2個>
C0:うぐいすあわせ[14]    [5EE:1B4][5EE:1B4]
C0:ウグイスアワセ[14]    [5EE:1B4][5EE:1B4]
80:うくいすいろ[12]<2個>
C0:うぐいすいろ[12]    [5EE:254][5EE:254]
C0:ウグイスイロ[12]    [5EE:254][5EE:254]
80:うくいすかい[12]<2個>
C0:うぐいすがい[12]    [5EE:2D0][5EE:2D0]
C0:ウグイスガイ[12]    [5EE:2D0][5EE:2D0]
80:うくいすかき[12]<2個>
C0:うぐいすがき[12]    [5EE:3E8][5EE:3E8]
C0:ウグイスガキ[12]    [5EE:3E8][5EE:3E8]
80:うくいすかくら[14]<2個>
C0:うぐいすかぐら[14]    [5EE:45E][5EE:45E]
C0:ウグイスカグラ[14]    [5EE:45E][5EE:45E]
80:うくいすかん[12]<2個>
C0:うぐいすかん[12]    [5EE:5D2][5EE:5D2]
C0:ウグイスカン[12]    [5EE:5D2][5EE:5D2]
.....................................
片仮名を除けば,インデックス構造上の違いはない.
EB版だけで,検索漏れが発生する理由は,ここにはない.
                                    .
                                    .
●EBDumpのテキストダンプ(該当ブロックの先頭部)
EB版
block#=341D(13341)
ID=90    桁数=0    要素数=91
80:うきよこころ[12]<1個>
C0:うきよごころ[12]    [83D6:552][5A70:542]
80:うきよこさ[10]<1個>
C0:うきよござ[10]    [83D6:594][5A70:55C]
80:うきよことは[12]<1個>
C0:うきよことば[12]    [83D6:5E4][5A70:576]
00:うきよこもん[12]    [83D6:63C][5A70:592]   <--- 00 EPWING版と違う
00:うきよし[8]    [83D6:680][5A70:5AE]     <--- 00 EPWING版と違う
80:うきよしようし[14]<1個>
C0:うきよしょうじ[14]    [83D6:6CE][5A70:5C4]
80:うきよそうし[12]<1個>
C0:うきよぞうし[12]    [83D6:772][5A70:5EE]
.........................................
EPWING版
block#=5637(22071)
ID=90    桁数=0    要素数=90
80:うきよのせき[12]<2個>
C0:うきよのせき[12]    [5EA:11C][5EA:11C]
C0:ウキヨノセキ[12]    [5EA:11C][5EA:11C]
80:うきよのちり[12]<2個>
C0:うきよのちり[12]    [5EA:1C2][5EA:1C2]
C0:ウキヨノチリ[12]    [5EA:1C2][5EA:1C2]
80:うきよのつな[12]<2個>
C0:うきよのつな[12]    [5EA:22E][5EA:22E]
C0:ウキヨノツナ[12]    [5EA:22E][5EA:22E]
80:うきよのなさけ[14]<2個>
C0:うきよのなさけ[14]    [5EA:29A][5EA:29A]
C0:ウキヨノナサケ[14]    [5EA:29A][5EA:29A]
80:うきよのなみ[12]<2個>
C0:うきよのなみ[12]    [5EA:2EE][5EA:2EE]
C0:ウキヨノナミ[12]    [5EA:2EE][5EA:2EE]
.........................................
                                    .
●原因
エントリ識別=00の処理が欠落していると考えると説明がつく.
 00が出現すると,それ以降のインデックスの想定位置がずれ,インデ
 ックスの照合が失敗する.(00の場合の位置計算が欠落)
 偶然に位置が同期すれば,インデックスの照合が成功するようになる.
 結果として,先頭部が欠落し,中途から始まる該当項目一覧となる.
                                    .
●ソースコードの確認
エントリ識別=00 の場合の処理が欠落していることが判明
主に,EPWING版の広辞苑で確認していため,エントリ識別=00 が不要
であるかのような思い込みがあったようだ.
                                    .
●修正
エントリ識別=00 の場合の処理を追加した.
                                    .
                                    .
[HP200LX/LXDIC]

|

2016年6月20日 (月)

LXDIC Ver.19.6

■LXDIC Ver.19.6
検索高速化に伴い発生した検索ルーチンの不具合を修正した.
                                   .
ダウンロード
===> http://hp200lx.cocolog-nifty.com/blog/download.html
                                   .
[HP200LX/LXDIC]

|

LXDIC:検索高速化のバグ

■LXDIC:検索高速化のバグ
                                   .
●バグ1(複合検索)
新漢語辞典第2版の「構成要素」等の複合検索では,全ての検索で1項目も
ヒットしない事がある.
                                   .
(原因)
識別子 a1 の項目別条件検索インデックスの検索の場合において,
  メンバー識別:c0
のエントリーを取りこぼしている.
                                   .
                                   .
●バグ2(かな検索)
電子ブック版 広辞苑5版等の「前方一致かな検索」で,検索漏れが発生する.
(例)"うぐい" の検索で,先頭から7項目が欠落する.
                                   .
(原因)
前方一致かな検索および後方一致かな検索においては,
 エントリー識別/メンバー識別:00,80,c0,
の全てを網羅すべきところが,00 の場合の処理が欠落していた.
エントリー識別:00 を用いている場合に,検索漏れが発生する.
                                   .
●バグの発生時期
このバグは,検索の高速化のために Ver.18.2f (2016.3.22) において改訂し
た検索ルーチンの不具合によるもので,18.2f以降の全ての版で発生する.
                                   .
[HP200LX/LXDIC]

|

2016年6月18日 (土)

複合検索のインターフェイス

■複合検索のインターフェイス
LXDICの複合検索では,検索語をスタックに積んでから,それらのAND検索を
実行するという独自のインターフェイスを採用している.
これは,主にプログラミングの都合で採用したものなので,必ずしも使い勝
手を考慮したものではなかった.
                                   .
ここでは,一般的な入力インターフェイスと入力効率の比較を行い,入力イ
ンターフェイスの改善が必要かどうかを検討する.
                                   .
(比較する複合検索)広辞苑第5版
  表記・音訓・JIS  "あい"
  部首内画数     "8"  
  総画数       "12" 
                                   .
●EBWinの検索手順
Hukugoa1_2
1.メニューから「複合検索」を選択(マウス)
2.「漢字検索」を選択(マウス)
3.「表記・音訓・JISコード」の入力ラインに "あい" を入力
4.「部首内画数」に移動(TAB2回,または,マウス)
5.「部首内画数」の入力ラインに "8" を入力
6.「総画数」に移動(TAB1回,または,マウス)
7.「総画数」の入力ラインに "12" を入力
8.「検索」クリックで,複合検索実行
                                   .
●LXDICの検索手順
Lxd1951
1.「漢字検索」を選択(TAB 5回,または,Shift+Tab)
2.入力ラインに "あい" を入力 (「表記・音訓・JISコード」への入力)
3.↓(下矢印)部首    stack1="あい"
4.↓(下矢印)部首内画数 
5."8" キー入力        (「部首内画数」への入力)
6.↓(下矢印)総画数   stack1="8",stack2="あい"
7."12" キー入力        (「総画数」への入力)
8.F10(複合検索実行)   stack1="12",stack1="8",stack2="あい"
                                   .
●結論
LXDICの複合検索の入力効率は,他と同等である.
通常のインデックスの間のAND検索ができる等の柔軟性を考えると,スタッ
ク利用の現在のインターフェイスを変更するメリットはない.
                                   .
[HP200LX/LXDIC]

|

2016年6月16日 (木)

LXDIC 19.5

■LXDIC 19.5
複合検索関連の操作性向上
スタック操作なしで,検索を実行することができるようにする.
                                   .
主な変更点
・入力したキーワードは,自動的にスタックに積まれる.(自動PUSH)
・検索の実行に際しては,スタックを最適な順番に並べ替える.(自動整列)
※スタックの数は増やさない.
 4語以上の複合検索は,3語の複合検索に引続く絞込検索(F6)で代替.
                                   .
●設定ファイル第1行先頭部の設定項目(追加)
1++ //////// LXDIC 設定ファイル ////////
 1st  <<検索結果の重複チェック方法>>  1,2,3
 2nd  <<複合検索の検索語自動Push>>   +,-    <--- 追加19.4
 3rd  <<複合検索のStack自動整列>>    +,-    <--- 追加19.5
 ※それぞれ,従来どおりの動作がデフォルト設定となる.
  新しい機能を有効にするためには,設定ファイルの変更が必要
                                   .
●オーバーフローが発生する条件での検索時間の比較
広辞苑5版 漢字検索(音訓"あい",部首内画数"8",総画数"12")
・本検索1回のみ         ==> 約 8秒(検索漏れあり)
・予備検索+スタック整列+本検索 ==> 約10秒(検索漏れなし) 19.5採用
・本検索 +スタック整列+本検索 ==> 約16秒(検索漏れなし)
                               .                                   .
[HP200LX/LXDIC]

|

2016年6月15日 (水)

LXDIC:スタックの自動整列(テスト)

■LXDIC:スタックの自動整列(テスト)
複合検索の検索途中におる項目数の制限を回避するために,スタックの並べ
替えが必要になる事があるが,これを自動化することを考える.
                                     .
●ハッシュテーブルのオーバーフロー
LXDICの複合検索では,項目の重複検査を行うために,ヒットした項目のアドレ
ス情報をハッシュテーブルに保存しておく.
ハッシュテーブルは,本文用バッファーメモリーを2分割(3:1)して一時的に
流用しているため,バッファー設定量の制限を受ける.
例えば,バッファー設定値20000の場合,項目数の上限は以下の様になる,
 ハッシュテーブル1:3162件  <--- stack1 の検索
 ハッシュテーブル2:1054件  <--- stack2 の検索
(ハッシュテーブルは,前回結果照合用と今回結果保存用を交互に切替える)
                                     .
この上限を越える項目数がある場合は,検索漏れが発生するが,スタックを入替
えて,検索の順番を変更すれば,オーバーフローを回避できる.
・オーバーフローの例(3件ヒット)
Lxd193d6
・オーバーフロー回避例(8件ヒット)
Lxd1952
 stack1 音訓    "あい"   38件  保存は38件のみ
 stack2 部首内画数  "8"   4153件  "あい" と "8" のAND:38件以下
 stack3 総画数    "12"  5249件  全てに共通の項目:38件以下
                                     .
これまでは,ハッシュテーブルのオーバーフローが発生した場合は,手動でスタ
ックの入替えを行い,項目数の一番小さいものをスタックの先頭に置いて,再検
索を行うしかなかった.
しかし,これでは,複合検索を2度実行することになり,かなりの非効率になる.
                                     .
                                     .
●スタックの自動整列
スタックを,その検索語の該当項目数の小さい順に並べ替える.
本検索を実行する前に,予備検索を行ない,該当項目数の概算を求める.
※本検索を実行すれば,正確な項目数を把握できるが,時間がかかる.
                                     .
・予備検索
 検索語に対するヒット数の概算
  -インデックスの最下層は検索しない.
  -最下層の1段上の層のみ検索し,該当の参照先ブロック番号を保存.
  -最小ブロック番号と最大ブロック番号から,占有ブロック数を計算.
  -このブロック数で,項目数の多寡を推定する.(近似)
                                     .
入力時のスタック配列
Lxd1951
検索後のスタック配列(自動整列)
Lxd1952
(検索中は,ブロック数が表示される)
                                     .
[HP200LX/LXDIC]

|

2016年6月13日 (月)

LXDIC:複合検索の操作性改善(テスト)

■LXDIC:複合検索の操作性改善(テスト)
複合検索で,キーワードをスタックへ積む操作を明示的に行わなくても,
入力終了時に自動的に行われるようにして,複合検索手順を簡素化する.
また,複合検索群やインデックスの変更に際しては,入力ラインの文字
列を選択状態にして,消去操作なしで上書きできるようにする.
                                  .
・キーワードを自動的にPushする.(インデックスの変更時)
・インデックス変更後の入力ライン文字列を選択状態にする.(上書可)
(スタック操作なしで,複合検索を行うことができる)
                                  .
●複合検索(漢字検索)の検索例
広辞苑:漢字検索の例
読み='あい',部首内画数=8,総画数=12 の漢字を検索する場合
インデックス
  1表記・音訓・JIS   <--- デフォルト
  2部首        
  3部首内画数     
  4総画数       
  5漢字の種類     
                                  .
(改善前のキー操作)    
.1. ESC ライン消去
.2. "あい" キー入力      
.3. F8(Push)       stack1="あい"
.4. ↓(下矢印)部首     
.5. ↓(下矢印)部首内画数  
.6. ESC 入力ライン消去   
.7. "8" キー入力       
.8. F8(Push)       stack1="8",stack2="あい"
.9. ↓(下矢印)総画数    
10. ESC 入力ライン消去    
11. "12" キー入力       
12. F8(Push)       stack1="12",stack1="8",stack2="あい"
13. F10(複合検索)実行
                                  .
(改善後のキー操作)
1. "あい" キー入力    
2. ↓(下矢印)部首    stack1="あい"
3. ↓(下矢印)部首内画数 
4. "8" キー入力      
5. ↓(下矢印)総画数   stack1="8",stack2="あい"
6. "12" キー入力      
7. F10(複合検索実行)   stack1="12",stack2="8",stack3="あい"
                                  .
 ※F10操作時,入力ラインの文字列が,まだ,スタックに積まれてい
  ない場合は,Push操作を行った後に,複合検索を実行する.
 ※入力の際は,前の文字列が選択された状態で残っているが,上書さ
  れるので,消去操作は必要はない.
 ※この例の実際の検索では,項目数のオーバーフローが発生するが,
  stack1とstack3を交換すれば,オーバーフローは回避できる.
                                  .
[HP200LX/LXDIC]

|

2016年5月30日 (月)

LXDIC 19.3d

■LXDIC 19.3d
テスト用の情報表示を整理
                                 .
テスト用情報表示のまとめ
●キーワード入力画面
キーコード(第1行)[Ctrl+DelでON/OFF]
 -INDEX作成情報  -入力キーコード1,2   -文字コード(カーソル位置の)
ファイル情報(下部)[Ctrl+DelでON/OFF]
 -圧縮単位         -辞書ファイル名
 -半角外字数       -半角外字ファイル名
 -全角外字数       -全角外字ファイル名
検索中の情報表示[常時ON]
 -見出し文字列の照合回数(最上部に表示)
 -検索中インデックスのブロック番号
  ファイル情報ON の時 --> ブロック番号全表示
  ファイル情報OFFの時 --> ブロック番号間引き表示(進捗状況)
  デバッグモード[Ctrl+d]の時 --> 番号表示の度に1秒間休止
                                 .
●該当項目一覧画面  [F8でON/OFF]
 -INDEX照合時間 (1/100秒単位)
 -見出し取得時間(1/100秒単位)
 -見出し表示時間(1/100秒単位)
 -INDEX照合回数
 -基本エントリ数
 -集団エントリ数
 -見出文字列照合回数  <--- 19.3dで追加
 -見出し重複件数    <--- 19.3dで追加
                                  .
●本文表示画面  
 -本文デコード時間(1/100秒単位) [該当項目一覧画面のF8でON/OFF]
 -本文表示時間    (1/100秒単位) [該当項目一覧画面のF8でON/OFF]
 -本文アドレス(ブロック番号:オフセット) ['-'キーで表示]
                                  .
表示例("give" と "[P]give" は異なる項目.本文アドレスが異なる)
Lxd193d1
                                  .
[HP200LX/LXDIC]

|

2016年5月29日 (日)

LXDIC 19.3

■LXDIC 19.3
項目の重複チェックに,見出文字列の照合による方法を追加
                                   .
●設定方法
・設定ファイル(LXDIC.INI)に,起動時の状態を指定できる.
(設定)   (チェックに用いるデータ)
 '1'  ===> 本文アドレス               [デフォルト]
 '2'  ===> 本文アドレス + 見出アドレス 
 '3'  ===> 本文アドレス + 見出アドレス + 見出文字列
                                   .
・該当項目一覧画面で設定変更する.
 F7キーで切替操作: [check1] --> [check2] --> [check3]
  ※設定変更は,次回からの検索結果に反映される.
                                   .
●同一項目と見なす条件
1:本文アドレスが一致する.
2:本文アドレス及び見出アドレスが一致する.
3:本文アドレス及び見出文字列が一致する.
                                   .
●チェック方法の特徴
1:複数の見出しを持つ項目があっても,1つしか表示できない.(欠落あり)
2:見出/本文が同一の項目が,重複して現われる事がある.  (重複あり)
  ※見出しアドレスが異なっても,同一文字列の場合がある.
3:見出しに重複および欠落がなく,最も好ましい結果となる.(過不足なし)
  (サイズの大きな辞書では,辞書の再構成が必要)
                                   .
●方法の選択
・見出しの重複を許さない.本文の重複を許さない. ==> 方法1[項目数最小]
・見出しの重複を許さない.本文の重複は許す.   ==> 方法3[項目数中間]
・見出しの重複を許す.  本文の重複を許す.   ==> 方法2[項目数最大]

[HP200LX/LXDIC]

|

2016年5月27日 (金)

LXDIC::重複チェック法の比較テスト

■重複チェック法の比較テスト
項目の重複チェック方法の比較する.
                                   .
テストするチェック方法
1.本文アドレス でチェック.
  各項目は,必ず異なる本文を参照する.
  (外見的にも,実質的にも,重複はない)
2.本文アドレス+見出アドレス でチェック.
  同じ見出しの項目が複数現われ,同一の本文を参照することがある.
  (外見的にも,実質的にも,重複がある)
3.本文アドレス+見出アドレス+見出文字列 でチェック.
  異なる見出しの複数項目が,同一の本文を参照することがある.
  (外見的な重複はないが,実質的な重複がある)
                                   .
                                   .
●テスト検索
リーダーズ英和辞典:"giv"
1.本文アドレス [check1]
"give"が欠落しているように見えるが,実は2行目が"give"
Lxd1933
                                   .
2.本文アドレス+見出アドレス [check2]
1行目と3行目が重複. "give"は表示される.([P]マークはプラスの項目)
Lxd1934  
                                   .
3.本文アドレス+見出アドレス+見出文字列 [check3]
外見上の重複や欠落はなくなる.(実際は2,3行目は同じ項目)
<オリジナルの辞書構成>検索時間=3.85秒
Lxd1931
<見出し再配置後の辞書>検索時間=1.10秒    [remake適用後]
Lxd193b1
                                   .
                                   .
●結論
方法1:複数の見出しを持つ項目があっても,1つしか表示できない.(欠落あり)
方法2:見出/本文が同一の項目が,重複して現われる事がある.  (重複あり)
方法3:見出しに重複および欠落がなく,最も好ましい結果となる. (過不足なし)
    サイズの大きな辞書では検索時間が大幅に増大するが,辞書の
    再構成により見出しを辞書の先頭部に配置すれば,検索時間は
    大幅に短縮される.(実用上の問題は軽減される)
                                   .
[HP200LX/LXDIC]

|

«LXDIC 19.2b