クロスリンクマーケティングチームが運営する求人広告サイト「ハッピーリク」の企業審査プロセス自動化システムの開発
filterGUI (gui_app.py + filter_core.py) 🇰🇷 Korean Version (한국어판) をクリック
- 이 툴을 사용할 사용자들이 비개발자일 경우인 점을 고려하여 사용하기 쉽게 만들어달라는 요청을 하심에 따라 추가함
- GUI + exe로 배포
- filter_core_v2 -> 담당자님이 추가하신 조건 반영 (현재버전)
- 기존에는 「非公開+派遣社員」을 일괄 NG로 처리하고 있었으나, 담당자님 피드백에 따라 紹介元会社名의 입력 여부 및 내용에 따라 OK/NG를 분기하도록 로직을 수정하였음
사용자: FilteredTool.exe 더블클릭 → 창 뜸 → CSV 선택 → 실행 결과: Downloads\Filtered_list_YYYYMMDD_HHMMSS.xlsx 생성 완료 메시지 + “폴더 열기” 버튼
-
필요한 라이브러리 설치 (최초 1회) pip install pandas openpyxl pyinstaller
-
filter_core.py 와 gui_app.py 가 있는 디렉터리에서 아래 명령어 실행 pyinstaller --onefile --noconsole --name FilteredTool gui_app.py
gui_app.py (GUI 진입점)
│
├─ CSV 파일 선택 UI
│
├─ [실행] 버튼 클릭
│
└─ run() 메서드 호출
│
▼
filter_core.run_filter(csv_path, out_xlsx)
│
├─ CSV 인코딩 자동 감지
│ ├─ utf-8-sig
│ ├─ cp932
│ └─ utf-8
│
├─ 심사 체크 로직 실행 (총 9개)
│ ├─ check_required() # 필수 항목 누락 여부
│ ├─ check_email() # 이메일 형식 검증
│ ├─ check_employment() # 고용 형태 검증
│ ├─ check_company_special() # 회사명 특수문자
│ ├─ check_intro_company_special() # 소개회사 특수문자
│ ├─ check_private_intro() # 비공개 + 소개회사 공란
│ ├─ check_city_garbled() # 시/구/동 문자 깨짐
│ ├─ check_job_title() # 직종 혼입 여부
│ └─ judge_min_wage() # 최저임금 판정
│
├─ 심사 결과 DataFrame 생성
│
└─ Excel(.xlsx) 저장 (3개 시트)
├─ 審査結果 : 전체 결과
├─ NGのみ : NG 항목만
└─ 要確認のみ : 요확인 항목만
│
▼
결과 파일 경로 반환
│
▼
gui_app.py
├─ GUI 상태 업데이트 (완료 메시지 등)
└─ 결과 폴더 자동 오픈
- 최저임금(MIN_WAGE) 값을 GUI에서 직접 수정 가능하도록 기능을 추가함.
- GUI에서 변경한 값을 JSON 파일로 저장(영속화) 하여, 다음 실행 시에도 동일한 값이 자동 반영되도록 개선함.
- 저장 파일이 없거나 읽기 실패 시에는 기본값(DEFAULT_MIN_WAGE)으로 자동 복구되도록 예외 처리함
filterGUI (gui_app.py + filter_core.py) 🇯🇵 Japanese Version (日本語版) をクリック
- 本ツールは、利用者が非開発者であることを考慮し、使いやすくしてほしいという要望を受けて追加しました
- GUI + exe 形式で配布
- filter_core_v2 → 担当者様が追加された条件を反映(現行バージョン)
- 以前は「非公開+派遣社員」を一律で NG と判定していましたが、担当者様のフィードバックにより、紹介元会社名の入力有無および内容に応じて OK / NG を分岐するロジックに修正しました
ユーザー:FilteredTool.exe をダブルクリック → 画面表示 → CSV選択 → 実行
結果:Downloads\Filtered_list_YYYYMMDD_HHMMSS.xlsx が生成
完了メッセージ + 「フォルダを開く」ボタン
-
必要なライブラリをインストール(初回のみ) pip install pandas openpyxl pyinstaller
-
filter_core.py と gui_app.py が存在するディレクトリで、以下のコマンドを実行 pyinstaller --onefile --noconsole --name FilteredTool gui_app.py
gui_app.py (GUIエントリーポイント)
│
├─ CSVファイル選択 UI
│
├─ [実行] ボタンクリック
│
└─ run() メソッド呼び出し
│
▼
filter_core.run_filter(csv_path, out_xlsx)
│
├─ CSVエンコーディング自動判定
│ ├─ utf-8-sig
│ ├─ cp932
│ └─ utf-8
│
├─ 審査チェックロジック実行(全9項目)
│ ├─ check_required() # 必須項目の欠落有無
│ ├─ check_email() # メール形式検証
│ ├─ check_employment() # 雇用形態検証
│ ├─ check_company_special() # 会社名の特殊文字
│ ├─ check_intro_company_special() # 紹介会社名の特殊文字
│ ├─ check_private_intro() # 非公開 + 紹介会社名未入力
│ ├─ check_city_garbled() # 市・区・町名の文字化け
│ ├─ check_job_title() # 職種混在有無
│ └─ judge_min_wage() # 最低賃金判定
│
├─ 審査結果 DataFrame 作成
│
└─ Excel(.xlsx) 保存(3シート)
├─ 審査結果 : 全体結果
├─ NGのみ : NG項目のみ
└─ 要確認のみ : 要確認項目のみ
│
▼
結果ファイルパス返却
│
▼
gui_app.py
├─ GUI状態更新(完了メッセージ等)
└─ 結果フォルダ自動オープン
🇰🇷 Korean Version (한국어판) をクリック
| 항목 | 변경사항 |
|---|---|
| 입력 포맷 | XLSX → CSV |
| 소개원 회사명 체크 | ✅ 새로 추가 (check_intro_company_special()) |
| 소개원 특수기호 NG | ✅ 새 컬럼 紹介元会社名表記 추가 |
| 직종 - 시설명 체크 | ❌ 제거 (v2에서는 요확인) |
| 직종 - 숫자 체크 | ✅ 새로 추가 (숫자 포함 → 요확인) |
🇯🇵 Japanese Version (日本語版) をクリック
| 項目 | 変更内容 |
|---|---|
| 入力形式 | XLSX → CSV |
| 紹介元会社名チェック | ✅ 新規追加 (check_intro_company_special()) |
| 紹介元特殊記号 NG | ✅ 新カラム 紹介元会社名表記 追加 |
| 職種 - 施設名チェック | ❌ 削除 (v2では要確認) |
| 職種 - 数字チェック | ✅ 新規追加 (数字含む → 要確認) |
🇰🇷 Korean Version (한국어판) をクリック
- filter.py: CSV 입력 →
pd.read_csv()(인코딩 자동 감지: utf-8-sig/cp932/utf-8) - filterV2.py: XLSX 입력 →
pd.read_excel()- 담당자 제공 데이터 포맷 변경(xlsx)에 맞춰 xlsx → xlsx 파이프라인으로 수정
- 컬럼도 자동 매핑(pick_col) 대신 헤더 고정(실데이터 기준)
-
filter.py
- 최저임금 판정은
unitText + minValue만 사용 - **시급(HOUR)**만 자동 비교하여 OK/NG
- DAY/MONTH/YEAR/WEEK는 전부 要確認(환산 필요)
- 최저임금 판정은
-
filterV2.py
- 최저임금 판정은 동일하게
unitText + minValue만 사용(給与 텍스트 미사용 유지) - 담당자 지정 환산 기준으로 시급 환산 후 OK/NG 자동 판정
- 日給(DAY): 8시간 기준 환산
- 月給(MONTH): 160시간(8h×20d) 기준 환산
- 年収/年俸(YEAR): 1920시간(160h×12m) 기준 환산
- 週給(WEEK): 想定外 → 要確認(환산 안 함)
- 결과에 시급 환산값 + 환산 근거(説明/報告용) 출력
時給換算値(円/時),最低賃金_換算根拠
- 최저임금 판정은 동일하게
-
filter.py
都道府県컬럼 값이 없거나 매칭 실패 시 要確認(都道府県不明)- 별도 추정 로직 없음
-
filterV2.py
都道府県(addressRegion)값이 없거나 불명확한 경우 자동 보완- 우선순위:
- GFJ
都道府県값 勤務地住所市区町村- (보조)
職種,就業先会社名
- GFJ
- 추정 근거도
最低賃金_換算根拠에 함께 남김
-
filter.py
- 특정 키워드(未経験/在宅/募集/고용형태 등)가 포함되면 요확인
- NG는 거의 "공란" 정도만 강하게 처리
-
filterV2.py
- 지역명/지명 형태는 NG로 명확히 분리
- 都道府県명 포함 → NG
○○区/市/町/村/駅형태 포함 → NG
- 모집/급모/고용형태/근무시간/역할/조건 키워드는 要確認
- 모집/조건/역할 등 "직종 외 정보 혼입"으로 보되, 바로 NG로 내리지 않음
- 시설명은 要確認(NG 과다 방지)
- 결과에는
理由(要約)로 사유가 남음(추적 가능)
- 지역명/지명 형태는 NG로 명확히 분리
-
filter.py
- "컬럼이 없음" → 要確認
- "값 공란" → NG
- 필수 항목에
都道府県포함
-
filterV2.py
- 엑셀 헤더 고정 전제라 "컬럼 없음" 케이스보다 값 공란을 강하게 NG 처리
- 기본 필수 항목: 회사명/고용형태/직종/이메일/市区町村/unitText/minValue
都道府県는 추정 가능하므로 필수 공란 NG에서 제외(대신 최저임금 파트에서 보완)
-
filter.py
- 최저임금:
都道府県,基準値,unitText,minValue,判定根拠중심
- 최저임금:
-
filterV2.py
- 최저임금 관련 실무 검증용 컬럼 추가
時給換算値(円/時)最低賃金_換算根拠(都道府県 추정 근거 + 환산 근거 포함)
- 디버그/근거 확인용 원문 컬럼 추가
勤務地住所,勤務時間/月平均所定労働時間,職種(原文)등
- 최저임금 관련 실무 검증용 컬럼 추가
- 두 버전 모두:
- 하나라도 NG → 総合 NG
- NG 없고 要確認 존재 → 総合 要確認
- 전부 OK → 総合 OK
- 출력 시트 구성 동일:
審査結果 / NGのみ / 要確認のみ
🇯🇵 Japanese Version (日本語版) をクリック
- filter.py: CSV 入力 →
pd.read_csv()(エンコーディング自動検出: utf-8-sig/cp932/utf-8) - filterV2.py: XLSX 入力 →
pd.read_excel()- 担当者提供データのフォーマット変更(xlsx)に合わせて xlsx → xlsx パイプラインに修正
- カラムも 自動マッピング(pick_col) の代わりに ヘッダー固定(実データ基準)
-
filter.py
- 最低賃金判定は
unitText + minValueのみ使用 - 時給(HOUR) のみ自動比較で OK/NG
- DAY/MONTH/YEAR/WEEK は全て 要確認(換算必要)
- 最低賃金判定は
-
filterV2.py
- 最低賃金判定は同様に
unitText + minValueのみ使用(給与テキスト未使用を維持) - 担当者指定の換算基準で時給に換算後、OK/NG を自動判定
- 日給(DAY): 8時間 基準で換算
- 月給(MONTH): 160時間(8h×20d) 基準で換算
- 年収/年俸(YEAR): 1920時間(160h×12m) 基準で換算
- 週給(WEEK): 想定外 → 要確認(換算しない)
- 結果に 時給換算値 + 換算根拠(説明/報告用) を出力
時給換算値(円/時),最低賃金_換算根拠
- 最低賃金判定は同様に
-
filter.py
都道府県カラムの値がない、またはマッチング失敗時 要確認(都道府県不明)- 別途推定ロジックなし
-
filterV2.py
都道府県(addressRegion)の値がない、または不明確な場合、自動で補完- 優先順位:
- GFJ
都道府県の値 勤務地住所市区町村- (補助)
職種,就業先会社名
- GFJ
- 推定根拠も
最低賃金_換算根拠に一緒に記録
-
filter.py
- 特定キーワード(未経験/在宅/募集/雇用形態等)が含まれると 要確認
- NG はほぼ「空欄」程度のみ強く処理
-
filterV2.py
- 地域名/地名形式は NG として明確に分離
- 都道府県名を含む → NG
○○区/市/町/村/駅形式を含む → NG
- 募集/急募/雇用形態/勤務時間/役職/条件キーワードは 要確認
- 募集/条件/役職等の「職種以外の情報混在」と判断するが、即NG にしない
- 施設名は 要確認(NG 過剰防止)
- 結果には
理由(要約)で理由が記録(追跡可能)
- 地域名/地名形式は NG として明確に分離
-
filter.py
- 「カラムがない」→ 要確認
- 「値が空欄」→ NG
- 必須項目に
都道府県を含む
-
filterV2.py
- Excel ヘッダー固定を前提に、「カラムなし」ケースより 値の空欄をより強く NG 処理
- 基本必須項目: 会社名/雇用形態/職種/メール/市区町村/unitText/minValue
都道府県は推定可能なため、必須空欄 NG から除外(代わりに最低賃金パートで補完)
-
filter.py
- 最低賃金:
都道府県,基準値,unitText,minValue,判定根拠中心
- 最低賃金:
-
filterV2.py
- 最低賃金関連 実務検証用カラムを追加
時給換算値(円/時)最低賃金_換算根拠(都道府県推定根拠 + 換算根拠を含む)
- デバッグ/根拠確認用の原文カラムを追加
勤務地住所,勤務時間/月平均所定労働時間,職種(原文)など
- 最低賃金関連 実務検証用カラムを追加
- 両バージョンとも:
- 1つでも NG → 総合 NG
- NG なく 要確認 あり → 総合 要確認
- 全て OK → 総合 OK
- 出力シート構成は同一:
審査結果 / NGのみ / 要確認のみ
🇰🇷 Korean Version (한국어판) をクリック
filter.py는 JobMasterList CSV 파일을 입력으로 받아
하피리크 원고 심사 기준에 따라 구인 원고를 1차 자동 필터링하는 스크립트입니다.
각 원고에 대해 OK / 요확인 / NG 판정을 수행하고,
결과를 Excel(.xlsx) 파일로 출력합니다.
본 스크립트는 사람 심사 이전 단계에서
명확한 오류 원고를 사전에 제거하고,
추가 확인이 필요한 원고를 분리하는 것을 목표로 합니다.
- 회사명, 고용형태, 직종, 이메일, 도도부현, 급여형태, 급여하한
- 값이 비어 있으면 NG
- 컬럼이 없으면 요확인
- 이메일 형식이 올바르지 않으면 NG
- 허용된 고용형태와 완전 일치하지 않으면 NG
- 직종 외 조건·광고 문구가 포함된 경우 요확인
- 직종이 비어 있으면 NG
- ㈱, (株) 등 특수기호가 포함된 경우 NG
- 회사명이
비공개인데 소개회사명이 없으면 NG - 비공개 + 파견직은 NG
- 문자 깨짐이 의심되면 NG
- 값이 없으면 요확인
급여형태(unitText)+급여하한(minValue)만 사용- 시급(HOUR) 인 경우만 자동 판정
- 최저임금 미만이면 NG
- 시급 외 급여형태는 요확인
- 하나라도 NG → 종합 NG
- NG 없고 요확인 있음 → 종합 요확인
- 전부 OK → 종합 OK
🇯🇵 Japanese Version (日本語版) をクリック
filter.py は、JobMasterList の CSV ファイルを入力として読み込み、
ハピリク原稿審査基準に基づいて 求人原稿の一次自動フィルタリング を行うスクリプトです。
各原稿に対して OK / 要確認 / NG の判定を行い、
結果を Excel(.xlsx)形式 で出力します。
本スクリプトは、人手による本審査の前段階として、
明確な不備のある原稿を事前に除外し、
確認が必要な原稿を切り分けることを目的としています。
- 会社名、雇用形態、職種、メールアドレス、都道府県、給与形態、給与下限
- 値が空欄の場合:NG
- 列が存在しない場合:要確認
- メール形式が正しくない場合:NG
- 許可されている雇用形態と 完全一致 しない場合:NG
- 職種以外の条件・広告文言が含まれる場合:要確認
- 職種が空欄の場合:NG
- ㈱、(株) などの特殊記号が含まれる場合:NG
- 就業先会社名が「非公開」で、紹介会社名が空欄の場合:NG
- 非公開かつ雇用形態が派遣社員の場合:NG
- 文字化けの可能性がある場合:NG
- 値が空欄の場合:要確認
給与形態(unitText)と給与下限(minValue)のみを使用- 時給(HOUR) の場合のみ自動判定
- 最低賃金未満の場合:NG
- 時給以外の給与形態(日給・月給・年俸など)は:要確認
- いずれかが NG の場合:総合判定 NG
- NG がなく、要確認 を含む場合:総合判定 要確認
- すべて OK の場合:総合判定 OK