Internship at Wriber

2014-05-04

University of Waterloo - Internship

Subscribe with RSS

My second co-op job was even better than the first: I'd thought that I would enjoy traveling for co-op more than the alternative, but staying in Waterloo (well, Kitchener) to work for Wriber was definitely more fun than moving down to Boston had been.

When I joined Wriber, they were in the middle of product development for their flagship product. In a nutshell, they wanted to create a writing coach which would help writers, bloggers, students... basically, anyone that needs to write something. While you type, Wriber provides insights and asks thought-provoking questions, all to help you expand on your work and prevent you from getting stuck (writer's block is their mortal enemy).

Unlike Oracle, I wasn't given a single (read: specific) task at Wriber. Instead, I took a look at what they had and spent four months making it better in any way possible. Though Wriber was in early stages when I first began working there, I am confident that it is now well on its way to public success.

The difference between Wriber's code four months ago and as I write this is incredible, and I had a hand in the bulk of those changes, but the major features I worked on were as follows:

I designed machine learning systems for classifying page clusters (e.g. as relevant or irrelevant), for ranking pages, and for determining which insights would most benefit the user. My work used cutting-edge machine learning and AI algorithms, and was an immense step up from the naive metrics it replaced.

I also replaced Wriber's grammar preprocessor and question creation systems with completely re-designed implementations. The grammar preprocessor now uses a regex-based recognition algorithm more accurate than any third-party library we could find and chunks sentences in such a way that we can understand the relatinships between various phrases. Using this preprocessor, I re-wrote the question generation system to ask questions about individual phrases rather than entire sentences, and to use a semantic engine in order to generate only relevant question types (e.g. when talking about past co-ops, we might ask 'When exactly did you work at Wriber?').

Finally, I wrangled with the various modules of the system, both local and third-party, to ensure everything functioned as required. A few cool things I did: rewrote one external library from the ground up, thus decreasing it's runtime speed by at least 5x and rendering it slightly more accurate; redesigned the task system in order to provide multi-threaded functionality as well as just-in-time task interruption; ran analyses on several competing libraries to determine which of them functioned fastest and best; and, implemented a full-fledged test suite (within my first week!) which ran through all layers of the codebase.


As always, this article is available on GitHub. Comments (ie. issues) are welcome!