sentiment_feature.py
1 from typing import Any 2 from typing import ClassVar 3 from typing import Optional 4 5 import numpy as np 6 from nltk.sentiment.vader import SentimentIntensityAnalyzer 7 8 from evidently._pydantic_compat import PrivateAttr 9 from evidently.legacy.core import ColumnType 10 from evidently.legacy.features.generated_features import ApplyColumnGeneratedFeature 11 12 13 class Sentiment(ApplyColumnGeneratedFeature): 14 class Config: 15 type_alias = "evidently:feature:Sentiment" 16 17 __feature_type__: ClassVar = ColumnType.Numerical 18 display_name_template: ClassVar = "Sentiment for {column_name}" 19 column_name: str 20 21 _sid: Optional[SentimentIntensityAnalyzer] = PrivateAttr(None) 22 23 def __init__(self, column_name: str, display_name: Optional[str] = None): 24 self.display_name = display_name 25 super().__init__(column_name=column_name) 26 27 @property 28 def sid(self): 29 if self._sid is None: 30 import nltk 31 32 nltk.download("vader_lexicon", quiet=True) 33 self._sid = SentimentIntensityAnalyzer() 34 return self._sid 35 36 def apply(self, value: Any): 37 if value is None or (isinstance(value, float) and np.isnan(value)): 38 return 0 39 return self.sid.polarity_scores(value)["compound"]