Skip to content

LeeJaeRyun/CrossLink

Repository files navigation

一行紹介

クロスリンクマーケティングチームが運営する求人広告サイト「ハッピーリク」の企業審査プロセス自動化システムの開発


filterGUI

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 생성 완료 메시지 + “폴더 열기” 버튼

사용 방법 (exe 생성 절차)

  1. 필요한 라이브러리 설치 (최초 1회) pip install pandas openpyxl pyinstaller

  2. filter_core.py 와 gui_app.py 가 있는 디렉터리에서 아래 명령어 실행 pyinstaller --onefile --noconsole --name FilteredTool gui_app.py

[GUI ↔ Core 연결 구조]

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 が生成
完了メッセージ + 「フォルダを開く」ボタン

使用方法(exe生成手順)

  1. 必要なライブラリをインストール(初回のみ) pip install pandas openpyxl pyinstaller

  2. filter_core.py と gui_app.py が存在するディレクトリで、以下のコマンドを実行 pyinstaller --onefile --noconsole --name FilteredTool gui_app.py

[GUI ↔ Core 連携構造]

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状態更新(完了メッセージ等)
└─ 結果フォルダ自動オープン

버전업 변경점 (filterV2.py → filterV3.py)

🇰🇷 Korean Version (한국어판) をクリック
항목 변경사항
입력 포맷 XLSX → CSV
소개원 회사명 체크 ✅ 새로 추가 (check_intro_company_special())
소개원 특수기호 NG ✅ 새 컬럼 紹介元会社名表記 추가
직종 - 시설명 체크 ❌ 제거 (v2에서는 요확인)
직종 - 숫자 체크 ✅ 새로 추가 (숫자 포함 → 요확인)
🇯🇵 Japanese Version (日本語版) をクリック
項目 変更内容
入力形式 XLSX → CSV
紹介元会社名チェック ✅ 新規追加 (check_intro_company_special())
紹介元特殊記号 NG ✅ 新カラム 紹介元会社名表記 追加
職種 - 施設名チェック ❌ 削除 (v2では要確認)
職種 - 数字チェック ✅ 新規追加 (数字含む → 要確認)

버전업 변경점 (filter.py → filterV2.py)

🇰🇷 Korean Version (한국어판) をクリック

버전업 변경점 (filter.py → filterV2.py)

1) 입력 데이터/로드 방식 변경

  • filter.py: CSV 입력 → pd.read_csv() (인코딩 자동 감지: utf-8-sig/cp932/utf-8)
  • filterV2.py: XLSX 입력pd.read_excel()
    • 담당자 제공 데이터 포맷 변경(xlsx)에 맞춰 xlsx → xlsx 파이프라인으로 수정
    • 컬럼도 자동 매핑(pick_col) 대신 헤더 고정(실데이터 기준)

2) 최저임금 판정 로직 확장/고정(담당자 기준 반영)

  • 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): 想定外 → 要確認(환산 안 함)
    • 결과에 시급 환산값 + 환산 근거(説明/報告용) 출력
      • 時給換算値(円/時), 最低賃金_換算根拠

3) 都道府県 처리 방식 개선(보정/추정 추가)

  • filter.py

    • 都道府県 컬럼 값이 없거나 매칭 실패 시 要確認(都道府県不明)
    • 별도 추정 로직 없음
  • filterV2.py

    • 都道府県(addressRegion) 값이 없거나 불명확한 경우 자동 보완
    • 우선순위:
      1. GFJ 都道府県
      2. 勤務地住所
      3. 市区町村
      4. (보조) 職種, 就業先会社名
    • 추정 근거도 最低賃金_換算根拠에 함께 남김

4) 職種(직종) 판정 기준 "실무형"으로 재정의(과다 NG 방지)

  • filter.py

    • 특정 키워드(未経験/在宅/募集/고용형태 등)가 포함되면 요확인
    • NG는 거의 "공란" 정도만 강하게 처리
  • filterV2.py

    • 지역명/지명 형태는 NG로 명확히 분리
      • 都道府県명 포함 → NG
      • ○○区/市/町/村/駅 형태 포함 → NG
    • 모집/급모/고용형태/근무시간/역할/조건 키워드는 要確認
      • 모집/조건/역할 등 "직종 외 정보 혼입"으로 보되, 바로 NG로 내리지 않음
    • 시설명은 要確認(NG 과다 방지)
    • 결과에는 理由(要約)로 사유가 남음(추적 가능)

5) 필수 항목 처리 기준 변경(더 엄격)

  • filter.py

    • "컬럼이 없음" → 要確認
    • "값 공란" → NG
    • 필수 항목에 都道府県 포함
  • filterV2.py

    • 엑셀 헤더 고정 전제라 "컬럼 없음" 케이스보다 값 공란을 강하게 NG 처리
    • 기본 필수 항목: 회사명/고용형태/직종/이메일/市区町村/unitText/minValue
    • 都道府県는 추정 가능하므로 필수 공란 NG에서 제외(대신 최저임금 파트에서 보완)

6) 출력(결과 컬럼) 강화

  • filter.py

    • 최저임금: 都道府県, 基準値, unitText, minValue, 判定根拠 중심
  • filterV2.py

    • 최저임금 관련 실무 검증용 컬럼 추가
      • 時給換算値(円/時)
      • 最低賃金_換算根拠 (都道府県 추정 근거 + 환산 근거 포함)
    • 디버그/근거 확인용 원문 컬럼 추가
      • 勤務地住所, 勤務時間/月平均所定労働時間, 職種(原文)

7) 판정 체계 유지(동일)

  • 두 버전 모두:
    • 하나라도 NG → 総合 NG
    • NG 없고 要確認 존재 → 総合 要確認
    • 전부 OK → 総合 OK
    • 출력 시트 구성 동일: 審査結果 / NGのみ / 要確認のみ
🇯🇵 Japanese Version (日本語版) をクリック

バージョンアップの変更点(filter.py → filterV2.py)

1) 入力データ/ロード方式の変更

  • filter.py: CSV 入力 → pd.read_csv()(エンコーディング自動検出: utf-8-sig/cp932/utf-8)
  • filterV2.py: XLSX 入力pd.read_excel()
    • 担当者提供データのフォーマット変更(xlsx)に合わせて xlsx → xlsx パイプラインに修正
    • カラムも 自動マッピング(pick_col) の代わりに ヘッダー固定(実データ基準)

2) 最低賃金判定ロジックの拡張/固定(担当者基準反映)

  • 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): 想定外 → 要確認(換算しない)
    • 結果に 時給換算値 + 換算根拠(説明/報告用) を出力
      • 時給換算値(円/時), 最低賃金_換算根拠

3) 都道府県処理方式の改善(補正/推定追加)

  • filter.py

    • 都道府県 カラムの値がない、またはマッチング失敗時 要確認(都道府県不明)
    • 別途推定ロジックなし
  • filterV2.py

    • 都道府県(addressRegion) の値がない、または不明確な場合、自動で補完
    • 優先順位:
      1. GFJ 都道府県 の値
      2. 勤務地住所
      3. 市区町村
      4. (補助) 職種, 就業先会社名
    • 推定根拠も 最低賃金_換算根拠 に一緒に記録

4) 職種判定基準を「実務型」に再定義(過度 NG 防止)

  • filter.py

    • 特定キーワード(未経験/在宅/募集/雇用形態等)が含まれると 要確認
    • NG はほぼ「空欄」程度のみ強く処理
  • filterV2.py

    • 地域名/地名形式は NG として明確に分離
      • 都道府県名を含む → NG
      • ○○区/市/町/村/駅 形式を含む → NG
    • 募集/急募/雇用形態/勤務時間/役職/条件キーワードは 要確認
      • 募集/条件/役職等の「職種以外の情報混在」と判断するが、即NG にしない
    • 施設名は 要確認(NG 過剰防止)
    • 結果には 理由(要約) で理由が記録(追跡可能)

5) 必須項目処理基準の変更(より厳格)

  • filter.py

    • 「カラムがない」→ 要確認
    • 「値が空欄」→ NG
    • 必須項目に 都道府県 を含む
  • filterV2.py

    • Excel ヘッダー固定を前提に、「カラムなし」ケースより 値の空欄をより強く NG 処理
    • 基本必須項目: 会社名/雇用形態/職種/メール/市区町村/unitText/minValue
    • 都道府県 は推定可能なため、必須空欄 NG から除外(代わりに最低賃金パートで補完)

6) 出力(結果カラム)の強化

  • filter.py

    • 最低賃金: 都道府県, 基準値, unitText, minValue, 判定根拠 中心
  • filterV2.py

    • 最低賃金関連 実務検証用カラムを追加
      • 時給換算値(円/時)
      • 最低賃金_換算根拠 (都道府県推定根拠 + 換算根拠を含む)
    • デバッグ/根拠確認用の原文カラムを追加
      • 勤務地住所, 勤務時間/月平均所定労働時間, 職種(原文) など

7) 判定体系を維持(同一)

  • 両バージョンとも:
    • 1つでも NG → 総合 NG
    • NG なく 要確認 あり → 総合 要確認
    • 全て OK → 総合 OK
    • 出力シート構成は同一: 審査結果 / NGのみ / 要確認のみ

filter.py 설명

🇰🇷 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

About

[Internship 2026.1~2026.2] クロスリンクマーケティングチームが運営するハッピーリークの自動化システム開発

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages