Files
2026-08-16 19:51:23 -04:00

142 lines
3.0 KiB
Python

import csv
import json
import re
import matplotlib.pyplot as plt
import numpy as np
from collections import Counter
from pprint import pprint
stop_words = [
"(review)",
"of",
"and",
"the",
"we",
"in",
"to",
"what",
"a",
"on",
"an",
"do",
"for",
"with",
"is",
"it",
"that",
"this",
"as",
"by",
"are",
"using",
"from",
"how",
"has",
"be",
"or",
"can",
"our",
"at",
"why",
"when",
"introduction",
"your",
"through",
"et",
"al.",
"&",
"",
]
file_path = "data.csv"
data = []
def parse_csv(file_path):
try:
with open(file_path, "r") as file:
reader = csv.reader(file)
for row in reader:
data.append(row)
except FileNotFoundError:
print(f"Error: File {file_path} not found")
return
except Exception as e:
print(f"Error reading file: {e}")
return
def extract_journal_titles(data):
journal_titles = []
for row in data:
if "(edited volume)" not in row[3]:
journal_titles.append(row[3])
count_journal_titles = Counter(journal_titles).most_common(30)
pprint(count_journal_titles)
print("Total journals: " + str(len(set(journal_titles))))
def extract_title_keywords(data):
title_keywords = []
for row in data:
raw_words = row[2].split(" ")
for word in raw_words:
re_word = re.sub(r"[^a-zA-Z\-]", "", word.lower())
if re_word not in stop_words and re_word != "":
title_keywords.append(re_word)
return Counter(title_keywords).most_common(30)
def print_title_keywords(data):
title_keywords = extract_title_keywords(data)
pprint(title_keywords)
def histogram(data):
dates = []
for row in data:
try:
dates.append(int(row[4]))
except (ValueError, IndexError):
# Skip invalid date entries
continue
if not dates:
print("No valid dates found")
return
min_year = min(dates)
max_year = max(dates)
# Create bins with reasonable spacing
years = range(min_year, max_year + 1)
plt.hist(dates, bins=len(years), edgecolor='black')
plt.xlabel('Year')
plt.ylabel('Frequency')
plt.title('Publication Year Distribution')
plt.show()
def names(data):
names = []
for row in data:
name_parts = row[1].split(" ")
for name in name_parts:
name = name.rstrip(",")
if name not in stop_words:
if "." not in name and name != "":
names.append(name)
count_names = Counter(names).most_common(30)
pprint(count_names)
if __name__ == "__main__":
parse_csv(file_path)
if data: # Only process if data was loaded
data = data[1:] # Skip header row
extract_journal_titles(data)
print_title_keywords(data)
# names(data)
histogram(data)
else:
print("No data to process")