A Monte-Carlo decision tool for a relocation question: does a paid site generate enough extra footfall to cover its rent? Scores 15,792 grid cells from OpenStreetMap road and POI layers into a busyness index, then converts index ratios into footfall ratios through a single calibration exponent — the most load-bearing number in the model, and one estimated rather than assumed, by fitting an inhomogeneous Poisson process to two independent density signals in the same extract and bracketing the result. Output is a per-cell probability of covering the rent, propagating measured month-to-month variance instead of reporting a point estimate. Built to argue against itself: the dashboard names the assumption that would overturn its own verdict, and states plainly that one afternoon with a tally counter would beat every layer in the map.
Case-note theme extraction & service matching
A triage aid for community support teams: paste a free-text case note and the tool surfaces the needs it contains, highlights the evidence in the note itself, and matches each confident theme against a tagged directory of local services. Every sentence is dependency-parsed for polarity and subject before matching runs, so 'denies feeling lonely' and 'her daughter is not mobile' are surfaced and flagged for review rather than silently scored as evidence — the errors that matter most in a safeguarding-adjacent context. Hybrid dense–sparse retrieval (SBERT plus IDF-weighted overlap), confidence bands calibrated by threshold sweep against held-out notes, and no generative model anywhere in the decision path.
A recommendation system pairing early-career graduates to scholarships, employers, NGOs, training and research placements, from a CV and a free-text statement of goals. A rule-based CV parser extracts the facts that decide eligibility (degree stage, graduation recency, GPA, English test score) and applies them as hard gates scoped by category, so a museum never rejects someone for being too qualified. Relevance is ranked by a local cross-encoder reading query and opportunity together, replacing a bi-encoder that had been ordering results by document length rather than relevance — MRR 0.47 → 0.69. The tool never abstains: weak matches are labelled 'Poor fit' and shown anyway, because telling a real applicant there is nothing for them is the one error it cannot afford.
Compared three Bayesian approaches to detecting account takeovers in login data with a ~0.05% attack rate, under a constraint that no more than 5% of legitimate users should be challenged with MFA. A logistic regression model with domain-informed priors, a group-structured Bayesian network decomposing risk into novelty, geographic, reputation and velocity signals, and a Dirichlet process mixture model that learns normal login behaviour unsupervised and flags logins that fail to fit any known cluster. All three use ADVI inference and produce per-login explanations suitable for customer support.
Explored whether purely data-driven approaches could reconstruct proto-languages from modern descendants, developing a manifold-geometry-inspired neural model using PyTorch and lingpy — combining a custom hidden Markov model for alignment with a continuous phonological feature space — to compare against standard discrete approaches. Tested on Romance and Micronesian language families using multiple custom evaluation metrics (including Fréchet distance and optimal transport), finding the standard methods outperformed mine under every metric.
Predicting ultimate insurance claim amounts using a hurdle model built in PyMC. Stage one classifies claims as high or low value via logistic regression; stage two fits a continuous distribution (lognormal, gamma, or Weibull) to the amount. Full posterior propagation gives calibrated credible intervals rather than point estimates, achieving ~45% improvement in MAE over a median baseline with 96% of actuals falling within the 95% credible interval.
Exploring Indonesian cuisine through data science. Scraped 50,000+ Indonesian recipes using Beautiful Soup and used unsupervised ML (along with UMAP dimensionality reduction, GMM clustering with BIC model selection, and iterative chi-square feature selection) to identify regional culinary families. Deployed a FastAPI backend and Leaflet.js frontend allowing users to explore geographic culinary patterns and discover recipe recommendations based on cosine similarity between dishes.
Quadrilingual dictionary of Melanesian creoles. Collated and translated data from various sources into a single database. Automated data curation using Bash regex to rapidly generate a MySQL database powering an interactive online dictionary built using HTML and JavaScript.
Digitised 11 volumes of typewritten vocabularies of 300 indigenous Indonesian languages, collected over the past century, into a relational database using Tesseract OCR and Bash. Populated a relational database and deployed an interactive web app to preserve endangered languages.
Ambonese Malay–English dictionary. Cleaned and standardised orthography across multiple sources, automated curation with Bash regex to generate a MySQL database powering an interactive online dictionary, and produced a print volume typeset with a custom TeX class.