最好做成一个开关,因为需要将 AI 生成的内容判断情绪需要消耗 Token。

:::info 我们认为,之前经过预训练的大语言模型里面,已经蕴含了情感分析的知识。我们只需要简单利用大语言模型里面知道的“好评”和“差评”的概念信息,就能判断出它从未见过的评论到底是好评还是差评。

因此在我们的虚拟偶像开发中,我们可以通过 OpenAI 的 Embedding 接口来简单计算 OpenAI 返回文本与不同情绪之间的余弦相似性来实现

情绪:

  1. 喜悦(Joy)
  2. 悲伤(Sadness)
  3. 愤怒(Anger)
  4. 恐惧(Fear)
  5. 惊讶(Surprise)
  6. 厌恶(Disgust)

这是 6 种比较基础的人类情绪,其他还有

  1. 信任(Trust)
  2. 预期/期待(Anticipation)
  3. 羞愧
  4. 内疚
  5. 骄傲
  6. 羡慕
  7. 同情
  8. 感激

:::

什么是情感分析 from GPT4

情感分析(Sentiment Analysis)是自然语言处理(NLP)的一个分支,它专注于识别和提取文本数据中的情感内容。简而言之,情感分析的目标是确定一个文本表达的情感倾向,通常是正面、负面或中立。 情感分析广泛应用于社交媒体监控、产品和服务评论分析、市场研究、政治舆情分析等领域。它可以帮助企业和组织了解公众对于品牌、产品或服务的感受,从而做出相应的策略调整。 情感分析可以分为几个层次:
  1. 文档级别:在这个层次上,整个文档(如一篇评论或一篇博客文章)被认为是表达单一情感的实体。任务是判断整篇文档所表达的情感倾向。
  2. 句子级别:在这个层次上,分析的焦点是单个句子。每个句子被视为表达独立情感的单位,分析的目标是判断每个句子的情感色彩。
  3. 方面级别:更细粒度的情感分析,不仅识别情感的倾向,还识别情感关联的特定方面或属性。例如,在一条关于手机的评论中,“电池寿命长”可能被判断为对电池方面的正面评价。
技术上,情感分析可以通过不同的方法实现,包括:
  • 基于规则的方法:使用预先定义的规则和情感词典来识别文本中的情感表达。这种方法依赖于情感词汇表,如AFINN、SentiWordNet等。
  • 机器学习方法:通过训练分类器(如支持向量机、随机森林、朴素贝叶斯等)来识别情感。这通常需要大量标记的训练数据。
  • 深度学习方法:使用神经网络(如卷积神经网络CNN、循环神经网络RNN、长短期记忆网络LSTM等)来捕捉文本中的复杂模式,并进行情感分类。
情感分析是一个活跃的研究领域,随着技术的进步,方法和算法不断发展,以更准确地识别和理解人类的情感表达。

余弦距离 & 余弦相似性

余弦距离是一种衡量两个向量在多维空间中的相似性的度量方式。它是通过计算两个向量的夹角的余弦值来确定的,因此被称为余弦相似性(Cosine Similarity)。余弦距离通常用于文本分析中,特别是在处理文本数据的向量化表示时(如TF-IDF或Word2Vec)。 余弦相似性的计算公式如下: [ \text{Cosine Similarity} (A, B) = \frac{A \cdot B}{||A|| \times ||B||} ] 其中:
  • ( A ) 和 ( B ) 是两个非零向量。
  • ( A \cdot B ) 表示 ( A ) 和 ( B ) 的点积。
  • ( ||A|| ) 和 ( ||B|| ) 分别表示 ( A ) 和 ( B ) 的欧几里得范数(即向量的长度)。
余弦相似性的值范围从 -1 到 1:
  • 当余弦相似性为 1 时,表示两个向量方向完全相同。
  • 当余弦相似性为 0 时,表示两个向量是正交的,即它们在多维空间中是独立的。
  • 当余弦相似性为 -1 时,表示两个向量方向完全相反。
而余弦距离通常定义为 1 减去余弦相似性,因此它的范围是从 0 到 2: [ \text{Cosine Distance} (A, B) = 1 - \text{Cosine Similarity} (A, B) ] 余弦距离越小,表示两个向量越相似;余弦距离越大,表示两个向量越不相似。在某些应用中,人们可能会使用余弦距离而不是余弦相似性,因为距离的概念在直觉上更容易理解。

如何实现

可以使用 OpenAI 的 Embedding 接口计算向量距离

情感分析 - 图1

示例代码

  1. import openai
  2. import os
  3. from openai.embeddings_utils import cosine_similarity, get_embedding
  4. # 获取访问open ai的密钥
  5. openai.api_key = os.getenv("OPENAI_API_KEY")
  6. # 选择使用最小的ada模型
  7. EMBEDDING_MODEL = "text-embedding-ada-002"
  8. # 获取"好评"和"差评"的
  9. positive_review = get_embedding("好评")
  10. negative_review = get_embedding("差评")
  11. positive_example = get_embedding("买的银色版真的很好看,一天就到了,晚上就开始拿起来完系统很丝滑流畅,做工扎实,手感细腻,很精致哦苹果一如既往的好品质")
  12. negative_example = get_embedding("降价厉害,保价不合理,不推荐")
  13. def get_score(sample_embedding):
  14. return cosine_similarity(sample_embedding, positive_review) - cosine_similarity(sample_embedding, negative_review)
  15. positive_score = get_score(positive_example)
  16. negative_score = get_score(negative_example)
  17. print("好评例子的评分 : %f" % (positive_score))
  18. print("差评例子的评分 : %f" % (negative_score))