题图为 AI 绘图生成
嗨,你好哈,今天分享一个实践场景——情感分析,通过两种方式来体验大语言模型的魔法。
情感分析是人工智能领域中的一个重要应用,它可以帮助我们了解一段文本的情感色彩。比如,我们可以用情感分析来评估一篇新闻报道的正面或负面倾向,或者通过社交媒体上的评论了解公众对某个话题的态度和情感,或者对商品评论、电影影评等文本信息进行观点提取、主题分析、情感挖掘。
情感分析可以分为三种类型:积极(positive),消极(negative)和中性(neutral)
传统方案
基于规则的方法
基于规则的方法是最早被应用于情感分析的方法之一,它主要是通过人工定义一系列的规则来识别文本中的情感信息。
- 优点:可以根据具体应用场景进行灵活的规则设计,且不需要大量的标注数据。
- 缺点:由于情感表达形式多样,规则的设计需要考虑到不同的情感表达方式,这种方法的鲁棒性和适应性不如其他方法。
基于情感词典的方法
基于情感词典的方法是利用情感词典来识别文本中的情感信息。情感词典是一种包含情感词汇的词典,其中每个词汇都被标注为积极、消极或中性,这样可以通过计算文本中情感词的数量和极性来得到文本的情感倾向。
- 优点:可以快速进行情感分析,同时也比较易于实现。
- 缺点:情感词典的构建需要大量的人工标注,而且情感词典可能无法涵盖所有的情感表达方式,识别精度也受到情感词典质量的影响。
传统机器学习方法
传统机器学习方法包括朴素贝叶斯、支持向量机(SVM)和随机森林等算法。这些方法的基本思路都是利用已有的标注数据来训练分类器,然后用训练好的分类器来对新的文本进行情感分析。
- 优点:可以利用大量的标注数据进行训练,从而提高分类器的性能。
- 缺点:需要手工设计特征,而且对于不同的任务和数据集,需要重新设计特征,训练过程较为耗时。
深度学习方法
深度学习方法是目前在情感分析领域中表现最好的方法之一,它可以自动地从原始的文本中学习出表示特征,并且可以处理不同长度的文本。深度学习方法包括循环神经网络(RNN)、长短时记忆网络(LSTM)和卷积神经网络(CNN)等模型。其中,RNN 和 LSTM 可以很好地处理序列数据,而 CNN 可以有效地处理文本中的局部信息。这些模型通常包括一个嵌入层(embedding layer)来将文本转换为向量表示,一个或多个隐藏层来提取特征,最后是一个输出层来预测文本的情感极性。
- 优点:可以自动地学习出文本中的特征,不需要人工进行特征工程,同时也可以利用大量的未标注数据进行训练,从而提高模型的泛化能力。
- 缺点:需要大量的标注数据来训练模型,而且训练过程较为复杂和耗时。
示例
import jieba
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
def analyze\_sentiment\_zh(text):
# 中文分词
seg_list = jieba.cut(text)
seg_list = [word for word in seg_list if len(word) > 1]
# 加载情感词典
# pos\_words = pd.read\_csv('pos\_words.csv', header=None)[0].tolist()
# neg\_words = pd.read\_csv('neg\_words.csv', header=None)[0].tolist()
pos_words = ["好看","太好看","不枯燥"]
neg_words = ["枯燥","不好看","太枯燥"]
# 构建语料库
corpus = []
for word in seg_list:
if word in pos_words:
corpus.append('positive')
elif word in neg_words:
corpus.append('negative')
else:
corpus.append('neutral')
# 特征提取
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(seg_list)
# 训练模型
y = corpus
clf = MultinomialNB()
clf.fit(X, y)
# 预测情感
X_test = vectorizer.transform([text])
y_pred = clf.predict(X_test)
return y_pred[0]
print(analyze_sentiment_zh("这本书太好看了,一点也不枯燥"))
print(analyze_sentiment_zh("这本书太枯燥了,一点也不好看"))
小结
这些传统的机器学习算法,想要取得好的效果,除了要知道有哪些算法可以用,还非常依赖特征工程与模型调参两方面的工作经验。如上面的句子通过分词后的结果如下:
这本书太好看了,一点也不枯燥 ——> ['本书', '好看', '一点', '枯燥']
这本书太枯燥了,一点也不好看 ——> ['本书', '枯燥', '一点', '好看']
想要解决一个简单的情感分析问题,也需要撰写大量文本处理的代码,还要了解针对当前特定场景的技巧,这非常依赖工程师的经验。
OpenAI 情感分析解决方案
GPT 通过学习大量的文本数据,使得它对自然语言的理解具有丰富的语义表示能力,可以根据上下文和语境进行推断和预测。在情感分析任务中,GPT 可以通过对待分析文本的编码和解码,结合预训练好的语义表示,从而有效地提取文本中的情感信息。
此外,GPT 还具有较强的泛化能力和可迁移性,可以适应不同类型的数据和任务,同时还能够进行细粒度的情感分析,如情感强度、情感类型等。这使得 GPT 成为一种在情感分析任务中非常有效的方法。
import openai
import os
openai.api_key = os.environ.get("OPENAI\_API\_KEY")
def analyze\_sentiment(text):
model_engine = "text-davinci-002"
prompt = (f"The following is a sentiment analysis of the following text:\n"
f"Text: {text}\n"
f"Sentiment:")
response = openai.Completion.create(
engine=model_engine,
prompt=prompt,
temperature=0,
max_tokens=1,
n=1,
stop=None,
timeout=60,
)
sentiment = response.choices[0].text.strip()
return sentiment
print(analyze_sentiment("这个产品很便宜,但是质量非常好。"))
print(analyze_sentiment("虽然这个产品有点小问题,但是客服解决得非常及时,服务很好。"))
print(analyze_sentiment("虽然价格有点高,但是产品真的非常值得购买。"))
print(analyze_sentiment("虽然产品不是特别耐用,但是颜值非常高,我很满意。"))
print(analyze_sentiment("虽然我收到的产品与图片有点出入,但是实际效果真的很好。"))
print("=" * 10)
print(analyze_sentiment("虽然物流很快,但是包装实在太差了。"))
print(analyze_sentiment("虽然价格便宜,但是质量真的很一般。"))
print(analyze_sentiment("虽然售后服务很好,但是产品不太耐用。"))
print(analyze_sentiment("虽然尺码不太合适,但是材质很舒服。"))
print(analyze_sentiment("虽然包装非常好,但是产品实际效果很一般。"))
print("=" * 10)
# 验证上面容易混淆的语料
print(analyze_sentiment("这本书太好看了,一点也不枯燥"))
print(analyze_sentiment("这本书太枯燥了,一点也不好看"))
结语
总体来说,不同的情感分析方法各有优缺点,在实际应用中需要根据具体的场景和数据情况选择合适的方法。而 GPT 作为一种强大的自然语言处理模型,可以作为情感分析的工具之一,可以通过在训练集上进行微调来实现情感分析的任务。同时,GPT 还可以利用其生成能力,结合其他方法来实现情感分析任务,具有广泛的应用前景。
推荐阅读
后台回复 230416 获取示例代码
