WP44: Appendices B, C (Agent L); Part IV aligned with code; provenance macros
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
11 changed files +950 −14
modified
agents/REGISTER.md
+1 −1
@@ -10,4 +10,4 @@ | |||||
| 10 | | 2026-11-03 | N (code auditor, subagent) | prompt in session | reports/audit/CODE_AUDIT_2026-11-03.md, code_issues.csv (67 issues: 2 blocking, 20 major, 45 minor) | A: P0 + main P1 fixed in commit of 2026-11-03 17:10 (see reports/DISCREPANCIES_PLAN_VS_CODE.md) | delivered | | 10 | | 2026-11-03 | N (code auditor, subagent) | prompt in session | reports/audit/CODE_AUDIT_2026-11-03.md, code_issues.csv (67 issues: 2 blocking, 20 major, 45 minor) | A: P0 + main P1 fixed in commit of 2026-11-03 17:10 (see reports/DISCREPANCIES_PLAN_VS_CODE.md) | delivered | | ||
| 11 | | 2026-11-03 | L (appendices A/E/H, subagent) | agents/briefs/WRITER_APPENDICES_AEH.md | manuscript/appendices/appA_taxonomy.tex (8,360 w), appE_data_dictionary.tex (5,598 w, schema-checked), appH_reproducibility.tex (3,446 w) | M (compile) + N (Phase 8) | delivered | | 11 | | 2026-11-03 | L (appendices A/E/H, subagent) | agents/briefs/WRITER_APPENDICES_AEH.md | manuscript/appendices/appA_taxonomy.tex (8,360 w), appE_data_dictionary.tex (5,598 w, schema-checked), appH_reproducibility.tex (3,446 w) | M (compile) + N (Phase 8) | delivered | | ||
| 12 | | 2026-11-03 | L (Part II, subagent) | agents/briefs/WRITER_PART02.md | manuscript/sections/part02_evolution.tex (12,677 w, 224 verified refs) | K + M | delivered | | 12 | | 2026-11-03 | L (Part II, subagent) | agents/briefs/WRITER_PART02.md | manuscript/sections/part02_evolution.tex (12,677 w, 224 verified refs) | K + M | delivered | | ||
| 13 | −| 2026-11-03 | L (appendices B/C, subagent) | agents/briefs/WRITER_APPENDICES_BC.md | appB_search_and_sources.tex, appC_derivations.tex | K + M | running | | 13 | +| 2026-11-03 | L (appendices B/C, subagent) | agents/briefs/WRITER_APPENDICES_BC.md | appB_search_and_sources.tex (5,336 w), appC_derivations.tex (6,509 w), references_appBC.bib (5 verified) | K + M; A aligned Part IV with the code (α MASI, standardised features, cutoffs, diversity script) | delivered | | ||
added
data/metadata/acl_parse_report.json
+13 −0
@@ -0,0 +1,13 @@ | |||||
| 1 | +{ | ||||
| 2 | + "input": "data/raw/acl/anthology+abstracts.bib.gz", | ||||
| 3 | + "sha256": "44c3f7e907f221b740bea09069818a3d7c0dfd88b2da3b750d9f02955efc58b3", | ||||
| 4 | + "bytes": 46723382, | ||||
| 5 | + "entries": 138796, | ||||
| 6 | + "types": { | ||||
| 7 | + "proceedings": 3016, | ||||
| 8 | + "inproceedings": 132105, | ||||
| 9 | + "article": 3453, | ||||
| 10 | + "book": 222 | ||||
| 11 | + }, | ||||
| 12 | + "parsed_at": "2026-11-03T02:21:46.022435+00:00" | ||||
| 13 | +} | ||||
| \ No newline at end of file | |||||
added
data/metadata/api_increment_ledger.json
+397 −0
@@ -0,0 +1,397 @@ | |||||
| 1 | +{ | ||||
| 2 | + "slices": { | ||||
| 3 | + "2026-10-01_cs_primary": { | ||||
| 4 | + "pages": 36, | ||||
| 5 | + "records": 7092, | ||||
| 6 | + "done": true, | ||||
| 7 | + "count": 7092 | ||||
| 8 | + }, | ||||
| 9 | + "2026-10-01_cs_secondary": { | ||||
| 10 | + "pages": 31, | ||||
| 11 | + "records": 6167, | ||||
| 12 | + "done": true, | ||||
| 13 | + "count": 6167 | ||||
| 14 | + }, | ||||
| 15 | + "2026-10-02_cs_primary": { | ||||
| 16 | + "pages": 17, | ||||
| 17 | + "records": 3365, | ||||
| 18 | + "done": true, | ||||
| 19 | + "count": 3365 | ||||
| 20 | + }, | ||||
| 21 | + "2026-10-02_cs_secondary": { | ||||
| 22 | + "pages": 11, | ||||
| 23 | + "records": 2057, | ||||
| 24 | + "done": true, | ||||
| 25 | + "count": 2057 | ||||
| 26 | + }, | ||||
| 27 | + "2026-10-03_cs_primary": { | ||||
| 28 | + "pages": 9, | ||||
| 29 | + "records": 1735, | ||||
| 30 | + "done": true, | ||||
| 31 | + "count": 1735 | ||||
| 32 | + }, | ||||
| 33 | + "2026-10-03_cs_secondary": { | ||||
| 34 | + "pages": 49, | ||||
| 35 | + "records": 9746, | ||||
| 36 | + "done": true, | ||||
| 37 | + "count": 9746 | ||||
| 38 | + }, | ||||
| 39 | + "2026-10-04_cs_primary": { | ||||
| 40 | + "pages": 9, | ||||
| 41 | + "records": 1764, | ||||
| 42 | + "done": true, | ||||
| 43 | + "count": 1764 | ||||
| 44 | + }, | ||||
| 45 | + "2026-10-04_cs_secondary": { | ||||
| 46 | + "pages": 30, | ||||
| 47 | + "records": 5919, | ||||
| 48 | + "done": true, | ||||
| 49 | + "count": 5919 | ||||
| 50 | + }, | ||||
| 51 | + "2026-10-05_cs_primary": { | ||||
| 52 | + "pages": 16, | ||||
| 53 | + "records": 3091, | ||||
| 54 | + "done": true, | ||||
| 55 | + "count": 3091 | ||||
| 56 | + }, | ||||
| 57 | + "2026-10-05_cs_secondary": { | ||||
| 58 | + "pages": 12, | ||||
| 59 | + "records": 2215, | ||||
| 60 | + "done": true, | ||||
| 61 | + "count": 2215 | ||||
| 62 | + }, | ||||
| 63 | + "2026-10-06_cs_primary": { | ||||
| 64 | + "pages": 18, | ||||
| 65 | + "records": 3537, | ||||
| 66 | + "done": true, | ||||
| 67 | + "count": 3537 | ||||
| 68 | + }, | ||||
| 69 | + "2026-10-06_cs_secondary": { | ||||
| 70 | + "pages": 14, | ||||
| 71 | + "records": 2622, | ||||
| 72 | + "done": true, | ||||
| 73 | + "count": 2622 | ||||
| 74 | + }, | ||||
| 75 | + "2026-10-07_cs_primary": { | ||||
| 76 | + "pages": 18, | ||||
| 77 | + "records": 3597, | ||||
| 78 | + "done": true, | ||||
| 79 | + "count": 3597 | ||||
| 80 | + }, | ||||
| 81 | + "2026-10-07_cs_secondary": { | ||||
| 82 | + "pages": 13, | ||||
| 83 | + "records": 2515, | ||||
| 84 | + "done": true, | ||||
| 85 | + "count": 2515 | ||||
| 86 | + }, | ||||
| 87 | + "2026-10-08_cs_primary": { | ||||
| 88 | + "pages": 18, | ||||
| 89 | + "records": 3425, | ||||
| 90 | + "done": true, | ||||
| 91 | + "count": 3425 | ||||
| 92 | + }, | ||||
| 93 | + "2026-10-08_cs_secondary": { | ||||
| 94 | + "pages": 14, | ||||
| 95 | + "records": 2624, | ||||
| 96 | + "done": true, | ||||
| 97 | + "count": 2624 | ||||
| 98 | + }, | ||||
| 99 | + "2026-10-09_cs_primary": { | ||||
| 100 | + "pages": 16, | ||||
| 101 | + "records": 3129, | ||||
| 102 | + "done": true, | ||||
| 103 | + "count": 3129 | ||||
| 104 | + }, | ||||
| 105 | + "2026-10-09_cs_secondary": { | ||||
| 106 | + "pages": 12, | ||||
| 107 | + "records": 2312, | ||||
| 108 | + "done": true, | ||||
| 109 | + "count": 2312 | ||||
| 110 | + }, | ||||
| 111 | + "2026-10-10_cs_primary": { | ||||
| 112 | + "pages": 10, | ||||
| 113 | + "records": 1968, | ||||
| 114 | + "done": true, | ||||
| 115 | + "count": 1968 | ||||
| 116 | + }, | ||||
| 117 | + "2026-10-10_cs_secondary": { | ||||
| 118 | + "pages": 8, | ||||
| 119 | + "records": 1504, | ||||
| 120 | + "done": true, | ||||
| 121 | + "count": 1504 | ||||
| 122 | + }, | ||||
| 123 | + "2026-10-11_cs_primary": { | ||||
| 124 | + "pages": 9, | ||||
| 125 | + "records": 1668, | ||||
| 126 | + "done": true, | ||||
| 127 | + "count": 1668 | ||||
| 128 | + }, | ||||
| 129 | + "2026-10-11_cs_secondary": { | ||||
| 130 | + "pages": 7, | ||||
| 131 | + "records": 1278, | ||||
| 132 | + "done": true, | ||||
| 133 | + "count": 1278 | ||||
| 134 | + }, | ||||
| 135 | + "2026-10-12_cs_primary": { | ||||
| 136 | + "pages": 15, | ||||
| 137 | + "records": 2896, | ||||
| 138 | + "done": true, | ||||
| 139 | + "count": 2896 | ||||
| 140 | + }, | ||||
| 141 | + "2026-10-12_cs_secondary": { | ||||
| 142 | + "pages": 12, | ||||
| 143 | + "records": 2209, | ||||
| 144 | + "done": true, | ||||
| 145 | + "count": 2209 | ||||
| 146 | + }, | ||||
| 147 | + "2026-10-13_cs_primary": { | ||||
| 148 | + "pages": 17, | ||||
| 149 | + "records": 3289, | ||||
| 150 | + "done": true, | ||||
| 151 | + "count": 3289 | ||||
| 152 | + }, | ||||
| 153 | + "2026-10-13_cs_secondary": { | ||||
| 154 | + "pages": 14, | ||||
| 155 | + "records": 2717, | ||||
| 156 | + "done": true, | ||||
| 157 | + "count": 2717 | ||||
| 158 | + }, | ||||
| 159 | + "2026-10-14_cs_primary": { | ||||
| 160 | + "pages": 17, | ||||
| 161 | + "records": 3209, | ||||
| 162 | + "done": true, | ||||
| 163 | + "count": 3209 | ||||
| 164 | + }, | ||||
| 165 | + "2026-10-14_cs_secondary": { | ||||
| 166 | + "pages": 13, | ||||
| 167 | + "records": 2555, | ||||
| 168 | + "done": true, | ||||
| 169 | + "count": 2555 | ||||
| 170 | + }, | ||||
| 171 | + "2026-10-15_cs_primary": { | ||||
| 172 | + "pages": 19, | ||||
| 173 | + "records": 3758, | ||||
| 174 | + "done": true, | ||||
| 175 | + "count": 3758 | ||||
| 176 | + }, | ||||
| 177 | + "2026-10-15_cs_secondary": { | ||||
| 178 | + "pages": 14, | ||||
| 179 | + "records": 2684, | ||||
| 180 | + "done": true, | ||||
| 181 | + "count": 2684 | ||||
| 182 | + }, | ||||
| 183 | + "2026-10-16_cs_primary": { | ||||
| 184 | + "pages": 15, | ||||
| 185 | + "records": 2870, | ||||
| 186 | + "done": true, | ||||
| 187 | + "count": 2870 | ||||
| 188 | + }, | ||||
| 189 | + "2026-10-16_cs_secondary": { | ||||
| 190 | + "pages": 50, | ||||
| 191 | + "records": 10000, | ||||
| 192 | + "done": true, | ||||
| 193 | + "count": 37712, | ||||
| 194 | + "truncated": true | ||||
| 195 | + }, | ||||
| 196 | + "2026-10-17_cs_primary": { | ||||
| 197 | + "pages": 9, | ||||
| 198 | + "records": 1796, | ||||
| 199 | + "done": true, | ||||
| 200 | + "count": 1796 | ||||
| 201 | + }, | ||||
| 202 | + "2026-10-17_cs_secondary": { | ||||
| 203 | + "pages": 7, | ||||
| 204 | + "records": 1244, | ||||
| 205 | + "done": true, | ||||
| 206 | + "count": 1244 | ||||
| 207 | + }, | ||||
| 208 | + "2026-10-18_cs_primary": { | ||||
| 209 | + "pages": 8, | ||||
| 210 | + "records": 1593, | ||||
| 211 | + "done": true, | ||||
| 212 | + "count": 1593 | ||||
| 213 | + }, | ||||
| 214 | + "2026-10-18_cs_secondary": { | ||||
| 215 | + "pages": 6, | ||||
| 216 | + "records": 1097, | ||||
| 217 | + "done": true, | ||||
| 218 | + "count": 1097 | ||||
| 219 | + }, | ||||
| 220 | + "2026-10-19_cs_primary": { | ||||
| 221 | + "pages": 16, | ||||
| 222 | + "records": 3118, | ||||
| 223 | + "done": true, | ||||
| 224 | + "count": 3118 | ||||
| 225 | + }, | ||||
| 226 | + "2026-10-19_cs_secondary": { | ||||
| 227 | + "pages": 12, | ||||
| 228 | + "records": 2281, | ||||
| 229 | + "done": true, | ||||
| 230 | + "count": 2281 | ||||
| 231 | + }, | ||||
| 232 | + "2026-10-20_cs_primary": { | ||||
| 233 | + "pages": 16, | ||||
| 234 | + "records": 3056, | ||||
| 235 | + "done": true, | ||||
| 236 | + "count": 3056 | ||||
| 237 | + }, | ||||
| 238 | + "2026-10-20_cs_secondary": { | ||||
| 239 | + "pages": 13, | ||||
| 240 | + "records": 2402, | ||||
| 241 | + "done": true, | ||||
| 242 | + "count": 2402 | ||||
| 243 | + }, | ||||
| 244 | + "2026-10-21_cs_primary": { | ||||
| 245 | + "pages": 17, | ||||
| 246 | + "records": 3241, | ||||
| 247 | + "done": true, | ||||
| 248 | + "count": 3241 | ||||
| 249 | + }, | ||||
| 250 | + "2026-10-21_cs_secondary": { | ||||
| 251 | + "pages": 13, | ||||
| 252 | + "records": 2488, | ||||
| 253 | + "done": true, | ||||
| 254 | + "count": 2488 | ||||
| 255 | + }, | ||||
| 256 | + "2026-10-22_cs_primary": { | ||||
| 257 | + "pages": 16, | ||||
| 258 | + "records": 3025, | ||||
| 259 | + "done": true, | ||||
| 260 | + "count": 3025 | ||||
| 261 | + }, | ||||
| 262 | + "2026-10-22_cs_secondary": { | ||||
| 263 | + "pages": 12, | ||||
| 264 | + "records": 2346, | ||||
| 265 | + "done": true, | ||||
| 266 | + "count": 2346 | ||||
| 267 | + }, | ||||
| 268 | + "2026-10-23_cs_primary": { | ||||
| 269 | + "pages": 17, | ||||
| 270 | + "records": 3220, | ||||
| 271 | + "done": true, | ||||
| 272 | + "count": 3220 | ||||
| 273 | + }, | ||||
| 274 | + "2026-10-23_cs_secondary": { | ||||
| 275 | + "pages": 13, | ||||
| 276 | + "records": 2401, | ||||
| 277 | + "done": true, | ||||
| 278 | + "count": 2401 | ||||
| 279 | + }, | ||||
| 280 | + "2026-10-24_cs_primary": { | ||||
| 281 | + "pages": 11, | ||||
| 282 | + "records": 2074, | ||||
| 283 | + "done": true, | ||||
| 284 | + "count": 2074 | ||||
| 285 | + }, | ||||
| 286 | + "2026-10-24_cs_secondary": { | ||||
| 287 | + "pages": 9, | ||||
| 288 | + "records": 1784, | ||||
| 289 | + "done": true, | ||||
| 290 | + "count": 1784 | ||||
| 291 | + }, | ||||
| 292 | + "2026-10-25_cs_primary": { | ||||
| 293 | + "pages": 9, | ||||
| 294 | + "records": 1735, | ||||
| 295 | + "done": true, | ||||
| 296 | + "count": 1735 | ||||
| 297 | + }, | ||||
| 298 | + "2026-10-25_cs_secondary": { | ||||
| 299 | + "pages": 9, | ||||
| 300 | + "records": 1772, | ||||
| 301 | + "done": true, | ||||
| 302 | + "count": 1772 | ||||
| 303 | + }, | ||||
| 304 | + "2026-10-26_cs_primary": { | ||||
| 305 | + "pages": 16, | ||||
| 306 | + "records": 3197, | ||||
| 307 | + "done": true, | ||||
| 308 | + "count": 3197 | ||||
| 309 | + }, | ||||
| 310 | + "2026-10-26_cs_secondary": { | ||||
| 311 | + "pages": 14, | ||||
| 312 | + "records": 2719, | ||||
| 313 | + "done": true, | ||||
| 314 | + "count": 2719 | ||||
| 315 | + }, | ||||
| 316 | + "2026-10-27_cs_primary": { | ||||
| 317 | + "pages": 15, | ||||
| 318 | + "records": 2953, | ||||
| 319 | + "done": true, | ||||
| 320 | + "count": 2953 | ||||
| 321 | + }, | ||||
| 322 | + "2026-10-27_cs_secondary": { | ||||
| 323 | + "pages": 15, | ||||
| 324 | + "records": 2829, | ||||
| 325 | + "done": true, | ||||
| 326 | + "count": 2829 | ||||
| 327 | + }, | ||||
| 328 | + "2026-10-28_cs_primary": { | ||||
| 329 | + "pages": 15, | ||||
| 330 | + "records": 2910, | ||||
| 331 | + "done": true, | ||||
| 332 | + "count": 2910 | ||||
| 333 | + }, | ||||
| 334 | + "2026-10-28_cs_secondary": { | ||||
| 335 | + "pages": 12, | ||||
| 336 | + "records": 2234, | ||||
| 337 | + "done": true, | ||||
| 338 | + "count": 2234 | ||||
| 339 | + }, | ||||
| 340 | + "2026-10-29_cs_primary": { | ||||
| 341 | + "pages": 17, | ||||
| 342 | + "records": 3363, | ||||
| 343 | + "done": true, | ||||
| 344 | + "count": 3363 | ||||
| 345 | + }, | ||||
| 346 | + "2026-10-29_cs_secondary": { | ||||
| 347 | + "pages": 13, | ||||
| 348 | + "records": 2544, | ||||
| 349 | + "done": true, | ||||
| 350 | + "count": 2544 | ||||
| 351 | + }, | ||||
| 352 | + "2026-10-30_cs_primary": { | ||||
| 353 | + "pages": 17, | ||||
| 354 | + "records": 3266, | ||||
| 355 | + "done": true, | ||||
| 356 | + "count": 3266 | ||||
| 357 | + }, | ||||
| 358 | + "2026-10-30_cs_secondary": { | ||||
| 359 | + "pages": 49, | ||||
| 360 | + "records": 9607, | ||||
| 361 | + "done": true, | ||||
| 362 | + "count": 9607 | ||||
| 363 | + }, | ||||
| 364 | + "2026-10-31_cs_primary": { | ||||
| 365 | + "pages": 11, | ||||
| 366 | + "records": 2044, | ||||
| 367 | + "done": true, | ||||
| 368 | + "count": 2044 | ||||
| 369 | + }, | ||||
| 370 | + "2026-10-31_cs_secondary": { | ||||
| 371 | + "pages": 8, | ||||
| 372 | + "records": 1600, | ||||
| 373 | + "done": true, | ||||
| 374 | + "count": 1600 | ||||
| 375 | + }, | ||||
| 376 | + "2026-11-01_cs_primary": { | ||||
| 377 | + "pages": 8, | ||||
| 378 | + "records": 1559, | ||||
| 379 | + "done": true, | ||||
| 380 | + "count": 1559 | ||||
| 381 | + }, | ||||
| 382 | + "2026-11-01_cs_secondary": { | ||||
| 383 | + "pages": 7, | ||||
| 384 | + "records": 1354, | ||||
| 385 | + "done": true, | ||||
| 386 | + "count": 1354 | ||||
| 387 | + }, | ||||
| 388 | + "2026-11-02_cs_primary": { | ||||
| 389 | + "pages": 5, | ||||
| 390 | + "records": 1000, | ||||
| 391 | + "done": false, | ||||
| 392 | + "count": 1832 | ||||
| 393 | + } | ||||
| 394 | + }, | ||||
| 395 | + "calls": 1002, | ||||
| 396 | + "cost_usd_total": 0.09990000000000183 | ||||
| 397 | +} | ||||
| \ No newline at end of file | |||||
added
data/metadata/dblp_parse_report.json
+114 −0
@@ -0,0 +1,114 @@ | |||||
| 1 | +{ | ||||
| 2 | + "input": "/Users/simon-pierreboucher/wp44_uqo/data/raw/dblp/dblp.xml.gz", | ||||
| 3 | + "input_bytes": 1116270104, | ||||
| 4 | + "input_md5_first_GiB": "187624d86f19db0c6daacc099f11b778", | ||||
| 5 | + "parsed_at": "2026-11-03T02:27:30.783487+00:00", | ||||
| 6 | + "rows_written": 8840866, | ||||
| 7 | + "min_year": 0, | ||||
| 8 | + "counts_by_type": { | ||||
| 9 | + "incollection": 71247, | ||||
| 10 | + "book": 21648, | ||||
| 11 | + "proceedings": 65792, | ||||
| 12 | + "mastersthesis": 27, | ||||
| 13 | + "data": 30631, | ||||
| 14 | + "article": 4500501, | ||||
| 15 | + "inproceedings": 3995530, | ||||
| 16 | + "phdthesis": 158398 | ||||
| 17 | + }, | ||||
| 18 | + "counts_by_year": { | ||||
| 19 | + "1936": 12, | ||||
| 20 | + "1937": 16, | ||||
| 21 | + "1938": 11, | ||||
| 22 | + "1939": 18, | ||||
| 23 | + "1940": 10, | ||||
| 24 | + "1941": 13, | ||||
| 25 | + "1942": 13, | ||||
| 26 | + "1943": 8, | ||||
| 27 | + "1944": 5, | ||||
| 28 | + "1945": 9, | ||||
| 29 | + "1946": 31, | ||||
| 30 | + "1947": 10, | ||||
| 31 | + "1948": 41, | ||||
| 32 | + "1949": 52, | ||||
| 33 | + "1950": 29, | ||||
| 34 | + "1951": 46, | ||||
| 35 | + "1952": 115, | ||||
| 36 | + "1953": 173, | ||||
| 37 | + "1954": 226, | ||||
| 38 | + "1955": 213, | ||||
| 39 | + "1956": 355, | ||||
| 40 | + "1957": 343, | ||||
| 41 | + "1958": 464, | ||||
| 42 | + "1959": 716, | ||||
| 43 | + "1960": 625, | ||||
| 44 | + "1961": 903, | ||||
| 45 | + "1962": 1186, | ||||
| 46 | + "1963": 1034, | ||||
| 47 | + "1964": 1108, | ||||
| 48 | + "1965": 1291, | ||||
| 49 | + "1966": 1506, | ||||
| 50 | + "1967": 1763, | ||||
| 51 | + "1968": 2184, | ||||
| 52 | + "1969": 2120, | ||||
| 53 | + "1970": 2239, | ||||
| 54 | + "1971": 3138, | ||||
| 55 | + "1972": 3774, | ||||
| 56 | + "1973": 4434, | ||||
| 57 | + "1974": 5037, | ||||
| 58 | + "1975": 5307, | ||||
| 59 | + "1976": 5766, | ||||
| 60 | + "1977": 6048, | ||||
| 61 | + "1978": 6862, | ||||
| 62 | + "1979": 7045, | ||||
| 63 | + "1980": 7931, | ||||
| 64 | + "1981": 8797, | ||||
| 65 | + "1982": 10070, | ||||
| 66 | + "1983": 10981, | ||||
| 67 | + "1984": 12452, | ||||
| 68 | + "1985": 14028, | ||||
| 69 | + "1986": 16627, | ||||
| 70 | + "1987": 17875, | ||||
| 71 | + "1988": 22028, | ||||
| 72 | + "1989": 24567, | ||||
| 73 | + "1990": 28769, | ||||
| 74 | + "1991": 31766, | ||||
| 75 | + "1992": 35486, | ||||
| 76 | + "1993": 41246, | ||||
| 77 | + "1994": 45575, | ||||
| 78 | + "1995": 47992, | ||||
| 79 | + "1996": 53087, | ||||
| 80 | + "1997": 57423, | ||||
| 81 | + "1998": 64742, | ||||
| 82 | + "1999": 71314, | ||||
| 83 | + "2000": 81557, | ||||
| 84 | + "2001": 87405, | ||||
| 85 | + "2002": 98626, | ||||
| 86 | + "2003": 118281, | ||||
| 87 | + "2004": 137602, | ||||
| 88 | + "2005": 160421, | ||||
| 89 | + "2006": 178083, | ||||
| 90 | + "2007": 191043, | ||||
| 91 | + "2008": 205328, | ||||
| 92 | + "2009": 224377, | ||||
| 93 | + "2010": 231160, | ||||
| 94 | + "2011": 252779, | ||||
| 95 | + "2012": 265810, | ||||
| 96 | + "2013": 282991, | ||||
| 97 | + "2014": 294858, | ||||
| 98 | + "2015": 305175, | ||||
| 99 | + "2016": 317540, | ||||
| 100 | + "2017": 342474, | ||||
| 101 | + "2018": 378942, | ||||
| 102 | + "2019": 422314, | ||||
| 103 | + "2020": 439815, | ||||
| 104 | + "2021": 468931, | ||||
| 105 | + "2022": 489072, | ||||
| 106 | + "2023": 530579, | ||||
| 107 | + "2024": 590864, | ||||
| 108 | + "2025": 605696, | ||||
| 109 | + "2026": 446274, | ||||
| 110 | + "2027": 3814, | ||||
| 111 | + "None": 2908 | ||||
| 112 | + }, | ||||
| 113 | + "seconds": 285 | ||||
| 114 | +} | ||||
| \ No newline at end of file | |||||
modified
manuscript/appendices/appB_search_and_sources.tex
+2 −2
@@ -177,7 +177,7 @@ exists in the slim table of all works but not in the retained subset, that is, | |||||
| 177 | works indexed by DBLP that OpenAlex labels with no computer-science topic. | 177 | works indexed by DBLP that OpenAlex labels with no computer-science topic. | ||
| 178 | Rather than accept OpenAlex's boundary, the pipeline reads the bucket a | 178 | Rather than accept OpenAlex's boundary, the pipeline reads the bucket a | ||
| 179 | second time in \emph{identifier-set mode}. The linkage script writes | 179 | second time in \emph{identifier-set mode}. The linkage script writes | ||
| 180 | −the list \texttt{data/metadata/needed\_oa\_ids.csv} of OpenAlex identifiers to | 180 | +the list \texttt{data/metadata/}\allowbreak\texttt{needed\_oa\_ids.csv} of OpenAlex identifiers to | ||
| 181 | recover (\LinkNeededOaIdsSecondPassDblpDoi{} reached through a DBLP DOI and | 181 | recover (\LinkNeededOaIdsSecondPassDblpDoi{} reached through a DBLP DOI and | ||
| 182 | \LinkNeededOaIdsSecondPassArxivDoi{} through an arXiv DOI), and | 182 | \LinkNeededOaIdsSecondPassArxivDoi{} through an arXiv DOI), and | ||
| 183 | \texttt{openalex\_snapshot.py --id-list} streams every part file again, | 183 | \texttt{openalex\_snapshot.py --id-list} streams every part file again, | ||
@@ -590,7 +590,7 @@ interim figure until the principal investigator's review (checkpoint H-1). | |||||
| 590 | 590 | ||||
| 591 | The acquisition can be repeated from the runbook in six commands, in the | 591 | The acquisition can be repeated from the runbook in six commands, in the | ||
| 592 | order of Table~\ref{tab:appB-acq}, on a machine with Python~3.12 and the | 592 | order of Table~\ref{tab:appB-acq}, on a machine with Python~3.12 and the | ||
| 593 | −locked environment of \texttt{reproducibility/environment\_M3U96b.txt}: | 593 | +locked environment of \texttt{reproducibility/}\allowbreak\texttt{environment\_M3U96b.txt}: | ||
| 594 | \begin{enumerate} | 594 | \begin{enumerate} | ||
| 595 | \item \texttt{openalex\_snapshot.py} with the manifest copy (then once more with \texttt{--id-list}); | 595 | \item \texttt{openalex\_snapshot.py} with the manifest copy (then once more with \texttt{--id-list}); | ||
| 596 | \item \texttt{openalex\_entities.py}; | 596 | \item \texttt{openalex\_entities.py}; | ||
modified
manuscript/appendices/appC_derivations.tex
+376 −1
@@ -392,7 +392,7 @@ followed by normalisation, $R_{t+1}(r) = \tilde R_{t+1}(r) / \sum_{r'} | |||||
| 392 | predictive likelihood of $y_{t+1}$. Then $\sum_{r \ge 1}\tilde R_{t+1}(r) = | 392 | predictive likelihood of $y_{t+1}$. Then $\sum_{r \ge 1}\tilde R_{t+1}(r) = | ||
| 393 | (1-H) Z_t$ and $\tilde R_{t+1}(0) = H Z_t$, so the normaliser is $Z_t$ and | 393 | (1-H) Z_t$ and $\tilde R_{t+1}(0) = H Z_t$, so the normaliser is $Z_t$ and | ||
| 394 | \begin{equation} | 394 | \begin{equation} | ||
| 395 | − R_{t+1}(0) \;=\; \frac{H Z_t}{H Z_t + (1-H) Z_t} \;=\; H \qquad \text{for every } t . | 395 | + R_{t+1}(0) \;=\; \frac{H Z_t}{H Z_t + (1-H) Z_t} \;=\; H \qquad \text{for every } t. | ||
| 396 | \label{eq:appC-r0} | 396 | \label{eq:appC-r0} | ||
| 397 | \end{equation} | 397 | \end{equation} | ||
| 398 | The filtered probability that a changepoint occurs \emph{at} the current | 398 | The filtered probability that a changepoint occurs \emph{at} the current | ||
@@ -417,3 +417,378 @@ one; the smoothed posterior of \citet{fearnhead2006exact} would require a | |||||
| 417 | backward pass and answers the retrospective question that the offline | 417 | backward pass and answers the retrospective question that the offline | ||
| 418 | methods of Sections~\ref{sec:appC-bp} and~\ref{sec:appC-pelt} already | 418 | methods of Sections~\ref{sec:appC-bp} and~\ref{sec:appC-pelt} already | ||
| 419 | address. | 419 | address. | ||
| 420 | + | ||||
| 421 | +\subsection{The Gini coefficient: rank form and Lorenz form} | ||||
| 422 | +\label{sec:appC-gini} | ||||
| 423 | + | ||||
| 424 | +Let $c_{(1)} \le c_{(2)} \le \dots \le c_{(n)}$ be the citation counts of | ||||
| 425 | +the $n$ works of a publication year sorted in ascending order, $S = | ||||
| 426 | +\sum_i c_{(i)} > 0$ their total, and $L_i = \sum_{j \le i} c_{(j)} / S$ the | ||||
| 427 | +cumulative share held by the $i$ least-cited works, with $L_0 = 0$ and | ||||
| 428 | +$L_n = 1$. The Lorenz curve \citep{lorenz1905concentration} is the polygon | ||||
| 429 | +through the points $(i/n, L_i)$, and the Gini coefficient is defined as one | ||||
| 430 | +minus twice the area $A$ under it \citep{ceriani2012gini}. By the | ||||
| 431 | +trapezoidal rule, which is exact for a polygon, | ||||
| 432 | +\begin{equation} | ||||
| 433 | + A \;=\; \sum_{i=1}^{n} \frac{1}{n}\cdot\frac{L_{i-1} + L_i}{2} | ||||
| 434 | + \;=\; \frac{1}{2n}\Bigl( 2\sum_{i=1}^{n} L_i - L_n \Bigr) | ||||
| 435 | + \;=\; \frac{1}{n}\sum_{i=1}^{n} L_i - \frac{1}{2n}. | ||||
| 436 | +\end{equation} | ||||
| 437 | +Exchanging the order of summation in $\sum_i L_i$, | ||||
| 438 | +\begin{equation} | ||||
| 439 | + \sum_{i=1}^{n} L_i \;=\; \frac{1}{S}\sum_{i=1}^{n}\sum_{j=1}^{i} c_{(j)} | ||||
| 440 | + \;=\; \frac{1}{S}\sum_{j=1}^{n} (n - j + 1)\, c_{(j)} | ||||
| 441 | + \;=\; (n+1) - \frac{1}{S}\sum_{j=1}^{n} j\, c_{(j)}, | ||||
| 442 | +\end{equation} | ||||
| 443 | +so that | ||||
| 444 | +\begin{equation} | ||||
| 445 | + G \;=\; 1 - 2A | ||||
| 446 | + \;=\; 1 - \frac{2(n+1)}{n} + \frac{2}{nS}\sum_{j=1}^{n} j\, c_{(j)} + \frac{1}{n} | ||||
| 447 | + \;=\; \frac{2\sum_{j=1}^{n} j\, c_{(j)}}{n \sum_{j} c_{(j)}} - \frac{n+1}{n}, | ||||
| 448 | + \label{eq:appC-gini} | ||||
| 449 | +\end{equation} | ||||
| 450 | +which is equation~\eqref{eq:gini} of Part~IV and the expression that | ||||
| 451 | +\texttt{bibliometrics/03\_citation\_impact.py} evaluates in SQL, the rank | ||||
| 452 | +$j$ being the window function \texttt{row\_number()} partitioned by year and | ||||
| 453 | +ordered by the citation count and then by the work identifier. | ||||
| 454 | +The secondary ordering by work identifier is needed only to make the rank a | ||||
| 455 | +permutation when counts tie; since tied values receive consecutive ranks and | ||||
| 456 | +contribute $c \cdot (j + j')$ to the numerator whichever of the two tied | ||||
| 457 | +works gets the smaller rank, the value of $G$ does not depend on how ties are | ||||
| 458 | +broken. The bounds follow from \eqref{eq:appC-gini}: $G = 0$ when all | ||||
| 459 | +$c_{(j)}$ are equal (then $\sum_j j c_{(j)} = c\,n(n+1)/2$ and the two terms | ||||
| 460 | +cancel), and $G = 1 - 1/n$ when a single work holds all citations (then | ||||
| 461 | +$\sum_j j c_{(j)} = nS$), so the maximum attainable value is $1 - 1/n$ rather | ||||
| 462 | +than one and the coefficient is not normalised by that factor. Uncited works | ||||
| 463 | +enter with $c_{(j)} = 0$ at the lowest ranks; adding $u$ uncited works to a | ||||
| 464 | +year leaves $\sum_j j c_{(j)}$ shifted by $uS$ and $n$ increased by $u$, and | ||||
| 465 | +one checks from \eqref{eq:appC-gini} that $G$ increases, which is the | ||||
| 466 | +direction stated in Part~IV and the reason the uncited share accompanies the | ||||
| 467 | +coefficient in the tables. | ||||
| 468 | + | ||||
| 469 | +\subsection{Rao--Stirling and Leinster--Cobbold at order two} | ||||
| 470 | +\label{sec:appC-diversity} | ||||
| 471 | + | ||||
| 472 | +Let $p \in \R^K$ be a probability vector over categories, $\delta_{ij} \in | ||||
| 473 | +[0,1]$ a dissimilarity with $\delta_{ii} = 0$, and $Z = (z_{ij})$ the | ||||
| 474 | +similarity matrix $z_{ij} = 1 - \delta_{ij}$, so that $z_{ii} = 1$. The | ||||
| 475 | +Rao--Stirling index \citep{rao1982diversity, stirling2007diversity} is | ||||
| 476 | +$\Delta_{\mathrm{RS}}(p) = \sum_{i \ne j} p_i p_j \delta_{ij} = p^{\top}\Delta p$ | ||||
| 477 | +with $\Delta = (\delta_{ij})$, the diagonal contributing nothing. The | ||||
| 478 | +Leinster--Cobbold diversity of order $q$ \citep{leinster2012diversity} is | ||||
| 479 | +${}^{q}D^{Z}(p) = \bigl(\sum_{i : p_i > 0} p_i (Zp)_i^{q-1}\bigr)^{1/(1-q)}$; | ||||
| 480 | +at $q = 2$ the exponent $1/(1-q) = -1$ and the inner power is one, so | ||||
| 481 | +\begin{equation} | ||||
| 482 | + {}^{2}D^{Z}(p) \;=\; \Bigl(\sum_i p_i (Zp)_i\Bigr)^{-1} \;=\; \frac{1}{p^{\top} Z p}. | ||||
| 483 | +\end{equation} | ||||
| 484 | +Since $Z = \mathbf{1}\mathbf{1}^{\top} - \Delta$ entrywise (using $z_{ii} = 1 | ||||
| 485 | += 1 - \delta_{ii}$ on the diagonal as well), and $p^{\top}\mathbf{1}\mathbf{1}^{\top}p | ||||
| 486 | += (\sum_i p_i)^2 = 1$, | ||||
| 487 | +\begin{equation} | ||||
| 488 | + p^{\top} Z p \;=\; 1 - p^{\top}\Delta p \;=\; 1 - \Delta_{\mathrm{RS}}(p), | ||||
| 489 | + \qquad\text{hence}\qquad | ||||
| 490 | + {}^{2}D^{Z}(p) \;=\; \frac{1}{1 - \Delta_{\mathrm{RS}}(p)}, | ||||
| 491 | + \label{eq:appC-lc2} | ||||
| 492 | +\end{equation} | ||||
| 493 | +the identity quoted in Part~IV\@. It shows that at order two the two | ||||
| 494 | +families carry the same information: ${}^{2}D^{Z}$ is a strictly increasing | ||||
| 495 | +function of $\Delta_{\mathrm{RS}}$ on $[0, 1)$, and the ordering of years or | ||||
| 496 | +categories by either index is the same. They differ in scale and in | ||||
| 497 | +behaviour near saturation. $\Delta_{\mathrm{RS}}$ is bounded by the mean | ||||
| 498 | +dissimilarity and compresses differences among very even distributions; | ||||
| 499 | +${}^{2}D^{Z}$ is an effective number of categories, equal to $K$ for the | ||||
| 500 | +uniform distribution over $K$ mutually dissimilar categories | ||||
| 501 | +($\Delta_{\mathrm{RS}} = 1 - 1/K$) and to one for a distribution concentrated | ||||
| 502 | +on a single category ($\Delta_{\mathrm{RS}} = 0$), and it expands the | ||||
| 503 | +compressed end. The identity requires only $z_{ii} = 1$ and $z_{ij} = 1 - | ||||
| 504 | +\delta_{ij}$; it does not require $\delta$ to be a metric, and the | ||||
| 505 | +dissimilarity used, one minus a cosine similarity of category centroids, | ||||
| 506 | +is not one. The script \texttt{bibliometrics/04\_diversity\_cagr.py} | ||||
| 507 | +computes both quantities from the yearly category mix exactly as | ||||
| 508 | +\eqref{eq:appC-lc2} prescribes, $\Delta_{\mathrm{RS}} = p^{\top}(1 - Z)p$ | ||||
| 509 | +with the diagonal of $Z$ set to one and ${}^{2}D^{Z} = 1/(p^{\top}Zp)$, and | ||||
| 510 | +attaches a percentile bootstrap interval to $\Delta_{\mathrm{RS}}$ by | ||||
| 511 | +multinomial resampling of the works over categories ($B = 500$, seed 44), | ||||
| 512 | +which is the sampling model under which the category counts of a year are | ||||
| 513 | +a multinomial draw of fixed size; the interval of ${}^{2}D^{Z}$ follows by | ||||
| 514 | +the monotone transformation. | ||||
| 515 | + | ||||
| 516 | +\subsection{Modularity of a directed weighted graph at a fixed partition} | ||||
| 517 | +\label{sec:appC-modularity} | ||||
| 518 | + | ||||
| 519 | +Let $W \in \R_{\ge 0}^{K \times K}$ be the flow matrix of a citing year, | ||||
| 520 | +$W_{ij}$ the number of citations from category $i$ to category $j$, with | ||||
| 521 | +$m = \sum_{ij} W_{ij}$, out-strength $k^{\mathrm{out}}_i = \sum_j W_{ij}$ and | ||||
| 522 | +in-strength $k^{\mathrm{in}}_j = \sum_i W_{ij}$, and let $g : \{1, \dots, K\} | ||||
| 523 | +\to \mathcal{G}$ be a given assignment of categories to communities. The | ||||
| 524 | +statistic implemented by \texttt{modularity()} in | ||||
| 525 | +\texttt{knowledge\_graph/02\_category\_flows.py} is | ||||
| 526 | +\begin{equation} | ||||
| 527 | + Q(W, g) \;=\; \frac{1}{m}\sum_{i,j}\Bigl( W_{ij} - \frac{k^{\mathrm{out}}_i k^{\mathrm{in}}_j}{m} \Bigr)\mathbf{1}[g_i = g_j], | ||||
| 528 | + \label{eq:appC-Q} | ||||
| 529 | +\end{equation} | ||||
| 530 | +the directed form of \citet{leicht2008directed}, which reduces to the | ||||
| 531 | +Newman--Girvan modularity \citep{newman2004community} when $W$ is symmetric | ||||
| 532 | +(then $k^{\mathrm{out}} = k^{\mathrm{in}} = k$ and $m = 2|E|$ for an | ||||
| 533 | +unweighted graph). Three facts are used in Part~IV\@. First, the null term | ||||
| 534 | +is the expected weight of the edge $i \to j$ under random rewiring that | ||||
| 535 | +preserves every node's out- and in-strength in expectation: a configuration | ||||
| 536 | +model in which each of the $m$ units of weight leaves node $i$ with | ||||
| 537 | +probability $k^{\mathrm{out}}_i/m$ and enters node $j$ with probability | ||||
| 538 | +$k^{\mathrm{in}}_j/m$ independently gives expected weight | ||||
| 539 | +$m \cdot (k^{\mathrm{out}}_i/m)(k^{\mathrm{in}}_j/m) = k^{\mathrm{out}}_i | ||||
| 540 | +k^{\mathrm{in}}_j/m$, and summing over $j$ recovers $k^{\mathrm{out}}_i$, so | ||||
| 541 | +the null model has the observed strengths. Second, $Q$ vanishes when all | ||||
| 542 | +nodes are in one community: then the indicator is identically one and | ||||
| 543 | +$\sum_{ij} W_{ij} = m = \sum_{ij} k^{\mathrm{out}}_i k^{\mathrm{in}}_j/m$. | ||||
| 544 | +Third, writing $e_{gg} = \sum_{i,j : g_i = g_j = g} W_{ij}/m$ for the fraction | ||||
| 545 | +of weight inside community $g$, $a^{\mathrm{out}}_g = \sum_{i : g_i = g} | ||||
| 546 | +k^{\mathrm{out}}_i/m$ and $a^{\mathrm{in}}_g$ likewise, | ||||
| 547 | +\begin{equation} | ||||
| 548 | + Q \;=\; \sum_{g \in \mathcal{G}} \bigl( e_{gg} - a^{\mathrm{out}}_g\, a^{\mathrm{in}}_g \bigr), | ||||
| 549 | + \label{eq:appC-Qcomm} | ||||
| 550 | +\end{equation} | ||||
| 551 | +so that $Q \le \sum_g e_{gg} \le 1$ and $Q \ge -\sum_g a^{\mathrm{out}}_g | ||||
| 552 | +a^{\mathrm{in}}_g \ge -1$; the value is positive when more weight stays | ||||
| 553 | +inside communities than the strength-preserving null predicts. The | ||||
| 554 | +self-share reported alongside, $\operatorname{tr}(W)/m = \sum_i e_{ii}$ at | ||||
| 555 | +the category partition, is the first term of \eqref{eq:appC-Qcomm} alone and | ||||
| 556 | +differs from $Q_{\mathrm{cat}}$ by the correction $\sum_i a^{\mathrm{out}}_i | ||||
| 557 | +a^{\mathrm{in}}_i$, which grows with the concentration of flows on a few | ||||
| 558 | +large categories. For the area partition, \eqref{eq:appC-Qcomm} is summed | ||||
| 559 | +over the eight areas with $e_{\alpha\alpha}$ the within-area share, which is | ||||
| 560 | +one minus the cross-area share $X_{\alpha,t}$ of Part~IV weighted by the | ||||
| 561 | +area's out-strength; $Q_{\mathrm{area}}$ is therefore a strength-weighted, | ||||
| 562 | +null-corrected average of the within-area shares, and a fall in | ||||
| 563 | +$Q_{\mathrm{area}}$ can arise from a rise in boundary crossing or from a | ||||
| 564 | +shift of out-strength toward areas whose $a^{\mathrm{out}}_\alpha | ||||
| 565 | +a^{\mathrm{in}}_\alpha$ is large. Because the partition is fixed rather than | ||||
| 566 | +optimised, none of the resolution-limit results for maximised modularity | ||||
| 567 | +\citep{fortunato2007resolution} applies; $Q$ is here a descriptive index and | ||||
| 568 | +its comparison across years is meaningful only because the partition and | ||||
| 569 | +the category definitions are the same in every year. | ||||
| 570 | + | ||||
| 571 | +\subsection{Krippendorff's \texorpdfstring{$\alpha$}{alpha} with the MASI distance} | ||||
| 572 | +\label{sec:appC-alpha} | ||||
| 573 | + | ||||
| 574 | +\paragraph{General form.} | ||||
| 575 | +Krippendorff's $\alpha$ \citep{hayes2007krippendorff, artstein2008agreement} | ||||
| 576 | +is defined for any difference function $d(v, v') \ge 0$ on the values that | ||||
| 577 | +coders may assign, with $d(v, v) = 0$, as | ||||
| 578 | +\begin{equation} | ||||
| 579 | + \alpha \;=\; 1 - \frac{D_o}{D_e}, | ||||
| 580 | + \label{eq:appC-alpha} | ||||
| 581 | +\end{equation} | ||||
| 582 | +where $D_o$ is the mean difference between the values assigned to the same | ||||
| 583 | +unit by different coders and $D_e$ the mean difference between all pairs of | ||||
| 584 | +values in the pooled data, irrespective of unit. With two coders $A$ and $B$ | ||||
| 585 | +rating each of $n$ units, the pooled set contains $N = 2n$ values and | ||||
| 586 | +\begin{equation} | ||||
| 587 | + D_o \;=\; \frac{1}{n}\sum_{u=1}^{n} d\bigl(a_u, b_u\bigr), \qquad | ||||
| 588 | + D_e \;=\; \frac{1}{N(N-1)}\sum_{c \ne c'} d\bigl(v_c, v_{c'}\bigr) | ||||
| 589 | + \;=\; \frac{1}{\binom{N}{2}}\sum_{c < c'} d\bigl(v_c, v_{c'}\bigr), | ||||
| 590 | + \label{eq:appC-DoDe} | ||||
| 591 | +\end{equation} | ||||
| 592 | +the second equality using the symmetry of $d$. The coefficient is one when | ||||
| 593 | +the coders agree on every unit ($D_o = 0$), zero when the within-unit | ||||
| 594 | +differences are what chance pairing of the pooled values would produce | ||||
| 595 | +($D_o = D_e$), and negative when disagreement is systematic. Unlike Cohen's | ||||
| 596 | +$\kappa$, which compares observed agreement with the product of the two | ||||
| 597 | +coders' marginals, $\alpha$ pools the two coders' values into one | ||||
| 598 | +distribution for its chance term, so it does not reward coders for having | ||||
| 599 | +different marginal distributions; this and its accommodation of arbitrary | ||||
| 600 | +difference functions are the reasons it is the recommended coefficient for | ||||
| 601 | +set-valued annotation \citep{artstein2008agreement}. | ||||
| 602 | + | ||||
| 603 | +\paragraph{The MASI distance.} | ||||
| 604 | +For set-valued labels $x, y \subseteq \mathcal{K}$, \citet{passonneau2006masi} | ||||
| 605 | +defines the Measuring Agreement on Set-valued Items distance as | ||||
| 606 | +\begin{gather} | ||||
| 607 | + d_{\mathrm{MASI}}(x, y) \;=\; 1 - J(x, y)\, M(x, y), \qquad | ||||
| 608 | + J(x, y) = \frac{|x \cap y|}{|x \cup y|}, \nonumber\\ | ||||
| 609 | + M(x, y) = | ||||
| 610 | + \begin{cases} | ||||
| 611 | + 1 & x = y,\\ | ||||
| 612 | + 2/3 & x \subsetneq y \text{ or } y \subsetneq x,\\ | ||||
| 613 | + 1/3 & x \cap y \ne \emptyset \text{ and neither contains the other},\\ | ||||
| 614 | + 0 & x \cap y = \emptyset , | ||||
| 615 | + \end{cases} | ||||
| 616 | + \label{eq:appC-masi} | ||||
| 617 | +\end{gather} | ||||
| 618 | +the Jaccard similarity attenuated by a monotonicity factor that | ||||
| 619 | +distinguishes nesting from mere overlap. The distance is zero only for | ||||
| 620 | +identical non-empty sets, equals one for disjoint sets, and treats the pair | ||||
| 621 | +(empty, empty) as identical ($d = 0$) by the convention of the | ||||
| 622 | +implementation, which returns zero before computing $J$ for two empty sets; | ||||
| 623 | +the pair (empty, non-empty) has $J = 0$ and $d = 1$. | ||||
| 624 | + | ||||
| 625 | +\paragraph{What the code computes.} | ||||
| 626 | +\texttt{taxonomy/validate\_sample.py} forms, for the two raters, the | ||||
| 627 | +observed term as the mean of $d_{\mathrm{MASI}}^2$ over the $n$ rated works | ||||
| 628 | +and the expected term as the mean of $d_{\mathrm{MASI}}^2$ over all | ||||
| 629 | +unordered pairs of the $2n$ pooled label sets (exhaustively when | ||||
| 630 | +$2n \le 1200$, otherwise over 200{,}000 random ordered pairs with $i \ne j$, | ||||
| 631 | +seed 44), and reports $1 - D_o/D_e$. Two remarks make this precise. The code | ||||
| 632 | +uses the constants $0.67$ and $0.33$ for the monotonicity factor rather than | ||||
| 633 | +$2/3$ and $1/3$, a rounding of the published definition that changes | ||||
| 634 | +distances by at most $0.0034$. More consequentially, it \emph{squares} the | ||||
| 635 | +MASI distance before averaging, that is, it applies | ||||
| 636 | +\eqref{eq:appC-alpha}--\eqref{eq:appC-DoDe} with $d = d_{\mathrm{MASI}}^2$. | ||||
| 637 | +Krippendorff's interval metric is the squared difference, and the code's | ||||
| 638 | +comment describes the computation as the ``interval form on the MASI | ||||
| 639 | +distance''; \citeauthor{passonneau2006masi}, in contrast, plugs | ||||
| 640 | +$d_{\mathrm{MASI}}$ itself into the $\alpha$ formula, and the agreement | ||||
| 641 | +packages that implement MASI follow her. The two conventions yield different | ||||
| 642 | +numbers from the same ratings---squaring compresses small disagreements and | ||||
| 643 | +so, as a rule, raises $\alpha$ when most disagreements are partial---and the | ||||
| 644 | +value reported in Part~IX is the squared-distance version, labelled as such. | ||||
| 645 | +Both are legitimate instances of \eqref{eq:appC-alpha}; what is not | ||||
| 646 | +legitimate is to compare the reported value with published MASI-$\alpha$ | ||||
| 647 | +figures without this caveat. The mean Jaccard index reported next to it is | ||||
| 648 | +$n^{-1}\sum_u J(a_u, b_u)$ with $0/0 = 0$ and is a raw agreement rate with | ||||
| 649 | +no chance correction. Both statistics are computed on the full rated sample | ||||
| 650 | +and not on the 200-work subsample reserved for the principal investigator, | ||||
| 651 | +whose verdicts will add a third coder to \eqref{eq:appC-DoDe} once | ||||
| 652 | +checkpoint H-2 is signed. | ||||
| 653 | + | ||||
| 654 | +\subsection{The multi-label score rule and the tie-break as a total order} | ||||
| 655 | +\label{sec:appC-score} | ||||
| 656 | + | ||||
| 657 | +\paragraph{Score.} | ||||
| 658 | +For a work $w$ and a category $k$ the implementation | ||||
| 659 | +(\texttt{taxonomy/classify.py}, \texttt{score\_row}) computes five | ||||
| 660 | +components, one per signal type $\sigma \in \{\mathrm{T}, \mathrm{F}, | ||||
| 661 | +\mathrm{X}, \mathrm{D}, \mathrm{kw}\}$, | ||||
| 662 | +\begin{align} | ||||
| 663 | + s^{\sigma}_k(w) &\;=\; \min\Bigl\{ 1,\ \sum_{x \in \sigma(w)} \omega^{\sigma}_k(x) \Bigr\} | ||||
| 664 | + \qquad (\sigma \ne \mathrm{kw}), \\ | ||||
| 665 | + s^{\mathrm{kw}}_k(w) &\;=\; \min\Bigl\{ 1,\ \sum_{(r, \omega, \phi) \in R_k} \omega\, \mathbf{1}[r \text{ matches } \phi(w)] \Bigr\}, | ||||
| 666 | +\end{align} | ||||
| 667 | +where $\sigma(w)$ is the \emph{set} of the work's topic, subfield, arXiv | ||||
| 668 | +category or DBLP stream identifiers (Python \texttt{set()}, so a repeated | ||||
| 669 | +identifier contributes once), and the keyword loop stops at the first rule | ||||
| 670 | +that brings the running sum to one, which is equivalent to the capped sum. | ||||
| 671 | +The score is $s_k(w) = \sum_\sigma s^{\sigma}_k(w) \in [0, 5]$; a category | ||||
| 672 | +with $s_k(w) \ge \theta = 1$ is then vetoed if any exclusion pattern of | ||||
| 673 | +$Z_k$ matches the concatenation of title and abstract, in which case its | ||||
| 674 | +score is set to zero and it is not assigned. The set of assigned categories | ||||
| 675 | +is $C(w) = \{k : s_k(w) \ge \theta,\ \text{not vetoed}\}$, and the stored | ||||
| 676 | +score of an assigned category is $s_k(w)$ rounded to three decimals. Two | ||||
| 677 | +elementary properties justify the reading given in Part~IV\@. The cap makes | ||||
| 678 | +each component a bounded, monotone, subadditive function of the matched | ||||
| 679 | +weights: adding a signal never lowers a component, and no number of signals | ||||
| 680 | +of one type can contribute more than one. And because the threshold equals | ||||
| 681 | +the cap, a single weight-one signal of any type suffices for assignment | ||||
| 682 | +while signals of weight below one require corroboration from a different | ||||
| 683 | +type; formally, $s_k(w) \ge 1$ holds if and only if either some component | ||||
| 684 | +reaches one or the sum of the (uncapped) components across at least two | ||||
| 685 | +types reaches one. | ||||
| 686 | + | ||||
| 687 | +\paragraph{Primary category as the minimum of a total order.} | ||||
| 688 | +Let $\mathcal{P}(w) = \bigcup_{k \in C(w)} \mathrm{parents}(k)$ be the set | ||||
| 689 | +of categories declared parents of at least one assigned category (the | ||||
| 690 | +\texttt{child\_of} relation of the ontology). The implementation sorts the | ||||
| 691 | +assigned categories by the key | ||||
| 692 | +\begin{equation} | ||||
| 693 | + \phi(k) \;=\; \bigl( -s_k(w),\ \mathbf{1}[k \in \mathcal{P}(w)],\ \mathrm{number}(k) \bigr) \in \R \times \{0,1\} \times \mathbb{N} | ||||
| 694 | + \label{eq:appC-key} | ||||
| 695 | +\end{equation} | ||||
| 696 | +in lexicographic order and takes the first element; this is | ||||
| 697 | +$\kappa^{\ast}(w) = \arg\min_{k \in C(w)} \phi(k)$ and coincides with the | ||||
| 698 | +lexicographic arg-max of Part~IV (the sign of the first component reversed). | ||||
| 699 | +The lexicographic order on $\R \times \{0,1\} \times \mathbb{N}$ is a total | ||||
| 700 | +order, and $\phi$ is injective on $\mathcal{K}$ because the ontology numbers | ||||
| 701 | +are distinct, so the restriction of $\phi$ to $C(w)$ has a unique minimum | ||||
| 702 | +whenever $C(w) \ne \emptyset$: the primary category is well defined and does | ||||
| 703 | +not depend on the order in which categories are scanned. The second | ||||
| 704 | +component implements ``child before parent'': if $k$ and $k'$ are both | ||||
| 705 | +assigned with equal scores and $k'$ is a declared parent of $k$, then | ||||
| 706 | +$k' \in \mathcal{P}(w)$ while $k$ may not be, and $k$ precedes $k'$. The rule | ||||
| 707 | +is not transitive in the sense of a hierarchy, however. Membership in | ||||
| 708 | +$\mathcal{P}(w)$ depends only on whether $k$ is the parent of \emph{some} | ||||
| 709 | +assigned category, not of the specific competitor; a category that is the | ||||
| 710 | +parent of a low-scoring assigned child is demoted in the tie against an | ||||
| 711 | +unrelated category of equal score. This is a property of the key as | ||||
| 712 | +implemented, stated here so that the primary counts of Part~IX are read with | ||||
| 713 | +it; it affects only exact ties in a score rounded to three decimals, which | ||||
| 714 | +are frequent precisely among the categories whose signals are weight-one | ||||
| 715 | +keywords. The third component, the ontology number, is arbitrary and makes | ||||
| 716 | +the order total; no claim is attached to it. | ||||
| 717 | + | ||||
| 718 | +\subsection{The emerging-topic label and the absence of look-ahead} | ||||
| 719 | +\label{sec:appC-lookahead} | ||||
| 720 | + | ||||
| 721 | +\paragraph{Filtrations.} | ||||
| 722 | +Index months by integers $t = 0, 1, \dots, M$ (January 2018 to the last | ||||
| 723 | +complete month) and let the panel of \texttt{experiments/emerging\_detection.py} | ||||
| 724 | +be the pair of arrays $n_{k,t}$ (eligible month-precision works of topic $k$ | ||||
| 725 | +with first month $t$) and $c_{k,t}$ (internal citations received by works of | ||||
| 726 | +topic $k$ from works with first month $t$). Define the filtration | ||||
| 727 | +\begin{equation} | ||||
| 728 | + \mathcal{F}_T \;=\; \sigma\bigl( n_{k,t},\ c_{k,t} :\ k \in \mathcal{K}_{\mathrm{top}},\ t \le T \bigr), | ||||
| 729 | + \label{eq:appC-filtration} | ||||
| 730 | +\end{equation} | ||||
| 731 | +the information contained in the panel columns up to and including month | ||||
| 732 | +$T$. A statistic is \emph{available at} $T$ if it is | ||||
| 733 | +$\mathcal{F}_T$-measurable. Each of the six features of Part~IV is a | ||||
| 734 | +function of sums of panel entries over windows $(a, b]$ with $b \le T$: | ||||
| 735 | +$g^{12}_{k,T}$ uses $(T-24, T]$, $\mathrm{acc}_{k,T}$ uses $(T-36, T]$, | ||||
| 736 | +$z_{k,T}$ uses $[T-27, T]$, $\mathrm{cit}_{k,T}$ uses $(T-24, T]$ of $c$, | ||||
| 737 | +$\mathrm{share}_{k,T}$ uses $(T-12, T]$ of every topic, and | ||||
| 738 | +$\mathrm{age}_{k,T}$ uses the cumulative sum up to $T$. All are | ||||
| 739 | +$\mathcal{F}_T$-measurable by construction. The implementation enforces this | ||||
| 740 | +by index arithmetic (\texttt{win(a, lo, hi)} slices columns \texttt{lo+1} | ||||
| 741 | +to \texttt{hi} inclusive with \texttt{hi = T\_idx}), not by convention. | ||||
| 742 | + | ||||
| 743 | +\paragraph{Label.} | ||||
| 744 | +The label $\ell_{k,T,h}$ of equation~\eqref{eq:label} is a function of | ||||
| 745 | +$V_k(T-h, T]$, $V_k(T, T+h]$, $V_k(T-12, T]$ and of the within-cutoff decile | ||||
| 746 | +of $g^{\mathrm{fut}}$ over eligible topics; it is therefore | ||||
| 747 | +$\mathcal{F}_{T+h}$-measurable and, because it depends on columns strictly | ||||
| 748 | +after $T$, not $\mathcal{F}_T$-measurable. The feature--label pair at cutoff | ||||
| 749 | +$T$ thus has the structure of a prediction problem: predict an | ||||
| 750 | +$\mathcal{F}_{T+h}$-measurable outcome from an $\mathcal{F}_T$-measurable | ||||
| 751 | +input. The eligibility condition $V_k(T-12, T] \ge 20$ is | ||||
| 752 | +$\mathcal{F}_T$-measurable, so conditioning on it does not leak the outcome. | ||||
| 753 | + | ||||
| 754 | +\paragraph{Separation of training and test.} | ||||
| 755 | +Let $\mathcal{T}_{\mathrm{tr}}$ and $\mathcal{T}_{\mathrm{te}}$ be the | ||||
| 756 | +training and test cutoffs. Every quantity used to fit a model---features, | ||||
| 757 | +labels and the standardisation constants of the scaler, which is fitted on | ||||
| 758 | +training rows only---is $\mathcal{F}_{T^{\mathrm{tr}}_{\max} + h}$-measurable | ||||
| 759 | +with $T^{\mathrm{tr}}_{\max} = \max \mathcal{T}_{\mathrm{tr}}$. The | ||||
| 760 | +implementation sets $T^{\mathrm{tr}}_{\max}$ to December 2021 for $h = 12$ | ||||
| 761 | +and to December 2020 for $h = 24$, so that $T^{\mathrm{tr}}_{\max} + h$ is | ||||
| 762 | +December 2022 in both cases, and the first test cutoff is January 2023. | ||||
| 763 | +Hence | ||||
| 764 | +\begin{equation} | ||||
| 765 | + T^{\mathrm{tr}}_{\max} + h \;<\; \min \mathcal{T}_{\mathrm{te}}, | ||||
| 766 | + \label{eq:appC-gap} | ||||
| 767 | +\end{equation} | ||||
| 768 | +and the fitted predictor is measurable with respect to a $\sigma$-field | ||||
| 769 | +that precedes every test feature, let alone every test label, which closes | ||||
| 770 | +at $\max \mathcal{T}_{\mathrm{te}} + h \le M$. Condition \eqref{eq:appC-gap} | ||||
| 771 | +is the formal content of ``out of time'' in the sense of | ||||
| 772 | +\citet{bergmeir2012crossval}; it is stricter than the plan's wording, which | ||||
| 773 | +allowed training cutoffs through 2022, and stricter for $h = 24$ than the | ||||
| 774 | +description of Part~IV, which gives December 2021 as the last training | ||||
| 775 | +cutoff for both horizons---the code's rule is the one that guarantees | ||||
| 776 | +\eqref{eq:appC-gap}, and the manuscript follows the code. The test cutoffs | ||||
| 777 | +are further restricted to those with $T + h \le M$, so that no test label is | ||||
| 778 | +right-censored. | ||||
| 779 | + | ||||
| 780 | +\paragraph{What measurability does not cover.} | ||||
| 781 | +The filtration \eqref{eq:appC-filtration} is generated by the panel, and the | ||||
| 782 | +panel is built once, in 2026, from a corpus whose topic assignments, | ||||
| 783 | +eligibility flags, linkage and month-precision filter were all fixed with | ||||
| 784 | +knowledge of the whole period. Formally, the random objects $n_{k,t}$ | ||||
| 785 | +themselves are not $\mathcal{F}_t$-measurable functionals of the literature | ||||
| 786 | +as it stood at $t$: they are functionals of the literature as OpenAlex | ||||
| 787 | +indexed and classified it by October 2026. The statement proved above is | ||||
| 788 | +therefore conditional: \emph{given} the 2026 panel, no feature at $T$ uses a | ||||
| 789 | +column after $T$ and no training quantity uses a column at or after the | ||||
| 790 | +first test cutoff. It is not the statement that an observer in 2021 could | ||||
| 791 | +have computed the training set, which would require a topic vocabulary and a | ||||
| 792 | +corpus frozen in 2021. Part~IV draws the distinction and names the | ||||
| 793 | +cluster-based extension that would narrow it; the derivation here makes | ||||
| 794 | +precise which half of the claim is proved and which is assumed. | ||||
modified
manuscript/references_appBC.bib
+1 −1
@@ -4,7 +4,7 @@ | |||||
| 4 | % are reused and never redefined here. | 4 | % are reused and never redefined here. | ||
| 5 | 5 | ||||
| 6 | @article{jackson2005optimal, | 6 | @article{jackson2005optimal, | ||
| 7 | − author = {Jackson, Brad and Scargle, Jeffrey D. and Barnes, David and Arabhi, Sundararajan and Alt, Alina and Gioumousis, Peter and Gwin, Elyus and Sangtrakulcharoen, Paungkaew and Tan, Linda and Tsai, Tun Tao}, | 7 | + author = {Jackson, B. and Scargle, J. D. and Barnes, D. and Arabhi, S. and Alt, A. and Gioumousis, P. and Gwin, E. and others}, | ||
| 8 | title = {An algorithm for optimal partitioning of data on an interval}, | 8 | title = {An algorithm for optimal partitioning of data on an interval}, | ||
| 9 | journal = {IEEE Signal Processing Letters}, | 9 | journal = {IEEE Signal Processing Letters}, | ||
| 10 | year = {2005}, | 10 | year = {2005}, | ||
modified
manuscript/references_verification_appBC.csv
+1 −1
@@ -1,5 +1,5 @@ | |||||
| 1 | key,doi_or_arxiv,verified_via,verified_title,match | 1 | key,doi_or_arxiv,verified_via,verified_title,match | ||
| 2 | −jackson2005optimal,10.1109/LSP.2001.838216,crossref,An algorithm for optimal partitioning of data on an interval,yes | 2 | +jackson2005optimal,10.1109/LSP.2001.838216,crossref+openalex W2097880821,An algorithm for optimal partitioning of data on an interval,yes (authors 8-10 given as 'P. San; L. Tan; Tun Tao Tsai' in both records; entry lists the first seven verified names and 'others') | ||
| 3 | lorenz1905concentration,10.1080/15225437.1905.10503443,crossref,Methods of Measuring the Concentration of Wealth,yes | 3 | lorenz1905concentration,10.1080/15225437.1905.10503443,crossref,Methods of Measuring the Concentration of Wealth,yes | ||
| 4 | passonneau2006masi,10.63317/4nuo6thi27ax,crossref+openalex W1747645360,Measuring Agreement on Set-valued Items (MASI) for Semantic and Pragmatic Annotation,yes | 4 | passonneau2006masi,10.63317/4nuo6thi27ax,crossref+openalex W1747645360,Measuring Agreement on Set-valued Items (MASI) for Semantic and Pragmatic Annotation,yes | ||
| 5 | artstein2008agreement,10.1162/coli.07-034-R2,crossref,Inter-Coder Agreement for Computational Linguistics,yes | 5 | artstein2008agreement,10.1162/coli.07-034-R2,crossref,Inter-Coder Agreement for Computational Linguistics,yes | ||
modified
manuscript/sections/part04_methodology.tex
+17 −8
@@ -521,10 +521,11 @@ the works to which rater $r$ assigned primary $k$; $\kappa$ is computed between | |||||
| 521 | the two raters and between the rules and each rater. Agreement on the label | 521 | the two raters and between the rules and each rater. Agreement on the label | ||
| 522 | sets is measured by the mean Jaccard index | 522 | sets is measured by the mean Jaccard index | ||
| 523 | $\bar J = n^{-1}\sum_w |C^{A}(w) \cap C^{B}(w)| / |C^{A}(w) \cup C^{B}(w)|$ | 523 | $\bar J = n^{-1}\sum_w |C^{A}(w) \cap C^{B}(w)| / |C^{A}(w) \cup C^{B}(w)|$ | ||
| 524 | −(with the convention $0/0 = 0$). The validation note announces Krippendorff's | 524 | +(with the convention $0/0 = 0$), and by Krippendorff's $\alpha$ with the | ||
| 525 | −$\alpha$ with the MASI distance for the multi-label agreement; the metrics | 525 | +MASI distance of \citet{passonneau2006masi} between the two raters' label | ||
| 526 | −script computes the mean Jaccard index instead, and the manuscript reports | 526 | +sets, in its interval form ($\alpha = 1 - D_o/D_e$ with squared MASI | ||
| 527 | −what is computed. A work is exported as a disagreement for human review when | 527 | +distances, $D_o$ the mean observed distance over works and $D_e$ the mean | ||
| 528 | +distance over all pairs of label sets); the derivation is in Appendix~C. A work is exported as a disagreement for human review when | ||||
| 528 | the rules, rater~A and rater~B have no category in common although at least | 529 | the rules, rater~A and rater~B have no category in common although at least | ||
| 529 | one of them assigned one. | 530 | one of them assigned one. | ||
| 530 | 531 | ||||
@@ -767,7 +768,12 @@ pipeline computes the category flow matrices from which $p$ is formed | |||||
| 767 | (Section~\ref{sec:m-networks}) and the centroid similarities, but the two | 768 | (Section~\ref{sec:m-networks}) and the centroid similarities, but the two | ||
| 768 | diversity indices are not yet produced by a script; they are defined here | 769 | diversity indices are not yet produced by a script; they are defined here | ||
| 769 | because the protocol commits to them, and their values in Part IX are | 770 | because the protocol commits to them, and their values in Part IX are | ||
| 770 | −\pending{Rao--Stirling and Leinster--Cobbold indices per category and period, not yet computed} | 771 | +The yearly Rao--Stirling and Leinster--Cobbold indices of the category mix, | ||
| 772 | +with bootstrap intervals from multinomial resampling of works over categories | ||||
| 773 | +($B = 500$, seed 44), are computed by \texttt{bibliometrics/04\_diversity\_cagr.py} | ||||
| 774 | +and reported in Part~IX; the dissimilarity $d_{ij}$ is one minus the cosine | ||||
| 775 | +similarity of category centroids when embeddings are available and one minus | ||||
| 776 | +the co-classification Jaccard similarity otherwise. | ||||
| 771 | until the computation is added and audited. | 777 | until the computation is added and audited. | ||
| 772 | 778 | ||||
| 773 | \section{Citation and collaboration networks} | 779 | \section{Citation and collaboration networks} | ||
@@ -1370,7 +1376,9 @@ positives separately. | |||||
| 1370 | 1376 | ||||
| 1371 | \subsection{Cutoffs, models and metrics} | 1377 | \subsection{Cutoffs, models and metrics} | ||
| 1372 | 1378 | ||||
| 1373 | −Training cutoffs are every third month from December 2019 to December 2021; | 1379 | +Training cutoffs are every third month from December 2019 to December 2021 | ||
| 1380 | +for the 12-month horizon and to December 2020 for the 24-month horizon, so | ||||
| 1381 | +that every training label is observable before the first test cutoff; | ||||
| 1374 | test cutoffs are every third month from January 2023 to October 2024 for | 1382 | test cutoffs are every third month from January 2023 to October 2024 for | ||
| 1375 | which $T + h$ lies within the panel. With $h = 24$ the last training label | 1383 | which $T + h$ lies within the panel. With $h = 24$ the last training label | ||
| 1376 | uses data to December 2023, which is after the reference date but more than a | 1384 | uses data to December 2023, which is after the reference date but more than a | ||
@@ -1385,8 +1393,9 @@ above with non-finite values replaced by zero. | |||||
| 1385 | 1393 | ||||
| 1386 | Three predictors are compared: the $z$-score baseline, which ranks topics by | 1394 | Three predictors are compared: the $z$-score baseline, which ranks topics by | ||
| 1387 | $z_{k,T}$ alone and involves no fitting; an $\ell_2$-regularised logistic | 1395 | $z_{k,T}$ alone and involves no fitting; an $\ell_2$-regularised logistic | ||
| 1388 | −regression (regularisation strength $C = 1$, on unstandardised features, so | 1396 | +regression (regularisation strength $C = 1$, on features standardised with a | ||
| 1389 | −the penalty is not scale-invariant and acts most on the small-range features); | 1397 | +scaler fitted on the training cutoffs only, so that the penalty is | ||
| 1398 | +scale-invariant and no test-period statistic enters the fit); | ||||
| 1390 | and a gradient boosting classifier \citep{friedman2001gbm} with 300 trees of | 1399 | and a gradient boosting classifier \citep{friedman2001gbm} with 300 trees of | ||
| 1391 | depth three and learning rate 0.05, seed 44, as implemented in scikit-learn | 1400 | depth three and learning rate 0.05, seed 44, as implemented in scikit-learn | ||
| 1392 | \citep{pedregosa2011sklearn}. The metrics on the pooled test rows are the area | 1401 | \citep{pedregosa2011sklearn}. The metrics on the pooled test rows are the area | ||
modified
manuscript/tables/numbers.tex
+15 −0
@@ -106,3 +106,18 @@ | |||||
| 106 | \newcommand{\LinkSlimTotal}{464{,}765{,}485} | 106 | \newcommand{\LinkSlimTotal}{464{,}765{,}485} | ||
| 107 | \newcommand{\LinkSlimCsAnyTwoZeroOneEightTwoZeroTwoSix}{15{,}490{,}159} | 107 | \newcommand{\LinkSlimCsAnyTwoZeroOneEightTwoZeroTwoSix}{15{,}490{,}159} | ||
| 108 | \newcommand{\LinkSeconds}{10} | 108 | \newcommand{\LinkSeconds}{10} | ||
| 109 | +\newcommand{\DblpParsedRecords}{8{,}840{,}866} | ||||
| 110 | +\newcommand{\DblpTypeIncollection}{71{,}247} | ||||
| 111 | +\newcommand{\DblpTypeBook}{21{,}648} | ||||
| 112 | +\newcommand{\DblpTypeProceedings}{65{,}792} | ||||
| 113 | +\newcommand{\DblpTypeMastersthesis}{27} | ||||
| 114 | +\newcommand{\DblpTypeData}{30{,}631} | ||||
| 115 | +\newcommand{\DblpTypeArticle}{4{,}500{,}501} | ||||
| 116 | +\newcommand{\DblpTypeInproceedings}{3{,}995{,}530} | ||||
| 117 | +\newcommand{\DblpTypePhdthesis}{158{,}398} | ||||
| 118 | +\newcommand{\AclParsedEntries}{138{,}796} | ||||
| 119 | +\newcommand{\IncrementApiCalls}{1{,}002} | ||||
| 120 | +\newcommand{\IncrementRecordsRetrieved}{193{,}369} | ||||
| 121 | +\newcommand{\IncrementTruncatedSlices}{1} | ||||
| 122 | +\newcommand{\IncrementSlicesDone}{64} | ||||
| 123 | +\newcommand{\IncrementCostUsd}{0.100} | ||||
modified
tables/make_numbers.py
+13 −0
@@ -43,5 +43,18 @@ for f, key in [("results/econometrics/its_results.json", "its"), ("taxonomy/vali | |||||
| 43 | if os.path.exists(p): | 43 | if os.path.exists(p): | ||
| 44 | d = json.load(open(p)) | 44 | d = json.load(open(p)) | ||
| 45 | walk(key, {k: v for k, v in d.items() if not isinstance(v, (list,))}) | 45 | walk(key, {k: v for k, v in d.items() if not isinstance(v, (list,))}) | ||
| 46 | +for f, key in [("data/metadata/dblp_parse_report.json", "dblp"), ("data/metadata/acl_parse_report.json", "acl"), ("data/metadata/api_increment_ledger.json", "increment"), ("data/metadata/increment_report.json", "incrementIngest")]: | ||||
| 47 | + p = os.path.join(R, f) | ||||
| 48 | + if os.path.exists(p): | ||||
| 49 | + d = json.load(open(p)) | ||||
| 50 | + if key == "increment": | ||||
| 51 | + sl = d.get("slices", {}); emit("increment api calls", d.get("calls", 0)); emit("increment records retrieved", sum(v.get("records", 0) for v in sl.values())) | ||||
| 52 | + emit("increment truncated slices", sum(1 for v in sl.values() if v.get("truncated"))); emit("increment slices done", sum(1 for v in sl.values() if v.get("done"))); emit("increment cost usd", round(d.get("cost_usd_total", 0), 4)) | ||||
| 53 | + elif key == "incrementIngest": | ||||
| 54 | + emit("increment new works", d.get("new_works", 0)); emit("increment already in snapshot", d.get("already_in_snapshot", 0)) | ||||
| 55 | + elif key == "dblp": | ||||
| 56 | + emit("dblp parsed records", d.get("rows_written", 0)); [emit(f"dblp type {k}", v) for k, v in d.get("counts_by_type", {}).items()] | ||||
| 57 | + elif key == "acl": | ||||
| 58 | + emit("acl parsed entries", d.get("entries", 0)) | ||||
| 46 | open(os.path.join(R, "manuscript/tables/numbers.tex"), "w").write("% machine-generated by tables/make_numbers.py — do not edit\n" + "\n".join(out) + "\n") | 59 | open(os.path.join(R, "manuscript/tables/numbers.tex"), "w").write("% machine-generated by tables/make_numbers.py — do not edit\n" + "\n".join(out) + "\n") | ||
| 47 | print(len(out), "macros") | 60 | print(len(out), "macros") | ||
| 48 | 61 | ||||