Machine Learning Research

Deep Learning for Text Categorization

GitHub Repo  |  Research Paper  |  Project Report  |  September 2017 - May 2018

My undergraduate thesis on deep learning for text categorization explored the recently enhanced deep learning techniques of convolutional neural networks and their fusion with graph analysis (i.e. graph convolutional neural networks) in the field of text categorization and compared their performance to established baseline models and simpler multilayer perceptrons. We showed through experiments on three major text classification datasets (Rotten Tomatoes Sentence Polarity, 20 Newsgroups and Reuters Corpus Volume 1) that graph convolutional neural networks can naturally work in the space of words represented as a graph and perform with greater or similar test accuracy when compared to standard convolutional neural networks and simpler baseline models.

Research Areas: Text Classification Neural Networks CNNs Graph CNNs

Tech Stack: TensorFlow scikit-learn NumPy

Rotten Tomatoes Movie Reviews Classifier

GitHub Repo  |  Blog Post  |  September 2017 - December 2017

This project compared several machine learning techniques for classifying movie reviews from Rotten Tomatoes and served as the initial stage of my undergraduate thesis. You can read more about this project and its results in my blog post.

Tech Stack: TensorFlow scikit-learn NumPy

Applied Machine Learning

Context News Bot

GitHub Repo  |  Blog Post  |  DevPost  |  NUS Hack&Roll 2018  |  January 2018

‘Context News Bot’ is a Chrome extension that attaches itself to one’s Twitter timeline and aims to provide more context to tweets. It does this by displaying relevant news articles and Wikipedia entries based on a tweet’s content in an attempt to give the user a more rounded perspective and an easy-to-use tool for fact-checking. The client-side Chrome extension is written in JavaScript while the server is built on top of Flask in Python. The server-side natural language pipeline makes use of the Google Cloud Natural Language API combined with our custom heuristics. The project won a Top 8 prize and Most Socially Useful Hack at NUS Hack&Roll 2018.

Tech Stack: Flask Google Cloud Natural Language API Twitter API News API Chrome Extension


GitHub Repo  |  DevPost  |  NUS Hack&Roll 2017  |  January 2017

‘CommandPlus’ is a Chrome extension that provides hand gesture based control of one’s browser. It does this by interacting with the user’s webcam and sending video frames from the live feed to a Python server running OpenCV for gesture detection. If one of the predefined gestures is detected, it triggers the respective action in the browser (e.g. scroll up or zoom in). The extension is aimed at helping individuals who are limited in their movement or fine motor skills and won the People’s Choice Award at NUS Hack&Roll 2017.

Tech Stack: OpenCV Chrome Extension

Rossmann Store Sales

GitHub Repo  |  Kaggle Competition / Course Assignment  |  April 2017

Rossmann Store Sales was a Kaggle competition to predict the daily sales for a chain of drug stores in Germany based on features like the date, store type, distance to the nearest competitor etc. My team and I solved the challenge by applying feature engineering and implementing various machine learning models for the problem, including regression models from scikit-learn and boosted decision trees from XGBoost. Our best model ranked 414th out of 3,303 submissions on Kaggle’s private leaderboard. This project was done as part of an introductory course to machine learning at NTU.

Tech Stack: scikit-learn XGBoost pandas


GitHub Repo  |  Facebook Singapore Hackathon 2016  |  September 2016

‘CodeBot’ is a chatbot that helps beginners learn how to code. To make the otherwise daunting task of learning how to code for the first time easier, CodeBot incorporates witty replies, GIFs & human-friendly error messages to create an incredibly fun experience for a complete novice. Currently, it goes through a few elementary exercises in Python while answering user questions using basic NLP. The back-end is built on top of Node.js, MongoDB & API.AI (now DialogFlow) while the front-end is written in vanilla HTML, CSS & JavaScript.

Tech Stack: HTML5 + CSS3 + JS Bootstrap 3 Node.js Dialogflow MongoDB

Web Development


Static Demo  |  GitHub Org  |  Company  |  September 2015 - September 2016

‘TripBuddy.SG’ is an online platform that aims to bridge the gap between international students & local students in tertiary institutes in an attempt to promote cultural exchange. It does this by providing a space where local students can host short trips to authentic local destinations for international students. The working beta of the online platform was built using Django, PostgreSQL, Bootstrap, jQuery & various social media APIs and was deployed on a DigitalOcean droplet.

Tech Stack: HTML5 + CSS3 + JS jQuery Bootstrap 3 Django Social Media APIs PostgreSQL


GitHub Repo  |  DevPost  |  NUS Hack&Roll 2016  |  January 2016

‘InstaFeast’ is a simple web application that allows users to check the top Instagram posts of food & beverages at their desired location. Using the Google Maps API, Facebook Graph API, Instagram API & an external face detection API, the app filters through recent Instagram posts from the user-defined location and returns the top posts of food & drinks. The back-end is built on top of Django while the front-end is written in vanilla HTML, CSS & JavaScript with Bootstrap.

Tech Stack: HTML5 + CSS3 + JS jQuery Bootstrap 3 Django Google Maps API Social Media APIs


Demo  |  GitHub Repo  |  Bootstrap Template  |  May 2015 - Present

‘BootstrapCards’ is a Boostrap 3 template that I had initially created for my (old) personal website. It implements card-based web design and consists of templates that can be used for one-pagers as well as multi-page blogs. A demo of the template can be found here.

Tech Stack: HTML5 + CSS3 + JS jQuery Bootstrap 3

Android Development

When We Meet Again

DevPost  |  NUS Hack&Roll 2015  |  January 2015

‘When We Meet Again’ is an Android application that uses the relative distance between users, determined using the phone’s Bluetooth, to trigger a reminder/push notification. This allows users to set reminders that trigger when they are near a particular person. My team and I built a working prototype of the app during NUS Hack&Roll 2015, where it fetched us the Best Freshmen Award. It was also featured & staff-picked on DevPost.

Tech Stack: Android Android Bluetooth APIs


GitHub Repo  |  Hackathon@SG 2015  |  July 2015

‘WWMAPulse’ is the second iteration of ‘When We Meet Again’ that my team and I built during Hackathon@SG 2015. WWMAPulse is also an Android app that triggers a push notification based on the proximity of users, however, instead of using Bluetooth to determine proximity, it uses Pulse, a proprietary feature of the Razer Nabu X (wearable by Razer).

Tech Stack: Android Razer Nabu SDK


GitHub Repo  |  Facebook Singapore Hackathon 2015  |  February 2015

‘WhyBills’ is a system that aims to eliminate the need for printed bills/receipts at retail outlets. The POS Java app combined with the consumer-side Android app allows the entire bill to be transferred to the consumer’s phone via a simple QR Code. In addition to being a convenient way for the consumer to store his/her bills, the Android app also acts as an effective expense tracker.

Tech Stack: Android Java JFrame