Chinese Job Posting Classifier / 中文招聘信息识别(ONNX INT8)
A CPU-oriented Chinese binary text classifier that decides whether a piece of text contains concrete job-posting / hiring information (y) or not (n). It is built for filtering social-media posts, complaints, comments, and image-OCR text, where most content talks about jobs and recruitment without actually being a job ad.
中文简介:判断一段中文文本是否包含具体的招人/招工信息,用于招聘信息识别、招工帖检测、招聘广告分类和非招聘内容过滤。适用于社交平台帖子、投诉、评论和截图 OCR 文本;能区分“发布招聘”与“讨论招聘、被骗避雷、求职找活”。
The model is fine-tuned from hfl/chinese-roberta-wwm-ext (12 layers) and exported as a dynamically quantized INT8 ONNX model. Inference needs only onnxruntime, tokenizers, and numpy — no PyTorch or Transformers.
What counts as y
y means someone in the text is hiring and at least one hiring element is stated: job title or trade, salary, headcount, work location, requirements, or contact / application method. This includes:
- Regular job ads, including internet / tech roles (engineer, product manager, operations, intern …)
- Job-detail screenshots from recruitment apps (via OCR)
- Very short postings such as
无锡市惠山区招拆架("hiring scaffolding workers in Huishan, Wuxi") - Job descriptions that only list responsibilities and requirements
- Concrete hiring content quoted inside a post or complaint, and part-time / day-labor recruitment (even if suspicious)
n covers everything else, notably:
- Job seekers and service providers ("I can weld, looking for work")
- Posts that only discuss recruitment: scam reports, company warnings, platform complaints, interview results
- Recruitment-platform ads and app UI screens without a concrete opening
- Consumer complaints, training ads, news, and unrelated chat
Quick start
Python 3.10 or newer is recommended.
pip install -U huggingface_hub
hf download AxcLogo/chinese-job-posting-classifier --local-dir chinese-job-posting-classifier
cd chinese-job-posting-classifier
pip install -r requirements.txt
python inference.py "急招前端开发2名,熟悉Vue3/React,深圳南山,15-25K"
Python API:
from inference import JobPostingClassifier
classifier = JobPostingClassifier() # load once, reuse
print(classifier.classify("岗位职责:负责推荐系统召回与排序模型研发;任职要求:硕士及以上,熟悉PyTorch"))
# {'label': 'y', 'score': 0.9996...}
# A post = title + body + comments + OCR segments; any segment labelled y makes the post y
print(classifier.classify_document(["工厂避雷", "这家厂太坑了", "急招普工5名,月薪6000包吃住"]))
score is the probability of y. The bundled threshold is 0.30 (recall-leaning, selected on the development set). Pass threshold= to JobPostingClassifier to trade precision for recall.
Example outputs from example.py:
| Text | Label | Score |
|---|---|---|
| 【高级Java开发工程师】杭州·西湖区,25-40K·15薪 … 简历投递 | y | 0.9996 |
| 字节系独角兽招聘产品经理(用户增长方向),北京海淀,20-35K … | y | 0.9997 |
| 上海·徐汇 内容运营实习生,日薪200,每周到岗4天 … | y | 0.9995 |
| 无锡市惠山区招拆架 | y | 0.9995 |
| BOSS直聘上被HR骗了,交了培训费才说没岗位,大家避雷 | n | 0.0001 |
| 本人会电焊,从业8年,求职找活 | n | 0.0002 |
Model details
| Item | Value |
|---|---|
| Task | Chinese binary text classification (y / n) |
| Base model | hfl/chinese-roberta-wwm-ext (12-layer, revision 5c58d0b) |
| Input | One text segment; whitespace collapsed; head + tail kept up to 256 tokens |
| Output | label and score = P(y); threshold 0.30 |
| Runtime | ONNX Runtime CPUExecutionProvider |
| Quantization | Per-channel dynamic INT8 MatMul + column-wise INT8 word embeddings |
| Model size | 99.8 MiB |
| Maximum input | 200,000 Unicode code points per call (truncated to 256 tokens) |
Evaluation
Evaluated on a frozen blind test drawn from the target domain: Chinese social-media posts, complaints, comments, and image OCR, split by post so all segments of a post stay in one split. The blind test was held out with an independent seed and was not used for training, model selection, or threshold selection. It was run once.
| Level | Accuracy | Macro-F1 | y precision |
y recall |
y F1 |
|---|---|---|---|---|---|
Segment (1,912 segments, 143 y) |
0.9859 | 0.9460 | 0.9603 | 0.8462 | 0.8996 |
Post (974 posts, any segment y) |
0.9846 | 0.9647 | 0.9913 | 0.8906 | 0.9383 |
Segment-level y recall by source: image OCR 0.861 (129 positives), body 0.625 (8), comment 0.667 (3), title 1.0 (3).
Backbone comparison on the same 5,987-segment development set (286 y), threshold selected on that set:
| Backbone | ONNX size | Segment macro-F1 | Post macro-F1 |
|---|---|---|---|
hfl/rbt3 (3 layers) |
44.9 MiB | 0.8966 | 0.9290 |
hfl/rbt6 (6 layers) |
65.4 MiB | 0.9122 | 0.9449 |
hfl/chinese-roberta-wwm-ext (12 layers, released) |
99.8 MiB | 0.9244 | 0.9477 |
CPU throughput on Apple M4 with two ONNX Runtime threads, processing the 1,912 blind-test segments one at a time: 40.7 segments/s, about 24.6 ms per segment on average. Throughput depends on text length; short titles are much faster than long OCR text.
Training data
About 19,000 training segments from Chinese social media, complaint platforms, comments, and image OCR, plus 1,500 real job postings and 785 job-seeker self-introductions as hard negatives. Every training, development, and blind-test segment was labelled independently by two LLM annotators from different model families; disagreements were resolved by a third, blind adjudicator model. Labels are therefore model-generated, not human gold. The source data is not distributed and includes non-public domain data.
Limitations
- Chat screenshots between recruiters and candidates are the hardest case and the main source of misses.
- Body, comment, and title positives are rare in the blind test (14 in total), so per-source recall estimates are unstable.
- The model judges each segment on its own; it does not verify whether a job is real, legal, or a scam.
- Intended for Chinese text; other languages have not been evaluated.
- Do not use predictions alone for legal, employment, or other high-impact decisions.
Files
| File | Purpose |
|---|---|
model.onnx |
INT8-quantized sequence-classification model |
tokenizer.json |
Matching WordPiece tokenizer |
model_meta.json |
Labels, max length, truncation window, threshold |
inference.py |
Standalone Python / CLI inference |
example.py |
Usage examples, including internet-industry job posts |
requirements.txt |
Minimal CPU inference dependencies |
SHA256SUMS |
Integrity hashes for model files |
License
Apache License 2.0. See LICENSE. The base model hfl/chinese-roberta-wwm-ext is also released under Apache 2.0.
Citation
No paper is associated with this release. When referencing the model, cite this repository and the exact revision used:
@misc{axclogo_chinese_job_posting_classifier_2026,
author = {AxcLogo},
title = {Chinese Job Posting Classifier (ONNX INT8)},
year = {2026},
howpublished = {Hugging Face model repository},
url = {https://huggingface.co/AxcLogo/chinese-job-posting-classifier}
}
Model tree for AxcLogo/chinese-job-posting-classifier
Base model
hfl/chinese-roberta-wwm-ext