Question Classifier 2003 Reboot
This code is a reimplementation of work from 2003 written in
The goal here is not to improve upon that work but to get as reasonably close to it as possible.
Any improvements will appear in other repositories.
The history of this code is somewhat unfortunate, as this was pre-PhD code with poor development organization. So it is rather difficult for me to say this code exactly replicates the work from 2003. The primary reasons are:
- I'm not 100% sure if I even found the correct original
- The code has been translated from
tclnative regex to
However, because the reimplementation's regular expressions are basically the same and because tests comparing the
tcl code above to this reimplementation have largely similar results, I believe this code is a valid reimplementation.
Accordingly, please cite the work from 2003 when using this code, but also please state that it is a reimplementation.
More recent work has used these ideas within a machine learning framework.
A live demonstration is available at https://olney.ai/question-classifier-2003-reboot/
- dotnet SDK 2.1 or higher
- node.js with npm
- An F# editor like Visual Studio, Visual Studio Code with Ionide or JetBrains Rider.
Building and running the app
- Install JS dependencies:
- Install .NET dependencies:
mono .paket/paket.exe install
- Start Webpack dev server:
- After the first compilation is finished, in your browser open: http://localhost:8080/
Any modification you do to the F# code will be reflected in the web page after saving.
Building and running the tests
JS dependencies are declared in
package-lock.json is a lock file automatically generated.
Paket is a dependency manager for .NET and mono projects, which is designed to work well with NuGet packages and also enables referencing files directly from Git repositories or any HTTP resource. It enables precise and predictable control over what packages the projects within your application reference.
.NET dependencies are declared in
src/paket.references lists the libraries actually used in the project. Since you can have several F# projects, we could have different custom
.paket files for each project.
Last but not least, in the
.fsproj file you can find a new node:
<Import Project="..\.paket\Paket.Restore.targets" /> which just tells the compiler to look for the referenced libraries information from the
Fable-splitter is a standalone tool which outputs separated files instead of a single bundle. Here all the js files are put into the
node-build dir. And the main entry point is our
Webpack is a JS bundler with extensions, like a static dev server that enables hot reloading on code changes. Fable interacts with Webpack through the
fable-loader. Configuration for Webpack is defined in the
webpack.config.js file. Note this sample only includes basic Webpack configuration for development mode, if you want to see a more comprehensive configuration check the Fable webpack-config-template. Deployment uses Webpack to populate the
deploy directory and then pushes that directory to
index.html file and other assets like an icon can be found in the