/ src / evidently / legacy / features / sentiment_feature.py
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"]