FCafe  ファジー・マッチング

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

 Google で検索を行う際、検索語を誤って入力してしまう事がありますが、そんな時 「もしかしてxxxx」 という風に別候補を提示された経験は誰しも一度はお持ちではないかと。 これが大抵の場合その通りなんでありますから感心してしまいます。  (” あいまい検索”とでも言えば良いのでしょうか ・・なんと賢くていらっしゃる )
 G先生のレベルまでとはいかなくても、KWでの検索をもう少し柔軟に行いたいものだとは以前から思っておりまして、Step Search の時にKWのタグ転換などを試みたりした訳ですが、その際 「今後の課題」 とさせていただいていた事項がこの連休中に進展がありましたので御報告。

 スクリプトで検索や置換を行おうとする場合、英語環境なら単語を構成するアルファベットは26文字のみですし、大文字・小文字の区別は無視するオプションも存在する訳ですが、日本語環境ですと平仮名とカタカナを同一扱いするオプションなどは存在しませんし、英単語にしても全角と半角では全くの”別物”となってしまいます。  "アリス" で "ありす" を、"daniel" で "Daniel" を検索することはできません。
 「課題」 とはこれを何とかしたい、という事だった訳ですが、何とかすることができました(と思います)。 それも、比較的(というよりかなり)短いコードで。

sample


 Step Search では検索語と一致(近似)するユーザータグを探すのに ”= =”式ではなく相互の包含関係に拠っていましたが その近似性チェック機能を拡張する為に開発したのが 上のサンプルファイル中でも用いられている以下の(スクリプト)関数です

function toReg(str){
var A="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz@あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんがぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽぁぃぅぇぉゃゅょ一二三四五六七八九十";
var B="1234567890abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz@アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポァィゥェォャュョ1234567890";
var n;
str=str.replace(/[\+\-_・'+-ー_・’]/gi,"").toLowerCase();
for(i=0;i<str.length;i++){
 n=A.indexOf(str.charAt(i)); if( n!=-1){
  str=str.replace(A.charAt(n),B.charAt(n));
 } } return str; 
}

function Compare(s1,s2){
if(s1==s2) return 1;
s1=toReg(s1) ; s2=toReg(s2);
if(s1.indexOf(s2)!=-1 || s2.indexOf(s1)!=-1) return 2;
return 0;
}

.

【 解 説 】 関数  toReg(str) は文字列 str を以下の要領で”(独自)標準形式”に変換します。

  1. 全角・半角の一部(語句結合・挿入)記号を文字列中から削除します
  2. 文字列中の半角英大文字を半角小文字に変換します
  3. 文字列中の全角数字を半角数字に変換します
  4. 文字列中の全角英字を半角小文字に変換します
  5. 文字列中の(旧かなを除く)平仮名をカタカナに変換します
  6. (一部)漢数字を半角数字に変換します

 関数  Compare(s1,s2) は文字列 s1 と s2 を比べます。 同じ文字列の場合は 1 を返し、そうでない場合は双方を toReg 関数で変換してそれら相互の包含関係を調べ ,どちらかが成り立てば 2  を返します。 成り立たない場合は 0 を返します。

Step Search 方式で近似性をチェックする前に 比較する物とされる物を共に同じアルゴリズムで標準化(?)しておく、というのがミソなのですが如何でしょうか。
「Alice」と「アリス」を”同じ”と判じるには膨大な辞書的データが必要ですが、「Alice」と「alice」、「ありす」と「アリス」、ならこの方法で簡単にマッチさせる事ができます。 「M’sBar」と「Ms_bar」 も然り。 「二人」と「2人」も同様です。
( 漢数字変換については”二十日”と書く人はいても”二十三日”と書く人は少ないだろう、と考え、このような形としました。 ソースを可及的に簡潔にする為、というのもありますが ”十五夜”を”15夜”で検索する人もあまりいないでしょうし・・ )

 Compare の戻り値の設定は中途半端でしょうか。  true/false の2値、或いはもっと細かな設定も可能です

Comment


.  
HN Title URL PW secret

TrackBack http://pcafe.blog3.fc2.com/tb.php/520-03a84632

Shown after Admisson
ポエツ | poets *
主要なブログサービスにはだいたい記事本文を対象にした検索機能が付いています。検索機能がない場合は Googleの指定URL下を検索する機能(参照)が利用されることが多いです。でもFC2ブログユーザでも既存の検索機能ではなく、
.

≫ Step Search 改訂 コメント検索 Coocle ≪

2007 / 11 / 25  Sun
General   
Comment 0 / TB 1 / Edit
Designed by Daniel Corporation . all rights renounced
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。