news 2026/10/15 21:42:10

从相册到SQLite:如何用截图复盘法攻克SHL测评

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从相册到SQLite:如何用截图复盘法攻克SHL测评

简介:这份《SHL真题截图》面向准备SHL在线评估的求职者,尤其是IT行业候选人,浓缩数理逻辑、语言理解、时间管理、数据解读等高频题型,适合考前快速熟悉出题风格。文档以1个doc文件承载,压缩包仅约1.49MB,虽体量精简但内容覆盖1~22题完整作答记录;作者不仅标出9个错误答案,还保留了百分比、乘除计算、时间比例、概率判断、数据充分性、趋势预测、单位换算、城市地理和分析推理等题型线索。通过核对原题与答案差异,读者能定位自身薄弱点,练习在时间压力下抓取关键信息,例如面对“13:7”时先判断时间还是比例关系,面对“Cannot say”时学会区分信息不足与可推断情形。已有344人学习,适合正在刷题冲刺、希望查漏补缺并提升商业数据分析敏感度的应聘者使用。

1. 先搞清楚「SHL真题截图」在解决什么问题

A同学把一个测评链接点开三次,又退出去三次:语言题读了三行就卡住,数字题算到一半时间到。最后他想起前同事的提醒——把练习时做的每一道题都截图存下来,当晚按题型归一次类。这个动作就是SHL真题截图。它不玄学,本质是把一次性的在线测评,变成可以反复拆解的练习素材。SHL测评是招聘方常用的在线测评选型,题面结构化、题库逻辑稳定,第一次见的人很容易被它的限时机制打个措手不及。这里要解决的问题,正是怎么让这些截图不只是躺在手机相册里吃灰,而变成一套能定位薄弱点、能统计正确率、能给出复盘结论的备考系统。适合三类人:收到测评链接的求职者、需要带学员练题的辅导者、想搞懂这套测评估值逻辑的从业者。

注意一个边界:如果测评页面里明确写了题目不得外传,那截图只留给自己做个人复盘,不要发到任何公开渠道。下面所有操作,都建立在“自己做题自己复盘”这个前提下。

2. 从题型反推:SHL测评到底在测什么?截图前先看懂卷子结构

2.1 通用能力测验的数字题:不是数学考试,是读题考试

拿最常见的通用能力测验来说,数字题基本是给一段简短的业务场景,配一张柱状图、折线图或带行列的表格,然后问同比、环比、占比、利润率这类问题。难点在于限时非常紧,我见过不少被卡死的情况,不是不会算,而是光看清“哪一行哪一列、单位是千还是百万”就用掉接近一半时间。

所以截图前要有预期:这套题考的不是求导解方程,而是快速定位数据、抓准计算口径、三步内估算出结果。截的时候也有讲究,图表上下边界要截全,选项要截进去,因为你复盘时需要知道自己当时选了哪个、为什么选。

做题顺序上我一般建议先把图表和问题读一遍,再回题面找条件。如果截图只截了问题没截到图表,这张图基本是废图,因为回看时缺少数据支撑,没法判断当时是定位错了还是计算错了。

2.2 语言推理:定位原文比判断本身更重要

语言题又是一类。它通常给你一段短文章,然后列三四个陈述,要求判断“正确、错误、无法判断”。很多人翻车在“无法判断”上,原因是考生习惯性地用自己的常识和背景知识去推断,而这类题要求的是严格贴合原文表达。

语言题真正的考点是定位能力和注意力精度。比如原文说“某产品在欧洲区销量连续三个季度上升”,陈述里换成“该产品在欧洲区的销量一直在增长”,这就是明显的扩大范围;再换成“该产品在欧洲区销量在第三季度继续上升”,那就是原文未提及。截图时我会顺手把原文里那一句关键证据用红框标出来,同时截到上下文,这样复盘时一眼就能看出自己当时定位到的句子,以及做判断时有没有跑偏。

2.3 性格测评:不追分数,追一致性

除了能力题,很多测评流程里还会配性格问卷。这类题没有标准答案,但它有自己的校验机制:同一个倾向会换着措辞反复出现,如果你的回答前后冲突,系统就会判定低可信度,甚至整份报告直接标红。很多人把性格题当成“按岗位画像选答案”的游戏,最后一到两个月后收到反馈说不一致,这就是典型的过度表演。

对性格题,截图的用法不是背答案,而是建锚点。答完一题后,如果这个选项触及了你的真实偏好,就截下来,在旁边批注一句“我当时为什么这么选”。比如你选择“更喜欢独立完成工作”,后续所有涉及团队协作的题都要围绕这个基调才不会被判矛盾。锚点越多,你在整套问卷里的自洽性越好,这种自洽比单题选择正确重要得多。

看懂卷子结构,才谈得上处理截图。否则你存的只是一堆分辨率不一的图片,不是素材库。

3. 从手机相册到备考系统:命名、OCR与批量清洗

3.1 一套能排序、能回溯的截图命名规则

截图一旦超过一百张,就会发现手机相册的时间线完全帮不上忙。它只能告诉你在哪个时间段截的,既搜不了题型,也筛不了错题。所以第一步是建立一套命名规则,我常用的格式是:

SHL_日期_来源_题型_原题序号_正误_知识点_备注.jpg

例如SHL_20260518_S1_数字_07_错_增长率_粗心看错单位.jpg。日期用来排序,来源字段标记这是第几次练习,题型和知识点用来筛选,正误字段方便后续统计。命名在整理文件时就做完,不要拖到后面。

把手机截图导到电脑后,可以用一个小脚本批量改名并复制到分类目录。下面是一个可跑的示例:

#!/usr/bin/env bash # 把手机导出的截图整理成统一命名,并落盘到分类目录 # 用法:./organize_shl.sh ./raw ./organized RAW_DIR="${1:-./raw}" # 手机导出的原始图片目录 OUT_DIR="${2:-./organized}" # 整理后的输出目录 STAMP="20260518" # 拍摄日期,按实际考试日期改 SOURCE="S1" # 来源标记,S1表示第1次练习 mkdir -p "$OUT_DIR" for file in "$RAW_DIR"/*.jpg; do # 从原始文件名中提取第一个数字串作为题序编号 index="$(basename "$file" | grep -oE '[0-9]+' | head -1)" # 先统一按未判定命名,后续人工标注正误 new_name="${STAMP}_${SOURCE}_未分类_${index}_待判_待定.jpg" cp "$file" "$OUT_DIR/$new_name" done echo "完成,共处理 $(ls "$OUT_DIR"/*.jpg | wc -l) 张截图。"

这个脚本的逻辑是先用日期、来源和题序做一层兜底命名,避免文件层面乱掉。参数说明:RAW_DIR和OUT_DIR是两个必传参数,不传就用当前目录下的./raw和./organized;STAMP建议用你实际做练习的日期,而不是截图日期,因为很多时候截图存到相册里已经跨天;SOURCE是一个很有用的维度,后续分析正确率时,可以按“第几次练习”看趋势,发现是不是做了三次之后就开始进入记忆状态。

命名是最容易被跳过的一步,但它决定了后面数据库能不能接得住。

3.2 用OCR把截图文字化成可检索文本

命名只能解决文件层面的检索,题目正文和选项内容还是图片里的一段像素。为了能在素材库中搜索“利润率”或“无法判断”,需要做OCR文字化。常见做法是命令行调用 Tesseract,把截图转成同名文本文件:

# 单张截图转文本,输出到 out_txt.txt tesseract SHL_20260518_S1_数字_07_错_增长率_粗心看错单位.jpg out_txt -l chi_sim+eng

参数说明:-l chi_sim+eng表示使用简体中文加英文的语言模型,因为很多测评题面是中英混合的;输出文件是out_txt.txt,默认和输入图片同名,所以我加了自定义前缀。

批量处理时,我一般写一个很短的 Python 脚本:

# 批量OCR:把 organized 目录下的 jpg 全部转成同名 txt import os import subprocess raw_dir = "./organized" for fname in os.listdir(raw_dir): if fname.lower().endswith(".jpg"): base = os.path.splitext(fname)[0] out_path = os.path.join(raw_dir, base) img_path = os.path.join(raw_dir, fname) # 调用 tesseract,输出一个与图片同名的 txt subprocess.run(["tesseract", img_path, out_path, "-l", "chi_sim+eng"], check=True)

这段脚本逻辑很直接:遍历目录,找到所有 jpg,调用外部命令识别。注意check=True,如果某张图损坏导致识别失败,脚本会直接报错并停下来,方便你及时发现坏图。这里要特别提醒:OCR对印刷体文字准确率很高,但对图表里的坐标数字、柱状图高度值经常识别错,所以OCR结果只承担“搜索定位”功能,不承担“数据提取”功能。

也就是说,OCR之后你仍然需要看原图,但不必浪费时间去翻阅每一张图。

3.3 图像清洗:提高识别率,但别把题目洗没

有些截图是在暗光环境或者隔着屏幕角度的条件下拍的,文字发灰、边框倾斜,OCR识别率会降。我常用的处理是灰度化加纠偏:

# 用 ImageMagick 对截图做灰度化、纠偏和边缘擦除 magick input.jpg -colorspace Gray -deskew 40% -sharpen 0x1 output_clean.jpg

参数说明:-colorspace Gray把彩色图转成灰度,减少彩色背景对 OCR 的干扰;-deskew 40%只纠正轻微倾斜,超过 40% 的建议重新截;-sharpen 0x1是轻微锐化,让文字边缘更清晰。注意不要用太强的锐化,过度处理会把浅色文字也洗掉,识别率反而下降。

另外,如果原图分辨率低于 1000px 且文字发虚,可以先用-resize 200%放大再 OCR,但放大不会创造细节,模糊的字放大后依然模糊,所以这一步只对原本清晰的截图有用。图像清洗的目的不是把一张废图救活,而是让本来合格的截图在OCR时少出错。

4. 搭建本地SQLite题库:把错题变成结构化数据

4.1 为什么不用Excel,而用单文件数据库

Excel 看起来够用,但一旦截图数量上到三百张,写公式的经验就变成维护成本。筛选条件一多,表格开始卡;想按知识点统计正确率,还得手动维护透视表。SQLite 则不然,它是一个单文件数据库,离线、免安装、查询能力强,几百条题目的查询毫秒级返回。你不需要搭服务器,只需要一个shl_repo.db文件就能把所有截图和作答记录串起来。

我设计了三张表:questions存题目内容,attempts存每次作答记录,tags存知识点标签。题目和作答分开,因为一道题可能做多次,而每次的正误、耗时都不同;知识点和题目是多对多关系,一道数字题可能同时涉及增长率和单位换算。

建表语句如下:

-- 题库核心表结构:题目、作答记录、知识点 CREATE TABLE IF NOT EXISTS questions ( id INTEGER PRIMARY KEY AUTOINCREMENT, source TEXT NOT NULL, -- 文件来源,如 S1 或 S2 question_type TEXT NOT NULL, -- 题型:数字/语言/逻辑/性格 image_path TEXT NOT NULL, -- 截图相对路径 ocr_text TEXT, -- OCR识别出的文本,用于检索 original_answer TEXT, -- 练习时选的原选项 created_at TEXT DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS attempts ( id INTEGER PRIMARY KEY AUTOINCREMENT, question_id INTEGER NOT NULL, -- 关联 questions.id is_correct INTEGER, -- 1 对 0 错 duration_sec REAL, -- 单题耗时,单位秒 attempt_time TEXT DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (question_id) REFERENCES questions(id) ); CREATE TABLE IF NOT EXISTS tags ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE NOT NULL -- 知识点名称,如 增长率 ); CREATE TABLE IF NOT EXISTS question_tags ( question_id INTEGER NOT NULL, tag_id INTEGER NOT NULL, PRIMARY KEY (question_id, tag_id) );

字段说明:questions.source对应刚才命名规则里的 S1/S2,ocr_text存识别出的全文,之后 SQL 查询可以直接用LIKE在里面找关键词;attempts.is_correct用 0 或 1 而不是布尔值,方便在 SQL 里直接做SUM统计;duration_sec是关键字段,没有它就没法做耗时分析,我一般要求每次练习后手动填一次。

4.2 用 Python 把截图和OCR结果批量导入

有了表结构之后,用一段简短的 Python 脚本把之前 OCR 出来的 txt 文件导入questions表:

import os import sqlite3 from datetime import datetime # 连接数据库,不存在则创建 conn = sqlite3.connect("shl_repo.db") cur = conn.cursor() repo_dir = "./organized" for fname in os.listdir(repo_dir): if not fname.endswith(".jpg"): continue # 从文件名解析出题型字段,例如 SHL_日期_S1_数字_07_错_增长率_备注 parts = fname.split("_") q_type = parts[3] if len(parts) >= 4 else "未知" img_path = os.path.join(repo_dir, fname) # 读取同名的 txt 作为OCR文本 txt_path = os.path.splitext(img_path)[0] + ".txt" ocr_text = "" if os.path.exists(txt_path): with open(txt_path, "r", encoding="utf-8") as f: ocr_text = f.read().strip() cur.execute( "INSERT INTO questions (source, question_type, image_path, ocr_text) VALUES (?, ?, ?, ?)", ("S1", q_type, fname, ocr_text) ) conn.commit() conn.close() print("导入完成。")

这段代码的作用是把文件系统里的截图信息搬到数据库里,后续所有的统计、筛选都基于这个库,不再直接翻文件夹。question_type是从文件名第四段拆出来的,所以前面定命名规则时字段顺序一定不要乱。如果有几张图还没OCR成功,ocr_text会留空,不影响题目入库,只是搜索不到它。

4.3 按知识点统计正确率,找到真正的薄弱项

数据入库后,第一件该做的事是算正确率分布。以下 SQL 可以直接找出正确率最低的知识点:

-- 按知识点统计正确率和作答次数,按正确率升序排 SELECT t.name AS 知识点, COUNT(a.id) AS 作答次数, SUM(CASE WHEN a.is_correct = 1 THEN 1 ELSE 0 END) AS 正确次数, ROUND(SUM(CASE WHEN a.is_correct = 1 THEN 1 ELSE 0 END) * 1.0 / COUNT(a.id), 2) AS 正确率 FROM attempts a JOIN questions q ON a.question_id = q.id JOIN question_tags qt ON q.id = qt.question_id JOIN tags t ON qt.tag_id = t.id GROUP BY t.name ORDER BY 正确率 ASC;

注意这里用的JOIN链,是从作答记录反查知识点。如果你把知识点存在questions表里,这条 SQL 会简单很多,但多对多关系一旦展开,后面“一道题涉及两个知识点”的情况就很难处理。结果如果某个知识点正确率长期低于 50%,那它应该排进优先复习清单;如果正确率低且作答次数不到 3 次,说明样本量太小,先别急着下结论,再练两道再判断。

4.4 耗时分析:你的瓶颈是读题慢还是计算慢

仅看正确率不够,很多题是“耗到时间到”才错的。这时候要看单题耗时。统计不同知识点的平均耗时:

-- 各知识点平均耗时,降序排列,找出耗时黑洞 SELECT t.name AS 知识点, ROUND(AVG(a.duration_sec), 0) AS 平均耗时_秒, COUNT(a.id) AS 样本数 FROM attempts a JOIN questions q ON a.question_id = q.id JOIN question_tags qt ON q.id = qt.question_id JOIN tags t ON qt.tag_id = t.id GROUP BY t.name ORDER BY 平均耗时_秒 DESC;

当某知识点正确率不错但平均耗时显著高于其他题时,大概率是方法会但熟练度不够,这种情况常见于单位换算和同比增量题;正确率又低耗时又长,那就不是熟练度问题,而是做题逻辑出了问题,要回看截图里自己的解题步骤,而不是盲目加练。

这样,截图系统就不只是一个图片收藏夹,而是一个能给复习优先级排队的工具。

5. 避坑与真实限制:用截图刷题最容易翻车的四个地方

5.1 截图囤而不理,三天后就是一堆死数据

现象:练了一套题,截图两百张,心想“周末再整理”。结果周末打开相册,面对的是按时间顺序排列的图片流,完全找不到某一题的上下文,最后只能放弃。

原因:截图没有在第一时间进入结构化流程。相册的时间轴是拍摄顺序,不是题目顺序,更不是知识点顺序。

解决:养成当天练完当天处理的习惯,跑一遍前面写的命名脚本和入库脚本,全程不超过十分钟。如果实在没时间,至少把文件名里的正误字段标好,让后续统计有依据。每周找一个固定时间做一次清理,别让未归档截图跨周。

5.2 OCR把图表数字识别错,导致搜索结果误导你

现象:用OCR识别了一张柱状图截图,坐标轴上的“120”被识别成“12O”,数字题搜索“120”时找不到这张图。

原因:OCR对连续数字串和小字号坐标数字的识别率远低于正文文字,这是它的物理限制,不是参数没调好。

解决:图表类截图不要只依赖OCR文本。我在命名时加一个前缀记号,比如图表_,并在tags表里打上“图表题”标签,筛选时优先用标签而不是全文搜索。如果某张图需要频繁回溯,可以把关键数字人工敲进ocr_text字段里,替换掉错误片段。

5.3 把“练过”当成“掌握”,真实测评还是做不完

现象:A同学反复刷了同一套练习链接,正确率从 60% 刷到 95%,觉得稳了。正式测评换了一批数字,题型结构看起来一样,但交给他的时候仍然做不完最后的五道题。

原因:这是过度拟合原题的结果。反复做同一套题,记得的是选项位置和计算步骤,不是“读题定位→列式→估算”的泛化能力。真实测评里题目数量、限时规则和练习链接不同,一旦数据换掉,记忆失效。

解决:用截图库做变式训练。从库里抽一道增长率题,把题面里的条件和图表改掉,重新算一遍;或者把柱状图换成折线图再设问。重点不是做更多题,而是对同一类题换三个数据源,检验自己是不是真的理解了计算口径。

5.4 性格测评的截图会反过来误导你

现象:有同学拿着整理好的性格题截图按“参考答案”选,结果系统在后面的题里调换措辞重复询问,他的回答和前面的偏好冲突,最终报告被判为低可信度。

原因:性格测评里本来就内置了前后印证机制,刻意撒谎非常容易被识破。截图错题本可以帮你在能力题上提分,但在性格部分帮不上这个忙。

解决:性格题的截图用法是记录“我当时为什么这么选”,不是记录“哪个选项是对的”。每次答完性格题,把自己的选择理由用一句话写在截图备注里,下次再遇到类似题目时对照锚点,保证答案与真实偏好一致就好。

6. 把截图跑成循环复盘法:模拟套卷和正确率回归

截图库跑到两百道以上时,就可以开始做周期性的模拟测试了。方法是利用数据库随机抽样,按知识点比例组一套模拟卷,全程按真实限时做一遍,然后对比每周正确率的变化。随机抽样用 Python 做比纯 SQL 更灵活:

import sqlite3 import random conn = sqlite3.connect("shl_repo.db") cur = conn.cursor() # 取出所有题目ID,按知识点分组 cur.execute(""" SELECT q.id, t.name FROM questions q JOIN question_tags qt ON q.id = qt.question_id JOIN tags t ON qt.tag_id = t.id """) rows = cur.fetchall() # 按知识点分组 from collections import defaultdict by_tag = defaultdict(list) for qid, tag in rows: by_tag[tag].append(qid) # 每个知识点随机抽2题,组成一套模拟卷 mock_exam = [] for tag, qid_list in by_tag.items(): sample_size = min(2, len(qid_list)) mock_exam.extend(random.sample(qid_list, sample_size)) # 打印试卷题目ID,再按ID去 organized 目录找对应图片 print(mock_exam)

抽题时注意两点:一是选“以前做错过的题”而不是全对的题,正确率回归才有效果;二是一套卷子控制在和正式测评相同的题数和时间内。模拟卷结束后,把新的作答记录插入attempts表,这样就能画出一条正确率回归线。如果连续三周正确率一直上升,但错题总集中在某一个知识点,说明不是熟练度在提升,而是这个知识点被你反复加了样本量,需要检查是不是题目来源太单一。

我个人的习惯是每月做一次数据清理:把重复截图删掉,把当时命名时漏掉的正误字段补齐,然后重新跑一遍正确率统计。这些细节看着繁琐,但它们决定了考前你看到的是有效样本还是垃圾堆。截图这项工作真正值钱的地方,不在于你存了多少张图,而在于这些图能不能在关键时刻告诉你——你的问题出在哪。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 21:42:10

C-C++之string和char的使用及区别

前言 初学 C/C 的人几乎都会经历同一个困惑:一会儿写 char s[] "abc";,一会儿写 char* p "abc";,一会儿又写 std::string s "abc";——三者看起来都在"存字符串",但行为、生命周期、可…

作者头像 李华
网站建设 2026/10/15 21:41:33

CMake构建使用实战:跨平台C++工程的配置、依赖与调试

最早被 CMake 折腾到半夜,是在一个跨平台 C 工具的构建迁移上。那时项目同时要在 Windows 和 Linux 上出包,手写 Makefile 加 Visual Studio 工程文件,每次新增一个源文件都得改两处,外面引用的第三方库还各有各的编译方式&#x…

作者头像 李华
网站建设 2026/10/15 21:41:07

第六章:CodeCave扫描与.text节空隙利用

大家好,你们可以叫我凌。 今天我们来唠唠 Code Cave 注入,不过该注入方法常常因为CFG而经常无法成功,所以说这篇文章仅仅用于讲解其中原理。 当然,要想注入成功则需要用 SetProcessValidCallTargets 把 Code Cave 地址注册为合法…

作者头像 李华
网站建设 2026/10/15 21:40:53

余弦相似度与欧氏距离:相似度度量的核心差异与工程选择

很多人在刚接触机器学习或者做推荐系统、文本匹配的时候,都会遇到两个绕不开的名字:余弦相似度和欧氏距离。这俩确实是衡量"东西像不像"最常用的两个指标,但也是被误解得最深的一对。我见过太多人拿到数据就无脑算一个,…

作者头像 李华
网站建设 2026/10/15 21:40:51

从零搭建聚合搜索工具:搜索源接入、结果聚合与部署实践

最近在整理书签和常用工具时,发现“柠檬搜索”这类聚合搜索工具又回到了开发者的视野里。这次回归不仅带来了更清爽的界面,也让大家重新开始讨论“自建搜索入口”这件事到底值不值得做。与其停留在“好不好用”的层面,不如直接动手&#xff0…

作者头像 李华
网站建设 2026/10/15 21:38:05

Agent落地最后一公里:灵衢互联、分级适配与软硬协同实践解析

这段时间被Agent折腾得够呛的朋友应该不少:模型聪明不聪明已经排不到第一位了,真正让人头大的是,Agent在演示环境里跑得行云流水,一旦搬到生产环境就各种“最后一公里”问题冒出来——工具调用超时、端侧算力吃不消、多个Agent互相…

作者头像 李华