# Sentiment Analysis in Python: A Comprehensive Guide

[Sentiment analysis](https://www.analyticsvidhya.com/blog/2022/07/sentiment-analysis-using-python/), also known as opinion mining, is a natural language processing (NLP) technique used to determine the emotional tone behind a body of text. It's widely used to analyze customer feedback, social media comments, and reviews. This blog will guide you through the process of performing sentiment analysis in Python, leveraging powerful libraries such as NLTK, TextBlob, and VADER.

### Prerequisites

Before we begin, ensure you have Python [installed](https://blog.bytescrum.com/how-to-setup-your-python-development-environment-a-step-by-step-tutorial) on your system. You’ll also need to install some libraries. Open your terminal and run the following commands:

```bash
pip install nltk
pip install textblob
pip install vaderSentiment
```

### Step 1: Import Necessary Libraries

First, we need to import the libraries we’ll be using:

```python
import nltk
from nltk.sentiment.vader import SentimentIntensityAnalyzer
from textblob import TextBlob
```

### Step 2: Download NLTK Data

For NLTK, we need to download the VADER lexicon, a pre-trained sentiment analysis model:

```python
nltk.download('vader_lexicon')
```

### Step 3: Sentiment Analysis with VADER

VADER (Valence Aware Dictionary and sEntiment Reasoner) is specifically attuned to sentiments expressed in social media. It uses a combination of a lexicon and a set of rules to perform sentiment analysis.

```python
def vader_sentiment(text):
    sia = SentimentIntensityAnalyzer()
    sentiment = sia.polarity_scores(text)
    return sentiment

text = "I love Python. It's such a powerful language!"
print(vader_sentiment(text))
```

The output will be a dictionary with the keys `neg`, `neu`, `pos`, and `compound`:

```python
{'neg': 0.0, 'neu': 0.292, 'pos': 0.708, 'compound': 0.6696}
```

* `neg`: Negative sentiment score
    
* `neu`: Neutral sentiment score
    
* `pos`: Positive sentiment score
    
* `compound`: Overall sentiment score, ranging from -1 (most negative) to +1 (most positive)
    

### Step 4: Sentiment Analysis with TextBlob

TextBlob is another powerful library for processing textual data. It provides a simple API for diving into common NLP tasks, including sentiment analysis.

```python
def textblob_sentiment(text):
    blob = TextBlob(text)
    sentiment = blob.sentiment
    return sentiment

text = "I love Python. It's such a powerful language!"
print(textblob_sentiment(text))
```

The output will be a named tuple with `polarity` and `subjectivity`:

```python
Sentiment(polarity=0.5, subjectivity=0.6)
```

* `polarity`: Ranges from -1 (negative) to +1 (positive)
    
* `subjectivity`: Ranges from 0 (objective) to 1 (subjective)
    

### Step 5: Analyzing a Dataset

Let's analyze a dataset of movie reviews to see sentiment analysis in action. We'll use the `pandas` library to handle our data.

```python
import pandas as pd

# Sample data
data = {
    'review': [
        "I loved the movie. It was fantastic!",
        "I hated the film. It was awful.",
        "The movie was okay, not great but not bad either.",
        "What a waste of time. Terrible acting!",
        "An absolute masterpiece. Brilliant performance!"
    ]
}

df = pd.DataFrame(data)
```

#### Adding Sentiment Scores to the DataFrame

We'll use both VADER and TextBlob to add sentiment scores to our DataFrame.

```python
def add_vader_sentiment(df):
    sia = SentimentIntensityAnalyzer()
    df['vader_sentiment'] = df['review'].apply(lambda x: sia.polarity_scores(x)['compound'])
    return df

def add_textblob_sentiment(df):
    df['textblob_sentiment'] = df['review'].apply(lambda x: TextBlob(x).sentiment.polarity)
    return df

df = add_vader_sentiment(df)
df = add_textblob_sentiment(df)
print(df)
```

The DataFrame now includes sentiment scores from both VADER and TextBlob:

|  | Review | Vader Sentiment | TextBlob Sentiment |
| --- | --- | --- | --- |
| 0 | I loved the movie. It was fantastic! | 0.8316 | 0.875 |
| 1 | I hated the film. It was awful. | \-0.7424 | \-1.000 |
| 2 | The movie was okay, not great but not bad either. | 0.3612 | 0.250 |
| 3 | What a waste of time. Terrible acting! | \-0.8020 | \-1.000 |
| 4 | An absolute masterpiece. Brilliant performance! | 0.9287 | 1.000 |

### Step 6: Visualizing Sentiment

Finally, let's visualize the sentiment distribution using `matplotlib`.

```python
import matplotlib.pyplot as plt

plt.figure(figsize=(10, 5))

# VADER sentiment
plt.subplot(1, 2, 1)
plt.hist(df['vader_sentiment'], bins=10, color='blue', alpha=0.7)
plt.title('VADER Sentiment Distribution')
plt.xlabel('Sentiment Score')
plt.ylabel('Frequency')

# TextBlob sentiment
plt.subplot(1, 2, 2)
plt.hist(df['textblob_sentiment'], bins=10, color='green', alpha=0.7)
plt.title('TextBlob Sentiment Distribution')
plt.xlabel('Sentiment Score')
plt.ylabel('Frequency')

plt.tight_layout()
plt.show()
```

<details data-node-type="hn-details-summary"><summary>Conclusion</summary><div data-type="detailsContent">Sentiment analysis is a valuable tool in NLP, providing insights into the emotional tone of text data. In this guide, we've covered the basics of sentiment analysis using Python, leveraging the VADER and TextBlob libraries. You can further enhance your sentiment analysis models by exploring more advanced techniques and integrating them into real-world applications.</div></details>

Happy coding!
