# ***NLP course project***
***Almouhannad Hafez + Mariam Khierbek***

## ***Contents***  
**[Description](#description)**  
**[How to run](#how-to-run)**  
**[Part1. Data preprocessing](#part1-data-preprocessing)**  
**[Part2. Basic Morphological analyzer](#part2-basic-morpholgical-analyzer)**  
**[Part3. Lemmatization, POS Tagging, and N-Gram](#part3-lemmatization-pos-tagging-and-n-gram)**  
**[Results](#results)**

## ***Description***  
**Classifying symptom (as a text data) into a disease**  
> [Dataset link](https://www.kaggle.com/datasets/niyarrbarman/symptom2disease)

### ***Main contents***  
- **Data folder**: Containing dataset and train and test sets
- **Constants.py**: Some fixed values to use in other files as `CONSTANTS` class
- **Other .ipynb files**: Jupyter notebooks containing actual work
- **Results.xlsx**: Excel worksheet containing results
- **conda_nlp_environment.yml**: Python modules requirements

## ***How to run***
> **Using [Anaconda](https://www.anaconda.com/)**  
1. **Clone this repository**  
    ```bash
        git clone git@git.hiast.edu.sy:almohanad.hafez/nlp-project.git
    ```
1. **Open Anaconda Prompt**  
1. **Navigate to the repository directory in your machine `cd <path_to_repository_directory>/nlp-project`**  
    **If you want to navigate to a disk other than C:\, let's say D, you can run `D:`**
1. **Create the Conda Environment from the .yml File**  
    ```bash
        conda env create -f conda_nlp_environment.yml
    ```
1. **Activate the New Environment**
    ```bash
        conda activate NLP
    ```
1. **Open jupyter notebook**    
    ```bash
        jupyter notebook
    ```

## ***Part1. Data preprocessing***
**Files:**
> **`1.1.Dataset_Overview.ipynb`**  
- **Some interesting details about used dataset**

> **`1.2.Data_Preprocessing.ipynb`**  
- **Applying preprocessing steps on dataset, this includes:**
    1. Refactoring dataset schema
    1. Handling nulls/duplicates
    1. Shuffling
    1. Converting text to lowercase
    1. Expanding contractions
    1. Splitting into train/test sets

## ***Part2. Basic Morpholgical analyzer***
**Files:**
> **`2.Stemmer.ipynb`**  
- **Applying classification task, this includes:**
    1. Using `nltk` modules
    1. Tokenizing text
    1. Stemming tokens
    1. Removing stopwords
    1. Vectorizing using `TF-IDF`
    1. Training a `Naive bayes` classifier and evaluate it

## ***Part3. Lemmatization, POS Tagging, and N-Gram***
**Files:**
> **`3.1.Lemmatizer.ipynb`**  
- **Applying classification task using tokens lemmatization using different modules, this includes:**
    1. `nltk`
    1. `SpaCy`
    1. `Stanza`  
> **`3.2.POS_Tagging_Filter.ipynb`**  
- **Applying classification task using POS tagger to perform task using only one tag, this includes:**
    1. Testing ***Verbs*** only
    1. Testing ***Adjectives*** only
    1. Testing ***Nouns*** only

**`3.3.N-Grams.ipynb`**  
- **Applying classification task using n-gram to perform task using only TF-IDF with different grams**

## ***Results***
> ***Applied features selection and model's hyperparameters tuning*** 

| Case\\Criterion         | Accuracy(Train) | Accuracy(Test) | Precision(Test-Average) | Recall(Test-Average) | F1-Score(Test-Average) | Notes                  |
| ----------------------- | --------------- | -------------- | ----------------------- | -------------------- | ---------------------- | ---------------------- |
| nltk stemmer            | 0.9783          | 0.9416         | 0.9406                  | 0.9392               | 0.9377                 | alpha=0.1, 300features |
| nltk lemmatizer         | 0.9957          | 0.9567         | 0.9578                  | 0.9561               | 0.9558                 | alpha=0.1, 800features |
| Stanza lemmatizer       |                 |                |                         |                      |                        |                        |
| SpaCy lemmatizer        | 0.9957          | 0.9545         | 0.9557                  | 0.9537               | 0.9536                 | alpha=0.1, 750features |
| Lemma + Verbs only      | 0.7438          | 0.6082         | 0.6461                  | 0.6166               | 0.6098                 | alpha=0.1, 150features |
| Lemma + Adjectives only | 0.7496          | 0.5974         | 0.6807                  | 0.6065               | 0.6143                 | alpha=0.1, 150features |
| Lemma + Nouns only      | 0.9826          | 0.9026         | 0.9056                  | 0.9031               | 0.9001                 | alpha=0.1, 400features |


> ***Without features selection***  

| Case\\Criterion         | Accuracy(Train) | Accuracy(Test) | Precision(Test-Average) | Recall(Test-Average) | F1-Score(Test-Average) |
| ----------------------- | --------------- | -------------- | ----------------------- | -------------------- | ---------------------- |
| nltk stemmer            | 0.9942          | 0.9199         | 0.9255                  | 0.9238               | 0.9193                 |
| nltk lemmatizer         | 0.9942          | 0.9242         | 0.9294                  | 0.9279               | 0.9235                 |
| Stanza lemmatizer       | 0.9942          | 0.9286         | 0.9329                  | 0.9311               | 0.9271                 |
| SpaCy lemmatizer        | 0.9957          | 0.9286         | 0.9342                  | 0.9314               | 0.9283                 |
| Lemma + Verbs only      | 0.7815          | 0.6082         | 0.6565                  | 0.6243               | 0.6131                 |
| Lemma + Adjectives only | 0.8683          | 0.6061         | 0.6815                  | 0.6202               | 0.6141                 |
| Lemma + Nouns only      | 0.9783          | 0.8766         | 0.8868                  | 0.8806               | 0.8740                 |
| Text + 1Gram            | 0.9971          | 0.8983         | 0.9129                  | 0.9049               | 0.8995                 |
| Text + 2Gram            | 0.9986          | 0.8853         | 0.8947                  | 0.8918               | 0.8834                 |
| Text + 3Gram            | 0.9971          | 0.8680         | 0.8818                  | 0.8747               | 0.8668                 |
| Text + 4Gram            | 1.0000          | 0.8009         | 0.8486                  | 0.8145               | 0.8098                 |
| Text + 5Gram            | 1.0000          | 0.7078         | 0.8393                  | 0.7234               | 0.7393                 |