class_docstr: Trains a sentiment analyser inspired by the algorithm by Vivek Narayanan.
  
  The analyzer requires sentence boundaries to give a score in context.
  Tokenization is needed to make sure tokens are within bounds. Transitivity
  requirements are also required.
  
  The training data needs to consist of a column for normalized text and a
  label column (either ``"positive"`` or ``"negative"``).
  
  For extended examples of usage, see the `Examples
  <https://github.com/JohnSnowLabs/spark-nlp/blob/master/examples/python/training/english/vivekn-sentiment/VivekNarayanSentimentApproach.ipynb>`__.
  
  ====================== ======================
  Input Annotation types Output Annotation type
  ====================== ======================
  ``TOKEN, DOCUMENT``    ``SENTIMENT``
  ====================== ======================
  
  Parameters
  ----------
  sentimentCol
      column with the sentiment result of every row. Must be 'positive' or 'negative'
  pruneCorpus
      Removes unfrequent scenarios from scope. The higher the better performance. Defaults 1
  
  References
  ----------
  The algorithm is based on the paper `"Fast and accurate sentiment
  classification using an enhanced Naive Bayes model"
  <https://arxiv.org/abs/1305.6143>`__.
  
  https://github.com/vivekn/sentiment/
  
  Examples
  --------
  >>> import sparknlp
  >>> from sparknlp.base import *
  >>> from sparknlp.annotator import *
  >>> from pyspark.ml import Pipeline
  >>> document = DocumentAssembler() \
  ...     .setInputCol("text") \
  ...     .setOutputCol("document")
  >>> token = Tokenizer() \
  ...     .setInputCols(["document"]) \
  ...     .setOutputCol("token")
  >>> normalizer = Normalizer() \
  ...     .setInputCols(["token"]) \
  ...     .setOutputCol("normal")
  >>> vivekn = ViveknSentimentApproach() \
  ...     .setInputCols(["document", "normal"]) \
  ...     .setSentimentCol("train_sentiment") \
  ...     .setOutputCol("result_sentiment")
  >>> finisher = Finisher() \
  ...     .setInputCols(["result_sentiment"]) \
  ...     .setOutputCols("final_sentiment")
  >>> pipeline = Pipeline().setStages([document, token, normalizer, vivekn, finisher])
  >>> training = spark.createDataFrame([
  ...     ("I really liked this movie!", "positive"),
  ...     ("The cast was horrible", "negative"),
  ...     ("Never going to watch this again or recommend it to anyone", "negative"),
  ...     ("It's a waste of time", "negative"),
  ...     ("I loved the protagonist", "positive"),
  ...     ("The music was really really good", "positive")
  ... ]).toDF("text", "train_sentiment")
  >>> pipelineModel = pipeline.fit(training)
  >>> data = spark.createDataFrame([
  ...     ["I recommend this movie"],
  ...     ["Dont waste your time!!!"]
  ... ]).toDF("text")
  >>> result = pipelineModel.transform(data)
  >>> result.select("final_sentiment").show(truncate=False)
  +---------------+
  |final_sentiment|
  +---------------+
  |[positive]     |
  |[negative]     |
  +---------------+
code: def _create_model(self, java_model):
      return ViveknSentimentModel(java_model=java_model)
  
file_path: spark-nlp/python/sparknlp/annotator/sentiment/vivekn_sentiment.py
imports: from sparknlp.common import *
  from sparknlp.common.annotator_type import AnnotatorType
label_desc: Use image node_id 4 for calling the ViveknSentimentApproach obj's underlying member method code with example usage: obj._create_model(java_model) and returns: ViveknSentimentModel