-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcheck_retractions_in_references.py
76 lines (58 loc) · 2.77 KB
/
check_retractions_in_references.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# Check for retracted papers in the reference list - extracts a reference list from a PDF file and compares the DOIs of these papers with the Retraction Watch database (https://gitlab.com/crossref/retraction-watch-data/)
import re
import csv
from PyPDF2 import PdfReader
def normalize_doi(doi):
return re.sub(r'\s+', '', doi.strip().lower()) if doi else None
def extract_doi_from_pdf(file_path):
"""Витягуємо DOIs зі списку літератури у PDF-файлі."""
references = set()
try:
reader = PdfReader(file_path)
full_text = ""
for page in reader.pages:
full_text += page.extract_text()
# Виділення DOI
doi_matches = re.findall(r'(10\.\d{4,9}/[\w.\-]+)', full_text, re.IGNORECASE)
for doi in doi_matches:
normalized_doi = normalize_doi(doi)
if normalized_doi:
references.add(normalized_doi)
except Exception as e:
print(f"Помилка під час читання PDF: {e}")
return references
def load_retraction_watch(file_path):
"""Завантаження списку DOIs з бази Retraction Watch."""
retractions = set()
with open(file_path, 'r', encoding='utf-8') as csv_file:
reader = csv.DictReader(csv_file)
for row in reader:
original_doi = normalize_doi(row.get('OriginalPaperDOI', ''))
if original_doi:
retractions.add(original_doi)
return retractions
def find_retractions(references, retractions):
"""Порівнюємо DOIs зі списку літератури з базою Retraction Watch."""
return references.intersection(retractions)
def main():
pdf_file = "paper1.pdf" # Шлях до PDF-файлу
retractions_file = "retraction_watch.csv" # Шлях до файлу Retraction Watch
# Витягування DOI зі списку літератури в PDF
print("Витягування DOIs зі списку літератури в PDF...")
references = extract_doi_from_pdf(pdf_file)
# Завантаження файлу Retraction Watch
print("Завантаження бази Retraction Watch...")
retractions = load_retraction_watch(retractions_file)
# Пошук ретракцій
print("Пошук ретракцій...")
found_retractions = find_retractions(references, retractions)
# Результати
if found_retractions:
print(f"Знайдено {len(found_retractions)} ретракцій:")
for doi in found_retractions:
print(f"Відкликана стаття: {doi}")
else:
print("Ретракцій не знайдено у списку літератури.")
if __name__ == "__main__":
main()
# In[ ]: