作物名検索語の前処理
OhYeah!
投稿数: 983
オンライン

ACFinder 公式サイトの1行コメントにあった想定外の作物が検索されてしまう件ですが、拗音・促音・濁音・半濁音・長音などの表記のユレに対応できるようにしたこと、作物の別名が登録されたことに起因します。全体的には便利になったはずですが、指摘のような弊害も発生してしまいます。
ACFinde の場合は「作物名完全一致」でこの弊害を回避していますが、携帯農薬検索では異なるアプローチをとっています。以前にも書いたような気がしますが、どのトピックか分からなくなったので、再度書いておきます。
具体的には、検索語を正規化(拗音・促音は大文字に変換、濁音・半濁音は清音に変換、長音は削除して「ひらがな」に統一)したあと、下記のような処理をして、目的外の作物を検索しないようにしています。Delphi だと文字列に case 文が使えないので、if else を多用することになりそうですが…。
ACFinde の場合は「作物名完全一致」でこの弊害を回避していますが、携帯農薬検索では異なるアプローチをとっています。以前にも書いたような気がしますが、どのトピックか分からなくなったので、再度書いておきます。
具体的には、検索語を正規化(拗音・促音は大文字に変換、濁音・半濁音は清音に変換、長音は削除して「ひらがな」に統一)したあと、下記のような処理をして、目的外の作物を検索しないようにしています。Delphi だと文字列に case 文が使えないので、if else を多用することになりそうですが…。
function conv_sakumotsu($str) {
switch ($str) {
case 'とまと': return '(?<!に)とまと';
case 'さくら': return 'さくら(?!そ|ん|す)';
case 'いね': return '(?<!か)いね(?!か|科|こ)|すいとう|りくとう';
case 'むき': return '(?<!と)むき';
case 'きひ': return '(?<!う)きひ';
case 'うめ': return '(?<!ゆ|よ)うめ';
case 'かき': return '(?<!さ)かき(?!る)';
case 'くり': return '(?<!す|み|つ|よ)くり(?!さ|ん|ふ)';
case 'なし': return '(?<!る|ち|ね)なし';
case 'もも': return '(?<!す|ま|い|ら)もも';
case 'ゆす': return 'ゆす(?!き)';
case 'うと': return '(?<!お|か|ふ|よ)うと(?!う)';
case 'かふ': return '(?<!り|た|ね|や)かふ(?!た)';
case 'ける': return '(?<!つ)ける';
case 'せり': return '(?<!は|う)せり';
case 'なす': return '(?<!た|な|ま|ひ)なす(?!な)';
case 'ねき': return '(?<!ま|と)ねき';
case 'はす': return 'はす(?!い|か|も)';
case 'ふき': return '(?<!い|わ)ふき';
case 'きく': return '(?<!ん|あ|う)きく(?!に|ち|な)';
case 'はら': return '(?<!す)はら';
case 'ゆり': return '(?<!ち)ゆり(?!の)';
case 'らん': return '(?<!か|く|し|す|と|ま|ふ|ん|お)らん';
case 'かし': return '(?<!め|ら)かし(?!す|つ|ゆ|よ|ら|ろ|わ)';
case 'きり': return '(?<!つ)きり(?!え|は)';
case 'すき': return '(?<!あ|お|み|ゆ)すき';
case 'つけ': return '(?<!け|ぬ|め|き)つけ(?!も)';
case 'ふう': return '(?<!う|ん)ふう(?!と)';
case 'ふな': return '(?<!み)ふな';
case 'まき': return 'まき(?!い|さ|ち|つ|な|ま|ろ|\(|\))';
case 'まつ': return '(?<!か|そ|と|ら|ろ)まつ(?!し|な|は|も)';
case 'やし': return '(?<!ち|ひ|ら)やし';
case 'しは': return '(?<!ろ)しは(?!い)';
case 'ちや': return '(?<!ほ|ん)ちや(?!い|ひ|と)';
case 'こま': return '(?<!え)こま(?!つ)';
}
$str = str_replace('しかまき', 'ちよくは', $str);
$str = str_replace('ちかまき', 'ちよくは', $str);
$str = str_replace('おおつふ', 'たいりゆう', $str);
$str = str_replace('こつふ', 'しようりゆう', $str);
$str = str_replace('かつか', 'かくか', $str);
$str = preg_replace('/(?<!ら)たねなし|種無(し)?/', 'むかく', $str);
$str = preg_replace('/たねあり|種有(り)?/', 'ゆうかく', $str);
$str = str_replace('非結球', 'ひけつきゆう', $str);
$str = str_replace('半結球', 'はんけつきゆう', $str);
$str = str_replace('西洋', 'せいよう', $str);
$str = str_replace('食用', 'しよくよう', $str);
$str = str_replace('ろち', 'ろし', $str);
$str = preg_replace('/(.*)?((露地|ろし|施設|しせつ|水耕|すいこう)(栽培|さいはい)?)(.*)?/', '\1\5\(\2', $str);
return $str;
}
投票数:2
平均点:5.00
投稿ツリー
-
作物名検索語の前処理 (OhYeah!, 2011.12.05 13:04)
-
Re: 作物名検索語の前処理 (kabe, 2011.12.07 12:32)
-
Re: 作物名検索語の前処理 (kabe, 2011.12.11 16:47)
-
Re: 作物名検索語の前処理 (OhYeah!, 2011.12.11 21:50)
-
-