From d31d2c5e7b6c59d17f6beafd813a8693db3e5fb9 Mon Sep 17 00:00:00 2001 From: Pavan Mandava Date: Sat, 1 Aug 2020 01:59:30 +0200 Subject: [PATCH] WIP : README Documentation - AllenNLP Model & plot --- README.md | 60 +++++++++++++++---- classifier/nn.py | 4 -- plots/bilstm_model/confusion_matrix_plot.png | Bin 0 -> 34736 bytes 3 files changed, 47 insertions(+), 17 deletions(-) create mode 100644 plots/bilstm_model/confusion_matrix_plot.png diff --git a/README.md b/README.md index 001be3e..733f93c 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,14 @@ Project repo for Computational Linguistics Team Lab at the University of Stuttga ## Introduction This repository contains code and datasets for classifying citation intents in research papers. -We implemented 3 different classifiers and evaluated the results: +We implemented 3 classifiers and evaluated on test dataset: - - Perceptron Classifier - Baseline (Implemented from scratch) + - Perceptron Classifier - Baseline model (Implemented from scratch) - Feedforward Neural Network Classifier (using [PyTorch](https://pytorch.org/)) - BiLSTM + Attention with ELMo Embeddings (using [AllenNLP](https://allennlp.org/) library) -This README documentation focuses on running the code base, training the models and predictions. For more information about our project work and detailed error analysis, check [this](https://www.overleaf.com/project/5f1b0e8a6d0fb80001ceb5eb) report.
-For more information on the Citation Intent Classification in Scientific Publications, follow this [link](https://arxiv.org/pdf/1904.01608.pdf) to the original published paper and the [GitHub repo](https://github.com/allenai/scicite) +This README documentation focuses on running the code base, training the models and predictions. For more information about our project work, model results and detailed error analysis, check [this](https://www.overleaf.com/project/5f1b0e8a6d0fb80001ceb5eb) report.
+For more information on the Citation Intent Classification in Scientific Publications, follow this [link](https://arxiv.org/pdf/1904.01608.pdf) to the original published paper and their [GitHub repo](https://github.com/allenai/scicite) ## Environment & Setup TODO @@ -27,11 +27,12 @@ We have 3 different intents/classes in the dataset: | | background | method | result | |:---|:---:|:---:|:---:| | train | 4.8 K | 2.3 K | 1.1 K | +| dev | 0.5 K | 0.3 K | 0.1 K | | test | 1 K | 0.6 K | 0.2 K | ## Methods (Classification) ### 1) Perceptron Classifier (Baseline Classifier) -We implemented [Perceptron](https://en.wikipedia.org/wiki/Perceptron) as a baseline classifier, from scratch (including evaluation). Perceptron is an algorithm for supervised learning of classification. It's a Linear and a Binary Classifier, which means it can only decide whether or not an input feature belongs to some specific class and also it's only capable of learning linearly separable patterns. +We implemented [Perceptron](https://en.wikipedia.org/wiki/Perceptron) as a baseline classifier, from scratch (including evaluation). Perceptron is an algorithm for supervised learning of classification. It's a linear and binary classifier, which means it can only decide whether or not an input feature belongs to some specific class and it's only capable of learning linearly separable patterns. ```python class Perceptron: def __init__(self, label: str, weights: dict, theta_bias: float): @@ -47,15 +48,13 @@ Since we have 3 different classes for Classification, we create a Perceptron obj Check the source [code](/classifier/linear_model.py) for more details on the implementation of Perceptron Classifier. -#### Running the Model - +### Running the Model > `(citation-env) [user@server citation-analysis]$ python -m testing.model_testing` -[link](/testing/model_testing.py) to the source code. All the Hyperparameters can be modified to experiment with. +[Link](/testing/model_testing.py) to the source code. All the Hyperparameters can be modified to experiment with. -**Evaluation** +### Evaluation we used ***f1_score*** metric for evaluation of our baseline classifier. - > F1 score is a weighted average of Precision and Recall(or Harmonic Mean between Precision and Recall). > The formula for F1 Score is: > F1 = 2 * (precision * recall) / (precision + recall) @@ -72,12 +71,47 @@ eval.metrics.f1_score(y_true, y_pred, labels, average) [Link](/eval/metrics.py) to the metrics source code. ### Results -Confusion Matrix Plot +Confusion Matrix Plot ### 2) Feedforward Neural Network (using PyTorch) +A feed-forward neural network classifier with a single hidden layer containing 9 units. While a feed-forward neural network is clearly not the ideal architecture for sequential text data, it was of interest to add a sort of second baseline and examine the added gains (if any) relative to a single perceptron. The input to the feedforward network remained the same; only the final model was suitable for more complex inputs such as word embeddings. -TODO +Check this feed-forward model source [code](/classifier/linear_model.py) for more details. ### 3) BiLSTM + Attention with ELMo (AllenNLP Model) +The Bi-directional Long Short Term Memory (BiLSTM) model built using the [AllenNLP](https://allennlp.org/) library. For word representations, we used 100-dimensional [GloVe](https://nlp.stanford.edu/projects/glove/) vectors trained on a corpus of 6B tokens from Wikipedia. For contextual representations, we used [ELMo](https://allennlp.org/elmo) Embeddings which have been trained on a dataset of 5.5B tokens. This model uses the entire input text, as opposed to selected features in the text, as in the first two models. It has a single-layer BiLSTM with a hidden dimension size of 50 for each direction. + +We used AllenNLP's [Config Files](https://guide.allennlp.org/using-config-files) to build our model, just need to implement a model and a dataset reader (with a Config file). + +Our BiLSTM AllenNLP model contains 4 major components: + + 1. Dataset Reader - [CitationDatasetReader](/utils/reader.py) + - It reads the data from the file, tokenizes the input text and creates AllenNLP `Instances` + - Each `Instance` contains a dictionary of `tokens` and `label` + 2. Model - [BiLstmClassifier](/calssifier/nn.py) + - The model's `forward()` method is called for every data instance by passing `tokens` and `label` + - The signature of `forward()` needs to match with field names of the `Instance` created by the DatasetReader + - The `forward()` method finally returns an output dictionary with the predicted label, loss, softmax probabilities and so on... + 3. Config File - [basic_model.json](configs/basic_model.json?raw=true) + - The AllenNLP Configuration file takes the constructor parameters for various objects (Model, DatasetReader, Predictor, ...) + - We can also define a number of Hyperparameters from the Config file. + - Depth and Width of the Network + - Number of Epochs + - Optimizer & Learning Rate + - Batch Size + - Dropout + - Embeddings + 4. Predictor - [IntentClassificationPredictor](/testing/intent_predictor.py) + - AllenNLP uses `Predictor`, a wrapper around trained model, for making predictions. + - The Predictor uses a pre-trained/saved model and dataset reader to predict new Instances + +### Running the Model +TODO + +### Evaluation +TODO + +### Results +Confusion Matrix Plot -TODO \ No newline at end of file +## References \ No newline at end of file diff --git a/classifier/nn.py b/classifier/nn.py index 1f0f51e..d2c17d2 100644 --- a/classifier/nn.py +++ b/classifier/nn.py @@ -104,10 +104,6 @@ class BiLstmClassifier(Model): output_dict['probabilities'] = class_probabilities output_dict['positive_label'] = label output_dict['prediction'] = label - # citation_text = [] - # for batch_text in output_dict['tokens']: - # citation_text.append([self.vocab.get_token_from_index(token_id.item()) for token_id in batch_text]) - # output_dict['tokens'] = citation_text return output_dict diff --git a/plots/bilstm_model/confusion_matrix_plot.png b/plots/bilstm_model/confusion_matrix_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..1f824c8cf15c36dbf012ad12c7e2ecfc1adad26f GIT binary patch literal 34736 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 literal 0 HcmV?d00001