案件一覧から条件に合うものだけを拾うスクリプトを書いて、しばらく使っていました。
一覧を取得し、募集本文を開き、除外したい語が入っていたら落とす。よくある形です。除外語はこう置いていました。
x.ng = [
/zoom|通話|面談/.test(body) && '面談',
/サービス外連絡/.test(body) && '外部連絡',
/公式LINE/.test(body) && 'LINE',
].filter(Boolean)
面談が要る案件は受けられない。外部での連絡を求めるものも受けられない。だから落とす。意図としては正しいはずでした。
通過率が低すぎることに気づいた
本文まで確認した245件のうち、条件を通ったのは22件でした。実測です。通過率9%。
最初は「条件が厳しいのだから、こんなものだろう」と思いました。実際、除外理由の内訳を出すまではそう思っていました。
外部連絡 173件
面談 64件
外部フォーム 12件
重複 8件
LINE 3件
外部連絡が173件。全体の70%です。ここで手が止まりました。7割が同じ理由で落ちるのは、条件が厳しいのではなく、条件の当て方が壊れている。
落ちた案件の本文を1件だけ開いた
該当した箇所を前後ごと出力しました。
...応募画面へ 気になる メッセージ MLMや購入代行など悪質な案件が増加しております
(詳細)。ご契約前後に関わらず、「サービス外連絡申請」の承認前に連絡先
(電話番号やメールアドレス、チャットIDなど)を聞かれた場合には、
お手数ですが辞退をお願いいたします...
募集者が書いた文ではありませんでした。サイトが全ページに出している注意書きです。
「サービス外連絡」という語は、それを禁止する側の警告文にこそ必ず入ります。私は、違反を警告する文言を、違反の証拠として数えていました。
同じことが「面談」でも起きていました。メッセージ欄の下に常時出ている案内文に、こう書かれていたからです。
要件説明の面談(ウェブ会議・電話連絡)など、やむを得ない事情がある場合は、
サービス外連絡申請を行い、事務局に承認を得てください
本文の切り出しが甘かった
原因はもう一つ手前にありました。本文をこう取っていました。
const i = t.indexOf('仕事の詳細');
const j = t.indexOf('この仕事の特徴');
const b = t.slice(i + 5, j > i ? j : i + 2600);
終端の目印が見つからないときは、開始から2,600字を機械的に取る。この保険が効いた案件では、募集本文を通り越してページ下部の定型文まで拾っていました。目印が無いページほど広く取る、という設計が、そのまま誤検出の量になっていました。
直し方
除外語を当てる前に、サイトの定型文を落とすだけです。
CW.clean = function (b) {
return b
.replace(/MLMや購入代行など悪質な案件が増加しております[\s\S]{0,400}?辞退をお願いいたします。?/g, ' ')
.replace(/メッセージガイドラインに則り[\s\S]{0,300}?承認を得てください。?/g, ' ')
.replace(/ご契約前後に関わらず[\s\S]{0,200}?承認を得てください。?/g, ' ');
};
同じ245件を、同じ条件で測り直しました。
修正前 通過 22件
修正後 通過 96件
実測です。4倍以上を取りこぼしていました。
念のため、修正後に残った「面談」64件も中身を確かめました。こちらは本物でした。「Zoomでのオンライン通話 60分」「来社インタビュー 場所:弊社オフィス」といった記述で、落として正しいものです。除外条件そのものは間違っていなかった、ということになります。
数えるまで気づけなかった
この不具合は、出力を見ているだけでは分かりませんでした。通過した22件はどれも条件に合っていたからです。誤検出は、偽陽性ではなく偽陰性として出ます。落とした側は画面に出ないので、正しく動いているように見えます。
気づけたのは、除外理由を件数で出したからでした。それ以外に手がかりはありませんでした。
一つの理由が全体の7割を占めていたら、その理由の中身を1件だけ開く。これだけで足ります。所要は数分でした。
残しておく教訓
禁止事項を検出する語は、禁止を告知する文にも入っている。
利用規約、注意書き、ガイドラインへの導線。この種の文はページの全件に出ます。だから誤検出も全件に出ます。「サービス外連絡」「面談」「直接契約」「勧誘」あたりを条件に使うなら、当てる前に定型文を落とす。
そして、フィルタを書いたら**通過率と除外理由の内訳を必ず出す。**片方だけでは足りません。通過率が低いことには理由がつけられてしまいますが、内訳の偏りには理由をつけにくいからです。