作物名検索語の前処理

このトピックの投稿一覧へ

なし 作物名検索語の前処理

msg# 1
depth:
0
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2011.12.05 13:04 | 最終変更
OhYeah!  管理人   投稿数: 983 オンライン
ACFinder 公式サイトの1行コメントにあった想定外の作物が検索されてしまう件ですが、拗音・促音・濁音・半濁音・長音などの表記のユレに対応できるようにしたこと、作物の別名が登録されたことに起因します。全体的には便利になったはずですが、指摘のような弊害も発生してしまいます。
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;
}
投票数:0 平均点:0.00

投稿ツリー

  条件検索へ