Analyzing Occupations of Movie Protagonists From 100 Years of Film - What I Did
2026-07-13
This is a description of what I did to come up with the results for my Jobs in Movies Over Time post; it's fairly abbrievated but this is all the important parts IMO.
Source Data
- IMDb movie data - films and cast (title.principals, name.basics)
- took movies with top 20% of votes per year from 1900 onward (68,567 movies)
- this seemed reasonable enough of a cutoff - really disproportionate towards the number of these in the 2010s/2020s
- top 3 cast members
- took movies with top 20% of votes per year from 1900 onward (68,567 movies)
- Wikipedia - movies that were not on Wikipedia were excluded (56,835 movies remaining)
- Used plot for evidence when summary available, otherwise relied on intro
- Evidence was included in results (for later cross-verification - up to 2500 characters
- Also ended up filtering down to movies from 1910 onward after this due to numbers
Data Extraction
- Gemini 2.5 Flash Lite for initial pass over the 56,835 movies, creating 154,654 character rows (extracted evidence for each judgement)
- GPT 5.4 Nano verified target Gemini output with uncertainties
- GLM 4.7 used to tiebreak where disagreements were found
- Used a semantic verification layer with embeddings (all-MiniLM-L6-v2) for career-label matching and an NLI model to determine whether extracted occupations were actually supported by the evidence
- Ran Deepseek Flash over around 1k of the Gemini 2.5 flash lite results that didn’t receive a second pass to see how accurate they were, was about a 6% disagreement so ended up running GPT 5.4 Nano on the rest…w/ GLM 4.7 to tiebreak once more
- Total disagreements across all model results were omitted if couldn’t be resolved by evidence examination. Manual examination also made it clear that there was a real lack of clarity re: job changes
- Normalization was done separately from extraction w/ raw labels mapped to a compact set that was expanded based on frequency of unmapped labels and model normalization results
- 177 canonical careers across 19 categories of occupations
- non-professions were primarily social/familial roles
- 177 canonical careers across 19 categories of occupations
Dashboard
I just Clauded this outright - asked for a dashboard and gave it the desired graphs, toggles, lookups I wanted possible. Made adjustments as per what I wanted to see.
Things That Came Up
- Non-American films: I removed these from the final dashboard, analysis; did not change results significantly, but I thought this was most appropriate as the movies were primarily American anyways, and didn’t want to make generalizations about non-American films since they weren’t a large part of the selection.
- Accuracy: obviously the main concern here, especially wrt categorization by LLMs. I ran both Gemini 2.5 Flash Lite and GPT 5.4 Nano over the whole corpus, and used GLM 4.7 to address disagreements. I chose these models for cost and speed, primarily
- Workflow, briefly: Gemini 2.5 Flash Lite over everything -> GPT 5.4 Nano over uncertainties -> GLM 4.7 as tiebreaker -> Deepseek Flash over random selection of Gemini results that weren’t passed over by secondary model -> GPT 5.4 Nano over the rest of Gemini 2.5 Flash Lite after 6% of Deepseek/Gemini comparisons were inconsistent -> GLM 4.7 over last round of inconsistencies as a tiebreaker
- Double Job: common in situations like superheros, etc.; the LLM often only picked one unless the actor appeared twice in cast as both civilian and secret identity
- On the flip side, I’m reluctant to call “superhero” or "vigilante" a job personally, but I'm not sure what else it would be.
- Changes in Job: inspected cases where the 3 LLMs disagreed - it appeared that these were often due to jobs changing over the course of the film. I decided to omit these.
- IMDB cast order: I pulled the top 3 characters from each cast, considering these to be the “main” characters or have the main character within them. a) this may have been too many characters and b) some amount of the database likely had cast in alphabetical order or in order of appearance on-screen.
- Genres: I leave the option to select these in the dashboard, but several (Documentaries, Reality TV, News, etc) simply do not seem useful in context of my goals (not “true” fiction) and I omit them by default
- Job Missing: I figured this was fine to ignore, in many cases where this happened the character was not a main character, or the character’s job just wasn’t very relevant to the plot and maybe only mentioned offhand a few times in the movie. This is obviously a large percentage of movies, but I think it’s fine
- Jobs extracted inaccurately: happened particularly with movies without much information on Wikipedia as they were older/less popular, so roles might be assigned “lead actress”, etc while this was not the true movie role. I tried to address this in additional passes to the best of my ability along with manual examination
- I did a non-insignificant amount of manual correction, but I don’t think I truly cleaned everything up, nor did I fully expect to