|
# π― Tone Detection using `yiyanghkust/finbert-tone` |
|
|
|
This project demonstrates how to perform **Tone Detection** using the [`yiyanghkust/finbert-tone`]. |
|
|
|
This approach enables you to classify emotional tone (e.g., Positive, Negative, Neutral, etc.) **without training**, by framing it as a textual entailment task. |
|
|
|
--- |
|
|
|
## π Model Details |
|
|
|
- **Model:** `yiyanghkust/finbert-tone` |
|
- **Task:** Detect the tone of financial text |
|
- **Approach:** Checks if the input sentence entails a hypothesis (e.g., "Positive" or Negative) |
|
- **Strength:** No labeled training data required |
|
|
|
--- |
|
|
|
## π Dataset Used |
|
|
|
For benchmarking and scoring, we use the [`go_emotions`](https://huggingface.co/datasets/go_emotions) dataset: |
|
|
|
```python |
|
from datasets import load_dataset |
|
|
|
dataset = load_dataset("go_emotions") |
|
``` |
|
|
|
# π§ Tone Detection (Inference) |
|
```Python |
|
from transformers import pipeline |
|
|
|
classifier = pipeline("zero-shot-classification", model="yiyanghkust/finbert-tone") |
|
|
|
labels = ["positive", "neutral", "negative"] |
|
|
|
text = "I can't believe this is happening again. So frustrating." |
|
|
|
result = classifier(text, candidate_labels=labels, hypothesis_template="This text expresses {}.") |
|
print(result) |
|
``` |
|
|
|
# π§ͺ Evaluation with Scoring |
|
|
|
```python |
|
from sklearn.metrics import accuracy_score |
|
|
|
# Mapping GoEmotions label indices to names |
|
id2label = dataset["train"].features["labels"].feature.names |
|
|
|
# Evaluate on a small sample |
|
def evaluate(dataset, candidate_labels): |
|
correct = 0 |
|
total = 0 |
|
for row in dataset.select(range(100)): # Use more samples as needed |
|
text = row["text"] |
|
true_labels = [id2label[i] for i in row["labels"]] |
|
result = classifier(text, candidate_labels=candidate_labels, hypothesis_template="This text expresses {}.") |
|
predicted = result["labels"][0] |
|
if predicted in true_labels: |
|
correct += 1 |
|
total += 1 |
|
return correct/total |
|
|
|
accuracy = evaluate(dataset["test"], candidate_labels=labels) |
|
print(f"Zero-shot Accuracy: {accuracy:.2%}") |
|
``` |
|
|
|
# βοΈ Use Cases |
|
Customer support tone analysis |
|
|
|
Chat moderation for emotional tone |
|
|
|
Feedback sentiment detection |
|
|
|
Real-time conversation emotion tagging |