职位卡片通过术语编码表连接到对照网格。
用一条已写明的规则来计数术语。

相关语境是指术语周围的词语表明,这段文字是在谈该项技能。一个偶然出现的字母不是相关语境。Actor 是托管的数据采集程序。Task 是已保存的输入预设。Actor 采集源数据行。你来标注技能术语。

1. 先界定样本组

在标注任何技能之前,先写下样本组规则。样本组是同一职位、同一市场、同一日期规则下的一组职位。把日期规则写在样本组说明里。日期规则是你接受的时间窗口。

在编码之前,先写明你要报告的数字。你可以报告有多少条职位出现了某项技能用法。你可以报告有多少家雇主有该用法。你可以报告这些词语出现了多少次。这是三个不同的数字。不要把它们混在一起。

份额是一个计数除以它下面的那个数。分母就是那个数。你要在知道哪些职位有全文之后再设定分母。在写明份额之前,不要编码术语。

对于过去的月份,使用你已经保存的描述快照。Actor 无法采集 2020 年或 2021 年的描述。一次新运行只能开启一个新样本组。它不能重建旧样本组。

2. 采集并保存源数据行

使用 Indeed Jobs Scraper Actor。公开版本 1.2.14 接受这些字段:searchTerm、country、location、maxItems、maxPagesPerSearch、postedWithinDays、sortBy 和 saveOnlyUniqueItems。已保存的 Task 已于 2026 年 10 月 13 日核对。Task 只是起始输入。它不会替你完成这次计数。

已保存的 Task 输入是:

json
{
  "country": "us",
  "searchTerm": "software engineer",
  "maxItems": 100,
  "postedWithinDays": "7",
  "sortBy": "date",
  "maxPagesPerSearch": 2,
  "saveOnlyUniqueItems": true
}
2. 采集并保存源数据行

此 Task 把 country 设为 us,把搜索词设为 software engineer。它不设置城市。只有当你的市场小于国家时,才添加 location。当你研究其他对象时,替换职位和市场。一次运行只保留一个职位和一个市场。

上限是 maxItems 限制。此 Task 把上限设为 100 行,并最多读取 2 个搜索页。这个较宽的上限不是第一次文本核对。第一次核对时,只保留一个职位和一个市场。把 maxItems 设为 2。把 maxPagesPerSearch 设为 1。第一次核对的输入是:

json
{
  "country": "us",
  "searchTerm": "software engineer",
  "maxItems": 2,
  "postedWithinDays": "7",
  "sortBy": "date",
  "maxPagesPerSearch": 1,
  "saveOnlyUniqueItems": true
}
2. 采集并保存源数据行

在此版本上,一次设有上限的运行返回了两行。每一行都有来源职位 ID 和来源 URL。每一行都有完整描述文本。该运行达到了 maxItems。从你自己的输出中复制 ID 和 URL。不要键入新的 ID。这次运行表明文本采集可用。它不是技能结果。它也不是下面的虚构样本组。

已保存的 Task 把 saveOnlyUniqueItems 设为 true。当 Actor 采集数据行时,该设置可以减少重复。它并不完成重复项复核。再次发布是同一空缺再次发布。编码之前,去掉已复核的重复行和已复核的再次发布行。使用重复项与再次发布指南做该复核。把去掉的数量记在你的笔记里。

每一条源数据行是一条已采集的记录。职位条目是你为计数而保留的一行。把 jobId 存为文本。不要让电子表格把 jobId 变成数字。

使用这些输出字段。运行计数器是整个运行的一个数字。它不是职位行。

2. 采集并保存源数据行
输出名称种类用法
jobId行字段将其存为文本。
title行字段保留它。不要把标题当作完整要求。
companyName行字段为雇主计数而保留它。
locationRaw行字段保留来源中的地点文本。
descriptionText行字段根据这段文本编码技能。
descriptionStatus行字段只使用 full 或 missing。
jobUrl行字段保留来源 URL。
query行字段保留该行的搜索文本。
searchLocation行字段保留该行的搜索地点。
scrapedAt行字段这是采集时间。
seniority可选行字段它可以缺失。它不是完整要求。
employmentType可选行字段它可以缺失。
salaryRaw可选行字段它可以缺失。缺失不是薪资为零。
postedAt可选行字段它可以缺失。不要编造发布月份。
postedAtRaw可选行字段它可以缺失。
rowsExcludedByCompany运行计数器单独保留这个计数。
rowsExcludedByDate运行计数器单独保留这个计数。
rowsExcludedBySalary运行计数器单独保留这个计数。

当 descriptionText 存在时,descriptionStatus 为 full。当文本不存在时,它为 missing。不要增加 snippet 状态。这里的全文是来源给出的文本。它并不承诺这是雇主的整份文件。

scrapedAt 是 Actor 采集该行的时间。它不是雇主发布该职位的月份。如果 postedAt 缺失,就把发布月份留为未知。

rowsExcludedByCompany 是因公司原因而被排除的行的运行计数。rowsExcludedByDate 是因日期原因而被排除的行的运行计数。rowsExcludedBySalary 是因薪资原因而被排除的行的运行计数。不要把这三个计数加总成一个总数。不要把计数器变成职位行。本次对照给出了每一个计数。三者都没有被省略。rowsExcludedByCompany 为 0。rowsExcludedByDate 为 0。rowsExcludedBySalary 为 0。不要为被省略的计数器写零。这三个计数器都存在,所以每一个零都是计数。运行映射列出每个字段及其值。本次对照没有给出的字段是未知。将来不存在的字段是未知。当前这次两行、设有上限的 Indeed 对照具有这些输出值:requestedMaxItems: 2, candidateItemsSeen: 100, jobsSaved: 2, pagesParsed: 1, blockedPages: 0, failedRequests: 0, stopReason: "max_items_reached", rowsExcludedByCompany: 0, rowsExcludedByDate: 0, rowsExcludedBySalary: 0。这次运行不是未知。将来缺失的字段仍然未知。

保存实际运行的输入、原始行和输出。写下你设置的 maxItems,以及返回的行数。如果两个数字相等,这次运行达到了上限。达到上限的运行并不是每一个匹配职位。如果运行没有返回任何行,就写下这次运行是空的。空运行并不能证明不存在职位。如果运行失败,保存失败记录。不要用技能零去填一次失败的运行。

把 descriptionText 缺失的行留在已编码集合之外。每有这样一行,就把缺口计数加 1。缺口不是技能不存在的职位。

Actor 给出当前的公开数据行。它不给出旧的描述文本。它不给出雇主的编辑时间。它不给出申请人状态。它不给出学习计划。它不标注技能术语。你用下面的规则来标注它们。

3. 匹配之前先写技能清单

在搜索文本之前,先写一份技能清单。技能键是你为一项技能存储的那一个名称。别名是书写同一项技能的另一种方式。标记是一个完整的词,或一个独立的符号。它不是更长词语中的一段。排除项是你拒绝接受的一次匹配。

匹配 SQL、Structured Query Language 以及下面的其他键时,忽略字母大小写。当这些词语指该语言时,让 SQL 和 Structured Query Language 共用一个键。把 Java 与 JavaScript 分开。只在相关文本中把 R 作为完整的技能标记来匹配。不要匹配另一个词内部的字母 R。

版本标签,例如语言版本,需要一条写明的规则。产品名称需要一条写明的规则。编码之前先决定规则。阅读时不要猜测。

这份技能清单用于本文中的虚构样本组。它不是 Actor 提供的清单。你自己的样本组需要你自己的键。

3. 匹配之前先写技能清单
技能键允许的别名标记规则排除项
SQLSQL; Structured Query Language当文本指该语言时,两个别名共用此键。不要把此键用于不同的短语。
PythonPython匹配整个词。不要把非必需短语编码为必需。
RR在相关技能文本中匹配完整标记。不要匹配词内部的字母。
JavaJava匹配整个词。不要匹配 JavaScript。
JavaScriptJavaScript匹配整个词。不要把 Java 计为 JavaScript。

这份清单没有版本规则,也没有产品名称规则。虚构文本没有版本,也没有产品名称。如果你的文本有其中之一,先把规则加到清单里。

4. 为每一段文字编码

找到包含技能名称的那段文字。然后阅读它周围的词语。类别是提及的种类。使用这些类别:

  • 必需是指文本说申请人必须具备该技能。
  • 优先是指文本要求该技能,但没有说申请人必须具备它。
  • 语境是指文本说工作使用该技能,但并不要求申请人具备它。
  • 明确不要求是指文本说申请人不需要该技能。
  • 无法判定是指你无法从词语判断类别。

词形提及是指技能名称出现在文本中。即使类别不是必需,也保留该词形提及。不要丢弃该句。

后面的虚构样本组包含词语“no Python experience required.”。这些词语是对 Python 的词形提及。类别是明确不要求。该类别不是必需。

同一样本组包含词语“we use R for reports.”。这些词语是对 R 的词形提及。类别是语境。除非文本还说申请人必须具备 R,否则不要把 R 标为必需。

“reports”内部的字母 r 不是技能 R。“required”内部的字母 r 不是技能 R。

如果一条职位对一项技能有两个类别,就把每个类别都标上。如果同一类别在一条职位中重复,该类别只标一次。

5. 建立职位矩阵

术语×职位矩阵是一张表,每个已编码职位占一行。每个技能类别有自己的列。当全文有该类别时填 1。当你读过全文且该类别不存在时填 0。0 表示你读过文本。它不表示文本缺失。

一条职位里,同一个键的重复提及,在该类别中仍然只形成一次职位标记。职位出现就是这个 1。当你需要原始出现次数时,把它放在另一张表里。一次原始出现是该键出现一次。不要把原始出现次数加进职位列。

一条职位可以在优先上为 1,在必需上为 0。一条职位可以在明确不要求上为 1,在必需上为 0。一条职位可以在语境上为 1,在必需上为 0。不要合并这些列。

不要把缺失的描述作为一行零放进矩阵。把它留在缺口计数里。

6. 设定分母

分母是同一样本组中、彼此不同的全文职位的数量。彼此不同是指同一条职位只计一次。只计算重复项复核之后仍然保留的职位。只计算 descriptionStatus 为 full 的职位。

职位份额等于类别计数除以分母。把份额写成计数占分母的多少。在旁边报告缺口计数。在旁边报告不确定 ID 计数。不确定 ID 是空白、已更改,或与另一行冲突。把不确定 ID 留在分母之外。

也要报告编码不确定性。编码不确定性是指复核人在类别上不一致。在记录写明已商定的类别之前,把有争议的职位留在必需计数之外。不要把争议悄悄变成零。

雇主覆盖面是具有该类别的不同雇主数量。用该雇主计数除以分母中的不同雇主数量。一家雇主可以写许多条职位。职位份额可以很高,同时雇主份额可以很小。两个份额都要报告。

这些份额只描述你的样本组。它们不是全国技能需求。它们也不是对申请人能做什么的度量。

7. 用相同规则比较样本组

只有当样本组规则一致时,才比较两个月份。保持相同的职位、市场、查询、日期窗口、上限和技能清单版本。技能清单版本是你给一份已保存技能清单起的名称。

如果你更改别名或类别规则,职位文本不变时,份额仍可能改变。那种改变是编码改变。在阅读新份额之前,先报告它。

如果上限、查询、市场或日期窗口改变,样本就改变了。来源文本缺失也是覆盖范围改变。在阅读份额变化之前,先报告样本变化。不要把编码改变当作样本改变。

搜索样本并不显示变化的原因。它并不显示整个市场增长了。技能份额的变化不是职位条数的变化。关于一段时间内的职位条数,使用招聘趋势指南。

8. 保存记录

保存技能清单及其版本名称。保存你编码的每一段文字,以及职位 ID、技能键和类别。保存矩阵。保存分母记录。

分母记录应包括:

  • 职位、市场、查询、日期窗口和上限。
  • 实际运行的输入和 Actor 版本。
  • 返回的行数,以及运行是否达到 maxItems。
  • 任何失败记录。
  • rowsExcludedByCompany、rowsExcludedByDate 和 rowsExcludedBySalary;对每个被省略的计数器则写未知。
  • 你去掉的重复行。
  • 缺口计数。
  • 不确定 ID 计数。
  • 编码不确定性计数。
  • 分母。
  • 该分母中的雇主数量。

第二个人应当能够从已保存的段落出发,到达同一个矩阵单元格。如果不能,记录就不完整。

停在术语计数。重复出现的职责可以指导以后的学习选择。那个选择不是这次计数。这次计数也不是个人准备程度分数。

计数一个虚构样本组

本节中的五条描述都是虚构。它们不是 Actor 的结果。它们不是真实的技能发现。J1 到 J5 是标签。它们不是真实的来源 ID。上面的技能清单是此样本组的规则。

计数一个虚构样本组
标签雇主descriptionTextdescriptionStatus
J1ASQL required. SQL reports run daily. Python preferred.full
J2AStructured Query Language required; no Python experience required.full
J3BJavaScript required; we use R for reports.full
J4CJava required; R preferred.full
J5D`""`missing

这些标签没有 scrapedAt 值,也没有 postedAt 值。不要给它们指定发布月份。

J1 和 J2 使用雇主 A。它们的文本不同。这个虚构保留两条职位。它不把 J2 称为 J1 的再次发布。如果一次真实复核把 J2 作为再次发布去掉,分母会改变。这个虚构不做那个判定。

J5 有已知标签,但没有全文。J5 留在矩阵之外。缺口计数为 1。不确定 ID 计数为 0,因为标签已知,而文本才是缺口。不要为 J5 编造文本。

段落记录是:

计数一个虚构样本组
职位段落技能键类别
J1SQL required.SQL必需
J1SQL reports run daily.SQL语境
J1Python preferred.Python优先
J2Structured Query Language requiredSQL必需
J2no Python experience requiredPython明确不要求
J3JavaScript requiredJavaScript必需
J3we use R for reportsR语境
J4Java requiredJava必需
J4R preferredR优先
J5无全文无未编码

一次出现是技能文本出现一次。出现标记是一个类别上的一次职位标记。一条职位的每个类别只标记一次。第二句具有相同的键和相同的类别时,增加一次原始出现。它不增加第二次出现标记。第二句具有相同的键和不同的类别时,得到自己的出现标记。不要因为该键也有必需文本就丢掉那个类别。

J1 中第一句 SQL 是必需。它是一次必需出现。J1 的必需出现标记为 1。句子“SQL reports run daily.”是语境。它是一次语境出现。J1 的语境出现标记为 1。J2 计为 SQL,因为 Structured Query Language 是允许的别名。这些词语指该语言,而且该句说它是必需的。该别名是一次必需出现。J2 的必需出现标记为 1。

矩阵只对四条全文使用 1 和 0。J5 在这里不是一行。

计数一个虚构样本组
职位雇主SQL 必需SQL 语境Python 必需Python 优先Python 明确不要求R 必需R 语境R 优先Java 必需JavaScript 必需
J1A1101000000
J2A1000100000
J3B0000001001
J4C0000000110
职位计数`""`2101101111

J1 到 J4 中的每一个 0 都表示全文已读,且该类别不存在。没有已编码段落是无法判定,所以无法判定是 4 条中的 0。这个零来自一次阅读。它不是 J5 的缺口。没有类别处于争议中,所以编码不确定性计数为 0。

原始计数留在另一张表中。

计数一个虚构样本组
职位技能键类别原始出现次数
J1SQL必需1
J1SQL语境1
J2SQL必需1
J2SQL语境0
J1Python优先1
J2Python明确不要求1
J2Python必需0
J3R语境1
J4R优先1
J3R必需0
J4R必需0
J3Java必需0
J4Java必需1
J3JavaScript必需1
J4JavaScript必需0

四条有效的全文职位构成分母。这些职位是 J1、J2、J3 和 J4。分母中的雇主是 A、B 和 C。该雇主总数为 3。雇主 D 在其外,因为 J5 没有全文。

J1 有 2 次原始 SQL 出现。必需类别有 1 次。语境类别有 1 次。J2 有 1 次原始 SQL 出现,且该类别是必需。SQL 必需的原始计数是 1 加 1,等于 2。SQL 语境的原始计数是 1。2 加 1 等于 3 次原始 SQL 出现。SQL 的词形总计数仍为 3。必需的原始总数为 2。必需的职位计数也是 2。同一个数字并不使这两种度量变成同一种度量。语境出现在必需的原始总数之外。SQL 必需的职位计数是 2。SQL 必需份额等于 2 除以 4。它不等于 3 除以 4。它不等于 2 除以 5。多出来的那次原始提及是语境。它不是额外的一条职位。J5 不进入分母。

SQL 语境的职位计数是 1。SQL 语境份额等于 1 除以 4。不要把这 1 条语境职位加到 2 条必需职位上。J1 会被计两次。类别保持分开。

两条 SQL 必需职位都属于雇主 A。SQL 必需的雇主份额等于 1 除以 3。那一条 SQL 语境职位属于雇主 A。SQL 语境的雇主份额等于 1 除以 3。雇主 A 还写了 4 条职位中的 2 条。把该覆盖面报告在职位份额旁边。在这个虚构中,一家雇主就可以推动 SQL 份额。

Python 文本出现在 J1 和 J2 中。这是两次词形提及,两者都留在记录中。Python 优先等于 1 除以 4。Python 明确不要求等于 1 除以 4。Python 必需等于 0 除以 4。不要把优先提及与不要求提及相加,再把和称为必需。不要求短语仍然是一次词形提及。

R 文本出现在 J3 和 J4 中。R 语境等于 1 除以 4。R 优先等于 1 除以 4。R 必需等于 0 除以 4。R 的词形出现等于 2 除以 4。不要把那两条职位报告为必需。

Java 必需只有 J4。该份额等于 1 除以 4。JavaScript 必需只有 J3。该份额等于 1 除以 4。J3 中的 Java 计数为 0,因为 JavaScript 是不同的键。

所报告的份额是:

计数一个虚构样本组
类别职位职位份额雇主雇主份额
SQL 必需J1, J24 中的 2A3 中的 1
SQL 语境J14 中的 1A3 中的 1
Python 必需无4 中的 0无3 中的 0
Python 优先J14 中的 1A3 中的 1
Python 明确不要求J24 中的 1A3 中的 1
R 必需无4 中的 0无3 中的 0
R 语境J34 中的 1B3 中的 1
R 优先J44 中的 1C3 中的 1
Java 必需J44 中的 1C3 中的 1
JavaScript 必需J34 中的 1B3 中的 1

词计数器是一种工具,它找到一个字母序列并加一。两个词计数器结果不符合这条虚构规则。把它们用作规则测试。它们不是某个软件产品的分数。

词计数器在看到 JavaScript 时会标记 Java。它会把 J3 标为 Java。该标记不符合标记规则。Java 仍是 4 条中的 1,且只来自 J4。

词计数器把“no Python experience required”当作 Python 需求,或当作 Python 必需。该标记不符合类别规则。Python 必需仍是 4 条中的 0。J2 的那一句仍是明确不要求。

搜索字母 SQL 也会漏掉 J2。别名规则仍然标记 J2。SQL 必需计数仍是 4 条中的 2。

来源和延伸阅读

作者 Chronometrica · 更新日期

返回顶部 ↑