Here are some of the projects I've worked on.
Flashcard decks for students of computational linguistics and natural language processing: 25 chapters of Jurafsky & Martin's Speech and Language Processing and two tracks of 52 must-read papers each, about 4,000 cards in all, every one citing the page or section it comes from. All decks are free to study in the browser, even offline, and each one downloads as an Anki package. Every page is prerendered at build time, so it loads fast and is indexed by search engines. The API handles members' questions under the cards and checks Gumroad license keys, and visits are counted without cookies.
Stack: full-stack. The frontend is a single-page app in ClojureScript (shadow-cljs, re-frame, reitit, KaTeX), prerendered to static HTML in Node and served from GitLab Pages, with a service worker for offline use and sql.js for writing Anki packages. The backend is a Clojure API (http-kit, reitit, SQLite) on a Hetzner server behind Caddy, with self-hosted Umami analytics.
A browser-based language-technology playground. All inference runs on the user's device, so no audio or text is ever sent to a server. It currently hosts two tools: an edge speech-to-text demo that runs OpenAI's Whisper-small in a Web Worker, and a Laz transliterator that converts Georgian Mkhedruli script to customizable Latin orthographies.
Stack: frontend only, no backend. A single-page app in ClojureScript (re-frame) that runs models with transformers.js in Web Workers.
The website of Taruen, my custom language technology and data studio in Istanbul: services and contracting, products such as Edge, datasets, and a blog with an RSS feed.
Stack: static site generated with Docusaurus 3 (React, TypeScript, MDX), built by GitLab CI and served from GitLab Pages.
This website: my posts, résumé and projects, in English, German, Russian, Tatar and Turkish.
Stack: static site generated with Racket (scribble/html), built with GNU Make and cleaned up by HTML Tidy, served from GitLab Pages, with Buttondown for the newsletter and Umami analytics.
Fine-tuned OpenAI's Whisper-large-v3 into an automatic speech recognition model for Tatar. On speakers and sentences it never heard in training, it gets 4.3% of characters wrong, down from 32% for the stock model, which makes it the most accurate Whisper model for Tatar among those I could evaluate, and the most readable of all models tested, since it writes capital letters and punctuation. The recipe stayed the same across two runs and only the data changed: re-splitting Common Voice 27.0 raised the number of training speakers from 2 in the default splits to 165, and cut errors by 16%. Both runs together cost about $24 of rented GPU time. Try the demo, download the weights, or read the write-up, which also benchmarks every other Tatar ASR model I could find.
Stack: Python, PyTorch, Hugging Face Transformers; Whisper-large-v3 fine-tuned on a rented A100 on RunPod; demo on Hugging Face Spaces.
Fine-tuned OpenAI's Whisper-small into an automatic speech recognition model for Laz, a Kartvelian language of the southeastern Black Sea coast listed by UNESCO as definitely endangered. Trained on Common Voice Laz data (accessed via the Mozilla Data Collective), reaching 28.5% word error rate on the held-out test set for a language Whisper did not support at release. A write-up of the end-to-end process is on the Taruen blog.
Stack: Python; Whisper-small; Common Voice Laz data; published on Hugging Face.
Trained a Kazakh automatic speech recognition model.
Stack: Coqui STT (TensorFlow) on Yandex DataSphere.
Extended with new stems, with support for some new affixes of Kazakh, with a Constraint Grammar including dependency parsing capabilities in the Universal Dependencies framework
finished updating of the UD_KTB treebank to the second version of Universal Dependencies annotation guidelines, along with an overall testing and error-checking of both the treebank and apertium-kaz
All of this is documented under https://taruen.com/apertiumpp/apertiumpp-kaz/ and http://taruen.com/apertium-kaz
If you use apertium-kaz in your research work, please cite the following paper: Jonathan North Washington, Ilnar Salimzyanov, and Francis M. Tyers. "Finite-state morphological transducers for three Kypchak languages." LREC. 2014.
Stack: HFST finite-state morphology (lexc, twol), Constraint Grammar (vislcg3), Universal Dependencies.
Stack: Apertium rule-based machine translation: HFST morphology, Constraint Grammar disambiguation, lttoolbox bilingual dictionary, structural transfer rules.
A transition-based statistical dependency parser I wrote for a class. The classifier of it is a simple perceptron, but you can plug in any other of your choice. Of course the parser is not as advanced as other parsers you might have used or heard of, but it can serve as a good starting point if you're implementing a dependency parser yourself or just want to see how a transition-based dependency parser works inside.
Stack: Python.
This was a proof-of-concept adaption of an acceptance testing framework called Fitnesse to a rule-based machine translation system called Apertium, with the aim of giving machine translation stakeholders an easy way to specify how translators and underlying NLP tools should behave. I have used it to guide the work of some of the Google Summer of Code students I've been mentoring.
A little script for scraping Bible translations from the bible.com website. Bible translations are often used in natural language processing research, as it is the most translated text.
Stack: Racket.
Home | Hire me | Résumé | Projects | Publications | Talks | Now | Email | Reading log | Movies log