言い換え表現の組み合わせ爆発に注意

言い換え表現の組み合わせ爆発に注意

言い換え表現の組み合わせ爆発について簡単に解説します

このページでの用語
OR連結表記: (a|b|c) のような書き方
組み合わせ爆発: 1個のHelpfeel記法文から予想以上の組み合わせが生成されて、展開過程およびブラウザ上で、メモリに保持できなくなったり検索速度が著しく低下したりすること

まとめ
大きなOR連結表記を複数使うと危ない
小さなOR連結表記でも複数使うと巨大になるケースがあるので危ない
劣後の使用の有無は関係ない

具体例で展開数を観察する
大きなOR連結表記を1個だけ使う
? (a|b|c|d|e|f|g|h|i|j)の値段は?
10通り
並べた要素数にしか展開されないので把握しやすい
複数のGlossaryを使っているときは気づきにくいので要注意

危険
小さなOR連結表記を複数使って巨大になっているケース
? (今年||数え年){age20s}・{age50s}(歳|才)(以下|未満)
age20s: (29|28|27|26|25|24|23|22|21|20)
age50s: (59|58|57|56|55|54|53|52|51|50)
3 * 10 * 10 * 2 = 600通り
? (| A1)(| A2)(| A3)(| A4)(| A5)(| B1)(| B2)(| B3)(| B4)(| B5)の用紙がほしい
「A4 B5の用紙がほしい」のような表現を狙った書き方
一見10通りに見えるが、これは正しくは2の10乗で1024通り
Glossaryが別のGlossaryを参照するケース
? 製品の(お得な|おすすめ){info}を知りたい
info: ({coupon}|(新|季節の){menu}|情報)

勢いはないが注意すべきケース
? (a|b|c|d|e|f|g|h|i|j)の(定価|値段|価格)は?
10 * 3 = 30通り
これくらいならセーフ
? (a|b|c|d|e|f|g|h|i|j)と(a|b|c|d|e|f|g|h|i|j)をセットで買う
10 * 10 = 100通り
? (a|b|c|d|e|f|g|h|i|j)の{price}は?
Glossaryの price の定義次第だが、気づかぬ間に大きくなっている可能性があるので要注意

解決策
? ({over65}|{64_40}|{39_18}|{17_12})(歳|:才)の接種予定は、いつ頃ですか?
このような質問文の場合、以下のように複数行に分けて書いてもらうのがベスト
{over65}(歳|:才)の接種予定は、いつ頃ですか?
{64_40}(歳|:才)の接種予定は、いつ頃ですか?
{39_18}(歳|:才)の接種予定は、いつ頃ですか?
{17_12}(歳|:才)の接種予定は、いつ頃ですか?
Powered by Helpfeel