Opinion Mining: Aspect and Sentiment Extraction
Module: Natural Language Processing | Difficulty: Advanced
Aspect Extraction
Sentiment Propagation
Joint Extraction
Results
| Model | Aspect F1 | Sentiment Acc | |-------|-----------|---------------| | CRF | 72.3 | 78.5 | | BiLSTM-CRF | 78.1 | 82.3 | | BERT-CRF | 85.2 | 88.1 |
import torch
import torch.nn as nn
class AspectSentimentExtractor(nn.Module):
def __init__(self, bert_model, n_aspects, n_sentiments):
super().__init__()
self.bert = bert_model
self.aspect_tagger = nn.Linear(768, n_aspects)
self.sentiment_classifier = nn.Linear(768, n_sentiments)
def forward(self, input_ids, attention_mask):
outputs = self.bert(input_ids, attention_mask=attention_mask)
hidden = outputs.last_hidden_state
aspect_logits = self.aspect_tagger(hidden)
sentiment_logits = self.sentiment_classifier(hidden[:, 0])
return aspect_logits, sentiment_logits
Research Insight: Joint aspect-sentiment extraction is more effective than pipeline approaches because aspects and sentiments are interdependent. The key insight is that aspect expressions often co-occur with sentiment words, enabling joint learning.