7 返信 最新の回答 日時: Dec 22, 2014 9:04 AM ユーザー:Shin

    同一視検索について

    夾竹桃

      タイトル

      同一視検索について

      フォーラムに投稿

      エンジニアではありません。個人的な用途で使用しています。ヴァージョン13、win7です。

      漢字異体字をスムーズに検索するようにしたいです。

      現在はこちらのサイトを参考にして検索フォームを作ってみました。

      http://www.russ.jp/stepbbs/step.cgi?mode=view&no=78419

      ここで提案されたのは「オリジナル」と別に異体漢字を統一した「検索用」のフィールドを作っておくというものですが、これでは容量が2倍になってしまいます。

      わたしは以下の方法で検索できないかと考えています。

      例:
      主テーブルのフィールドに「國語敎育」が入っているレコードがある。
      別のテーブル(テーブル名:異体漢字(仮))には異体漢字一覧が準備されている。
       
      オリジナルの検索フォームに「国語教育」(グローバルフィールド)と入力して検索
       
      スクリプトで「国語教育」「國語教育」「国語敎育」「國語敎育」……(全組み合わせ)を生成して「主テーブル::フィールド」でor検索するように設定
       
      無事レコードを検索できる。
       
      こんな流れをイメージしています。(このサイトの説明としたい事は同じ http://www.karak.jp/chinese/variants.html)

      スクリプトの記述方法を教えてくださいませんか。

        • 1. Re: 同一視検索について
          sago350@未来Switch

          容量が2倍になってもたいした容量でもなさそうなので、それでいいんじゃないかと思うんですが。

          ざっくりですが、こんな感じでどうでしょうか。国語教育→異体漢字の変換部分は設計がいまいちわからないので抽象化してます。

           

          サンプルファイル
          https://www.dropbox.com/s/gxbd60v20362r3c/%E5%90%8C%E4%B8%80%E8%A6%96%E6%A4%9C%E7%B4%A2.fmp12?dl=0

          • 2. Re: 同一視検索について
            夾竹桃

            「sago35」さん ありがとうございます。

            サンプルを参考にあくせくとスクリプトを書いてみましたが、動きません。

            >国語教育→異体漢字の変換部分は設計がいまいちわからないので抽象化してます

            ここの部分もご教示ください。

             

            私なりの方法は…

            ①検索語の文字数を数える 

            ②Loopで文字数分次の処理をする #「国語教育」は4文字なので4回ループ

              1番目の文字を「異体漢字」リストと対照して置換する #異体漢字も2~5と一定しません。その回数分ループ

              置換された文字を検索語に返して「検索用」(グローバルフィールド)に入れる #この時点で「国語教育」「國語教育」「圀語教育」が入っているはず

              2番目の文字を・・・同上の処理

            ③「sago35」さんの指示通りのスクリプトで検索する

             

            https://drive.google.com/file/d/0BwXCWGdD3K27MU5LeUNIb1dHQms/view?usp=sharing

            • 3. Re: 同一視検索について
              sago350@未来Switch

              検索するテキストをSubstituteした計算フィールドを作ったほうが楽だと思うんですが、2倍になると困るぐらいのデータ容量なんですか?

              • 4. Re: 同一視検索について
                sago350@未来Switch

                それと、”國語教育渡邊”というパターンの時はどうしましょう?
                1検索後の中に複数の異体字が入った場合はパターンが増えていきますが。
                さらに異体字が複数ある場合はモノによってはかなりのパターン数になるかと。

                • 5. Re: 同一視検索について
                  sago350@未来Switch

                  とりあえず、こんな感じで。


                  #############################################################
                  #
                  #
                  #
                  #引数 : 
                  #トリガ : 
                  #
                  #create: 
                  #modified: 
                  #
                  #############################################################
                  #
                  ユーザによる強制終了を許可 [オフ]
                  エラー処理 [オン]
                  #
                  変数を設定 [$param; 値:Get ( スクリプト引数 )]
                  #
                  #同一視語のリストを生成
                  変数を設定 [$searchText; 値:同一視検索::g検索語]
                  変数を設定 [$searchQueryList; 値:$searchText]
                  変数を設定 [$i; 値:0]
                  変数を設定 [$length検索語; 値:Length ( $searchText )]
                  Loop
                      Exit Loop If [$i ≥ $length検索語]
                      変数を設定 [$i; 値:$i + 1]
                      変数を設定 [$one; 値:Middle ( $searchText ; $i ; 1 )]
                      フィールド設定 [同一視検索::作業用; $one]
                      変数を設定 [$count異字体; 値:Count ( 異体漢字::異体漢字 )]
                      変数を設定 [$ii; 値:0]
                      Loop
                          Exit Loop If [$ii ≥ $count異字体]
                          変数を設定 [$ii; 値:$ii + 1]
                          変数を設定 [$searchQueryList; 値:$searchQueryList &   Case (     not Exact (  $one ; 異体漢字::異体漢字[$ii] ) ;          ¶ & Substitute ( $searchQueryList ; $one ; 異体漢字::異体漢字[$ii] ) )]
                      End Loop
                      変数を設定 [$ii]
                  End Loop
                  変数を設定 [$i]
                  フィールド設定 [同一視検索::作業用; ""]
                  #
                  #
                  #同一視語のリストを使って検索
                  検索モードに切り替え []
                  変数を設定 [$valueCount; 値:ValueCount ( $searchQueryList )]
                  #
                  変数を設定 [$i; 値:0]
                  Loop
                      Exit Loop If [$i ≥ $valueCount]
                      変数を設定 [$i; 値:$i + 1]
                      フィールド設定 [同一視検索::検索対象テキスト; GetValue ( $searchQueryList ; $i )]
                      新規レコード/検索条件
                  End Loop
                  検索実行 []
                  #
                  #############################################################
                  #スクリプトここまで

                   

                  • 6. Re: 同一視検索について
                    夾竹桃

                    「sago35」さん

                    ありがとうございます。思い通りの動作になりました!

                    蛇足ですが、

                    >検索するテキストをSubstituteした計算フィールドを作ったほうが楽だと思うんですが、2倍になると困るぐらいのデータ容量なんですか?

                    現状まったく困りません。ただスマートでないなと思ったのです。フィールドひとつに入る文字数が多いので、検索語をハイライトさせる必要もありますが、やはり異体字を同一視してもらわないと不便です。これについては今回のスクリプトを応用してみます。

                    >1検索語の中に複数の異体字が入った場合はパターンが増えていきますが。さらに異体字が複数ある場合はモノによってはかなりのパターン数になるかと。

                    つまり極端に長い検索語を入れるとフリーズするということでしょうか。10文字ですべて異体字であったとしても100パターンになるかどうかですが、無視できないほどコンピュータに負担がかかりますか?

                    • 7. Re: 同一視検索について
                      Shin

                      FM4の時代から、人名で同様の処理を行っていました。異体字が極めて多く、十数万人のリストの中の数%で使われていましたね。

                      FM7以降では、 Substitute ( text ;[ "國" ; "国" ];... ) という式で行っていました。その式は、換字用のテーブルを作っておき、その内容からその文字列を計算式で作り、Evaluate() 関数を使って作成させていました。換字用のテーブルの管理だけでしたので、FM6以前の時と比べて、かなり楽になっていました。