Source: https://github.com/aipoch/medical-research-skills
When to Use
- You have a batch of references and need a publication year distribution table (counts and percentages).
- You need a journal distribution table (Top N optional) for a literature review or report appendix.
- Your input is pasted citations (BibTeX/RIS/EndNote/plain text/mixed) and you want quick aggregation.
- Your input is local reference files (
.bib/.ris/.txt/.csv) and you want consistent, standardized output.
- You have a local PDF folder and want to extract year/journal signals (best-effort) and summarize them.
Key Features
- Supports multiple input types: pasted text, local reference files, and local PDF directories (via script).
- Extracts Year and Journal using format-specific parsing rules (BibTeX/RIS/plain text/PDF).
- Produces two standardized tables:
- Year distribution:
year, count, percent
- Journal distribution:
journal title, count, percent
- Provides a summary including totals and unknown-field counts (unknown year / unknown journal).
- Conservative extraction: does not guess when metadata is unclear; ambiguous items are counted as
unknown.
- Local-only operation: no network calls, no external APIs, no credential usage.
Dependencies
- Python 3.9+
- Python packages (pinned by your project file):
pip install -r scripts/requirements.txt
Example Usage
1) Process a local PDF directory
python scripts/process_pdfs.py --input-dir "./pdfs" --output "./literature_stats.md"
2) Process a local reference file (example pattern)
If your repository provides a CLI entry or script for reference files, run it similarly to the PDF script. For example:
python scripts/process_references.py --input "./refs/library.bib" --output "./literature_stats.md"
3) Expected output format (Markdown)
## Summary
- Total processed: 120
- Unknown year: 7
- Unknown journal: 15
## Year Distribution
| Year | Count | Percent |
|------|-------|---------|
| 2023 | 18 | 15.0% |
| 2022 | 22 | 18.3% |
| ... | ... | ... |
## Journal Distribution
| Journal | Count | Percent |
|---------|-------|---------|
| Journal of X | 9 | 7.5% |
| ... | ... | ... |
For additional examples, see: references/examples.md.
Implementation Details
Processing Pipeline
- Detect input type: pasted text / file path / PDF directory.
- Read content from pasted text or local files.
- Split into individual citations using format cues:
- BibTeX entries
- RIS records
- blank-line separation for plain text/mixed inputs
- Extract
year and journal using the parsing rules below.
- Normalize journal names using the normalization rules below.
- Aggregate counts and compute percentages.
- Output:
- Table 1: Year distribution
- Table 2: Journal distribution
- Summary: totals + unknown counts
- For PDF directories, use:
python scripts/process_pdfs.py --input-dir "<pdf_dir>" --output "<output_md>"
Parsing Rules
BibTeX
- Year:
year field
- Journal:
journal field
RIS
- Year:
PY or Y1 (use the first 4-digit year)
- Journal: first non-empty value among
JO / JF / T2
Plain Text / Mixed Citations
- Year: first 4-digit year in the range 1900-2099 found near the end of the citation
- Journal: infer only when patterns are unambiguous (e.g.,
Journal Name. 2022; or Journal Name, 2022); otherwise set to unknown
PDF Directory (Script-Based)
- Year: prefer PDF metadata; otherwise use the first 4-digit year found on the first page
- Journal: prefer PDF metadata; otherwise scan first-page lines containing keywords such as:
Journal, Proceedings, Transactions
If unclear, set to unknown.
Journal Normalization Rules
- Trim leading/trailing whitespace.
- Collapse multiple spaces into a single space.
- Remove trailing periods and commas.
- If casing is inconsistent, convert to Title Case; otherwise keep original casing.
- Do not expand abbreviations or infer aliases.
Failure Handling and Safety Constraints
- Do not guess missing/unclear year or journal values.
- Count ambiguous entries as
unknown and report the totals in the summary.
- No network access; no external APIs; no credentials.
- Do not read files outside the user-provided paths.
Sorting and Reporting Requirements
- Tables are sorted by:
count descending
- then by
name ascending (year or journal title)
- Always report:
- total processed count
- unknown year count
- unknown journal count
When Not to Use
- Do not use this skill when the required source data, identifiers, files, or credentials are missing.
- Do not use this skill when the user asks for fabricated results, unsupported claims, or out-of-scope conclusions.
- Do not use this skill when a simpler direct answer is more appropriate than the documented workflow.
Required Inputs
- A clearly specified task goal aligned with the documented scope.
- All required files, identifiers, parameters, or environment variables before execution.
- Any domain constraints, formatting requirements, and expected output destination if applicable.
Recommended Workflow
- Validate the request against the skill boundary and confirm all required inputs are present.
- Select the documented execution path and prefer the simplest supported command or procedure.
- Produce the expected output using the documented file format, schema, or narrative structure.
- Run a final validation pass for completeness, consistency, and safety before returning the result.
Output Contract
- Return a structured deliverable that is directly usable without reformatting.
- If a file is produced, prefer a deterministic output name such as
literature_statistics_result.md unless the skill documentation defines a better convention.
- Include a short validation summary describing what was checked, what assumptions were made, and any remaining limitations.
Validation and Safety Rules
- Validate required inputs before execution and stop early when mandatory fields or files are missing.
- Do not fabricate measurements, references, findings, or conclusions that are not supported by the provided source material.
- Emit a clear warning when credentials, privacy constraints, safety boundaries, or unsupported requests affect the result.
- Keep the output safe, reproducible, and within the documented scope at all times.
Failure Handling
- If validation fails, explain the exact missing field, file, or parameter and show the minimum fix required.
- If an external dependency or script fails, surface the command path, likely cause, and the next recovery step.
- If partial output is returned, label it clearly and identify which checks could not be completed.
Quick Validation
Run this minimal verification path before full execution when possible:
python scripts/process_pdfs.py --help
Expected output format:
Result file: literature_statistics_result.md
Validation summary: PASS/FAIL with brief notes
Assumptions: explicit list if any
1---2name: literature-statistics3description: Generate statistics for publication-year and journal distributions from local references or PDFs; use when you need standardized Year/Journal tables and a summary without any network access.4license: MIT5---6> **Source**: [https://github.com/aipoch/medical-research-skills](https://github.com/aipoch/medical-research-skills)
7
8## When to Use
9- You have a batch of references and need a **publication year distribution** table (counts and percentages).
10- You need a **journal distribution** table (Top N optional) for a literature review or report appendix.
11- Your input is **pasted citations** (BibTeX/RIS/EndNote/plain text/mixed) and you want quick aggregation.
12- Your input is **local reference files** (`.bib/.ris/.txt/.csv`) and you want consistent, standardized output.
13- You have a **local PDF folder** and want to extract year/journal signals (best-effort) and summarize them.
14
15## Key Features
16- Supports multiple input types: pasted text, local reference files, and local PDF directories (via script).
17- Extracts **Year** and **Journal** using format-specific parsing rules (BibTeX/RIS/plain text/PDF).
18- Produces two standardized tables:
19 - **Year distribution**: `year, count, percent`
20 - **Journal distribution**: `journal title, count, percent`
21- Provides a summary including totals and unknown-field counts (unknown year / unknown journal).
22- Conservative extraction: does **not** guess when metadata is unclear; ambiguous items are counted as `unknown`.
23- Local-only operation: no network calls, no external APIs, no credential usage.
24
25## Dependencies
26- Python **3.9+**
27- Python packages (pinned by your project file):
28 - `pip install -r scripts/requirements.txt`
29
30## Example Usage
31### 1) Process a local PDF directory
32```bash
33python scripts/process_pdfs.py --input-dir "./pdfs" --output "./literature_stats.md"
34```
35
36### 2) Process a local reference file (example pattern)
37If your repository provides a CLI entry or script for reference files, run it similarly to the PDF script. For example:
38```bash
39python scripts/process_references.py --input "./refs/library.bib" --output "./literature_stats.md"
40```
41
42### 3) Expected output format (Markdown)
43```md
44## Summary
45- Total processed: 120
46- Unknown year: 7
47- Unknown journal: 15
48
49## Year Distribution
50| Year | Count | Percent |
51|------|-------|---------|
52| 2023 | 18 | 15.0% |
53| 2022 | 22 | 18.3% |
54| ... | ... | ... |
55
56## Journal Distribution
57| Journal | Count | Percent |
58|---------|-------|---------|
59| Journal of X | 9 | 7.5% |
60| ... | ... | ... |
61```
62
63For additional examples, see: `references/examples.md`.
64
65## Implementation Details
66### Processing Pipeline
671. Detect input type: pasted text / file path / PDF directory.
682. Read content from pasted text or local files.
693. Split into individual citations using format cues:
70 - BibTeX entries
71 - RIS records
72 - blank-line separation for plain text/mixed inputs
734. Extract `year` and `journal` using the parsing rules below.
745. Normalize journal names using the normalization rules below.
756. Aggregate counts and compute percentages.
767. Output:
77 - Table 1: Year distribution
78 - Table 2: Journal distribution
79 - Summary: totals + unknown counts
808. For PDF directories, use:
81 ```bash
82 python scripts/process_pdfs.py --input-dir "<pdf_dir>" --output "<output_md>"
83 ```
84
85### Parsing Rules
86#### BibTeX
87- **Year**: `year` field
88- **Journal**: `journal` field
89
90#### RIS
91- **Year**: `PY` or `Y1` (use the first 4-digit year)
92- **Journal**: first non-empty value among `JO` / `JF` / `T2`
93
94#### Plain Text / Mixed Citations
95- **Year**: first 4-digit year in the range **1900-2099** found near the end of the citation
96- **Journal**: infer only when patterns are unambiguous (e.g., `Journal Name. 2022;` or `Journal Name, 2022`); otherwise set to `unknown`
97
98#### PDF Directory (Script-Based)
99- **Year**: prefer PDF metadata; otherwise use the first 4-digit year found on the first page
100- **Journal**: prefer PDF metadata; otherwise scan first-page lines containing keywords such as:
101 - `Journal`, `Proceedings`, `Transactions`
102 If unclear, set to `unknown`.
103
104### Journal Normalization Rules
105- Trim leading/trailing whitespace.
106- Collapse multiple spaces into a single space.
107- Remove trailing periods and commas.
108- If casing is inconsistent, convert to **Title Case**; otherwise keep original casing.
109- Do **not** expand abbreviations or infer aliases.
110
111### Failure Handling and Safety Constraints
112- Do not guess missing/unclear year or journal values.
113- Count ambiguous entries as `unknown` and report the totals in the summary.
114- No network access; no external APIs; no credentials.
115- Do not read files outside the user-provided paths.
116
117### Sorting and Reporting Requirements
118- Tables are sorted by:
119 1) `count` descending
120 2) then by `name` ascending (year or journal title)
121- Always report:
122 - total processed count
123 - unknown year count
124 - unknown journal count
125
126## When Not to Use
127
128- Do not use this skill when the required source data, identifiers, files, or credentials are missing.
129- Do not use this skill when the user asks for fabricated results, unsupported claims, or out-of-scope conclusions.
130- Do not use this skill when a simpler direct answer is more appropriate than the documented workflow.
131
132## Required Inputs
133
134- A clearly specified task goal aligned with the documented scope.
135- All required files, identifiers, parameters, or environment variables before execution.
136- Any domain constraints, formatting requirements, and expected output destination if applicable.
137
138## Recommended Workflow
139
1401. Validate the request against the skill boundary and confirm all required inputs are present.
1412. Select the documented execution path and prefer the simplest supported command or procedure.
1423. Produce the expected output using the documented file format, schema, or narrative structure.
1434. Run a final validation pass for completeness, consistency, and safety before returning the result.
144
145## Output Contract
146
147- Return a structured deliverable that is directly usable without reformatting.
148- If a file is produced, prefer a deterministic output name such as `literature_statistics_result.md` unless the skill documentation defines a better convention.
149- Include a short validation summary describing what was checked, what assumptions were made, and any remaining limitations.
150
151## Validation and Safety Rules
152
153- Validate required inputs before execution and stop early when mandatory fields or files are missing.
154- Do not fabricate measurements, references, findings, or conclusions that are not supported by the provided source material.
155- Emit a clear warning when credentials, privacy constraints, safety boundaries, or unsupported requests affect the result.
156- Keep the output safe, reproducible, and within the documented scope at all times.
157
158## Failure Handling
159
160- If validation fails, explain the exact missing field, file, or parameter and show the minimum fix required.
161- If an external dependency or script fails, surface the command path, likely cause, and the next recovery step.
162- If partial output is returned, label it clearly and identify which checks could not be completed.
163
164## Quick Validation
165
166Run this minimal verification path before full execution when possible:
167
168```bash
169python scripts/process_pdfs.py --help
170```
171
172Expected output format:
173
174```text
175Result file: literature_statistics_result.md
176Validation summary: PASS/FAIL with brief notes
177Assumptions: explicit list if any
178```