02|无需任何机器学习,如何利用大语言模型做情感分析?
02|无需任何机器学习,如何利用大语言模型做情感分析?
讲述:徐文浩
时长11:22大小10.38M
传统的二分类方法:朴素贝叶斯与逻辑回归
传统方法的挑战:特征工程与模型调参
特征工程
机器学习相关经验
大语言模型:20 行代码的情感分析解决方案
更大的数据集上的真实案例
小结
课后练习
利用大型语言模型进行情感分析是一种简单而高效的方法。传统的情感分析方法需要进行特征工程和机器学习训练,而利用大语言模型提供的API,只需不到10行代码就能完成,并且能获得非常好的效果。文章通过示例代码演示了如何利用大语言模型的Embedding API进行情感分析,以及在真实数据集上的准确率验证。这种方法被称为零样本分类,即不需要任何新的样本来训练机器学习的模型,就能进行分类。通过大语言模型的API,可以轻松实现文本分类应用,大大降低了门槛。文章鼓励读者尝试将这个方法运用在其他数据集上,以验证其效果。总的来说,利用大型语言模型进行情感分析是一种简单、高效且准确的方法,为文本分类任务提供了新的解决方案。
赞 78
提建议
全部留言(93)
- 最新
- 精选
- Dev.lu2023-04-15 来自新加坡conda install -c conda-forge matplotlib conda install -c conda-forge plotly conda install -c anaconda scikit-learn 跑情感分析的部分,可能需要额外安装这些包
作者回复: 👍
共 3 条评论21 - humor2023-03-22 来自浙江大模型是怎么知道好评和差评是代表什么意思的呢
作者回复: 它是根据海量的预训练数据在高维空间里给他们两个找了个位置,我们只是我们拿到的评论离哪个位置近。 大模型的语义理解能力,就没法用一两句话说清了。如果真的想要知道,还是要深入理解深度学习,可以去看看李沐老师的论文解读系列。https://www.bilibili.com/video/BV1AF411b7xQ/
共 4 条评论19 - Geek_0355662023-05-08 来自广东知乎上张俊林对GPT对NLP的影响做了很好解读,我这个小白听了也能有很深的理解。 他把NLP解决的问题分为中间任务和最终任务,先阐述中间任务其实是人类没有找到更好办法处理自然语言时想出来的辅助工具,GPT的出现一瞬间让这些脚手架都没了用处。 再进一步,他又把最终任务分为自然语言理解和自然语言生成任务,进一步分析GPT对这两类任务的影响。 很简洁优美的讲清楚了GPT对NLP的冲击,知乎地址我放下面,感兴趣的可以自己看。 https://zhuanlan.zhihu.com/p/597586623展开
作者回复: 👍
共 2 条评论16 - jo2023-04-07 来自上海“我们把这段文本的 Embedding 和“好评”以及“差评”通过余弦距离(Cosine Similarity)计算出它的相似度”,不太懂
作者回复: 不理解什么是向量的余弦距离,可以问问ChatGPT: 什么是向量的余弦距离? 向量的余弦距离是用于度量两个向量之间的相似性的一种方法。它衡量的是两个向量之间的夹角的余弦值。 具体来说,假设有两个n维向量a和b,其余弦距离为cos(θ),其中θ是a和b之间的夹角,计算公式如下: cos(θ) = (a·b) / (||a|| ||b||) 其中,a·b表示向量a和向量b的点积,||a||和||b||分别表示向量a和向量b的范数。 余弦距离的取值范围在[-1, 1]之间,当两个向量之间的夹角越小时,余弦距离越接近1,表示两个向量越相似;当两个向量之间的夹角越大时,余弦距离越接近-1,表示两个向量越不相似。当夹角为90度时,余弦距离为0,表示两个向量完全不相关。
共 2 条评论14 - Roy Liang2023-03-22 来自浙江课后作业,全部数据集是不是太多,出不了结果,前33条记录没问题,我是不是该给OpenAI充值? precision recall f1-score support negative 0.81 0.93 0.87 14 positive 0.92 0.79 0.85 14 accuracy 0.86 28 macro avg 0.86 0.86 0.86 28 weighted avg 0.86 0.86 0.86 28 代码 import pandas as pd import numpy as np from sklearn.metrics import classification_report,PrecisionRecallDisplay from openai.embeddings_utils import cosine_similarity, get_embedding EMBEDDING_MODEL = "text-embedding-ada-002" #datafile_path = "data/AllProductReviews.csv" datafile_path = "data/test.csv" df = pd.read_csv(datafile_path) df["embedding"] = df.ReviewBody.apply(lambda x: get_embedding(x, engine=EMBEDDING_MODEL)) # convert 5-star rating to binary sentiment df = df[df.ReviewStar != 3] df["sentiment"] = df.ReviewStar.replace({1: "negative", 2: "negative", 4: "positive", 5: "positive"}) def evaluate_embeddings_approach( labels = ['negative', 'positive'], model = EMBEDDING_MODEL, ): label_embeddings = [get_embedding(label, engine=model) for label in labels] def label_score(review_embedding, label_embeddings): return cosine_similarity(review_embedding, label_embeddings[1]) - cosine_similarity(review_embedding, label_embeddings[0]) probas = df["embedding"].apply(lambda x: label_score(x, label_embeddings)) preds = probas.apply(lambda x: 'positive' if x>0 else 'negative') report = classification_report(df.sentiment, preds) print(report) display = PrecisionRecallDisplay.from_predictions(df.sentiment, probas, pos_label='positive') _ = display.ax_.set_title("2-class Precision-Recall curve") evaluate_embeddings_approach()展开
作者回复: 这个是API限速导致的,我们在第4讲里会讲解应该怎么处理。 这个思考题看来是我考虑不周了,我建议拿个100条试一下吧,全量数据可以看完第四讲之后再来,而且需要注意Token费用问题。
共 4 条评论8 - 陈敏俊2023-03-22 来自上海文本向量positive和negative标签是openai训练标注好的,那还有其他什么标签吗?只有这两种吗?
作者回复: 这不是预先训练好的标签。而是模型根据文本,计算出来的向量,我们只是利用了向量的相似度而已。 你可以用任意的单词,或者句子来做这样的功能,比如 beautiful 和 ugly,polite 和 rude 都可以试一试
共 3 条评论4 - xbc2023-03-22 来自海南后续是否会讲讲如何使用openai api实现chatpdf这样的功能。以及使用公开的弱一些的模型,来尽量实现chatpdf的功能。
作者回复: 专栏的第二部分,实战应用部分里,会大量涵盖这部分内容。 也会通过一些开源模型来降低使用的成本。
共 3 条评论4 - Geek_b7449f2023-05-06 来自美国import pandas as pd import numpy as np from sklearn.metrics import classification_report , PrecisionRecallDisplay from openai.embeddings_utils import cosine_similarity , get_embedding # 选择用于情感分析的模型 EMBEDDING_MODEL = "text-embedding-ada-002" # 设置数据集文件路径 datafile_path = "data/AllProductReviews.csv" # 读取 csv 文件 只取前60行 df = pd.read_csv(datafile_path,nrows=60) # 新增一列 embedding 用于表示获取每行的ReviewBody向量值 df["embedding"] = df.ReviewBody.apply(lambda x:get_embedding(x,engine=EMBEDDING_MODEL)) # 除去星级为3的评论来进行划分好评还是差评两个标签 df = df[df.ReviewStar != 3] df["sentiment"] = df.ReviewStar.replace({1: "negative", 2: "negative", 4: "positive", 5: "positive"}) # 函数 evaluate_embeddings_approach 默认会有两个参数 label 和 model 都有对应的默认值 def evaluate_embeddings_approach( labels = ['negative', 'positive'], model = EMBEDDING_MODEL, ): # 计算每个 label 的向量值 label_embeddings = [get_embedding(label, engine=model) for label in labels] # 辅助函数 用于计算好评和review_embedding与差评和review_embedding向量余弦值差值 def label_score(review_embedding, label_embeddings): return cosine_similarity(review_embedding, label_embeddings[1]) - cosine_similarity(review_embedding, label_embeddings[0]) # 这里更新下 embedding 列 更新成对应的 分数 probas = df["embedding"].apply(lambda x: label_score(x, label_embeddings)) # 预测值 preds = probas.apply(lambda x: 'positive' if x>0 else 'negative') # 生成一个分类报告 report = classification_report(df.sentiment, preds) print(report) # 这个就是绘制二分类的准确率-召回率曲线 display = PrecisionRecallDisplay.from_predictions(df.sentiment, probas, pos_label='positive') _ = display.ax_.set_title("2-class Precision-Recall curve") # 无参数默认值调用函数 evaluate_embeddings_approach()展开
作者回复: 👍
2 - 钱雨2023-04-04 来自河北经历了无数次下面的失败,不停重新安装pillow和matplotlib之后,终于成功了。 解决方案是狠心把miniconda、python全卸载,重新安装。 注意install openai以后,默认的pillow版本是9.4,太高了,把pillow卸载,安装8.4。 这么操作以后,新的问题是openai又没了,就把openai重新装回来。 很开心的是,pillow居然还是8.4.结果正常了。 File ~\miniconda3\envs\py310\lib\site-packages\PIL\Image.py:103 94 MAX_IMAGE_PIXELS = int(1024 * 1024 * 1024 // 4 // 3) 97 try: 98 # If the _imaging C module is not present, Pillow will not load. 99 # Note that other modules should not refer to _imaging directly; 100 # import Image and use the Image.core variable instead. 101 # Also note that Image.core is not a publicly documented interface, 102 # and should be considered private and subject to change. --> 103 from . import _imaging as core 105 if __version__ != getattr(core, "PILLOW_VERSION", None): 106 msg = ( 107 "The _imaging extension was built for another version of Pillow or PIL:\n" 108 f"Core version: {getattr(core, 'PILLOW_VERSION', None)}\n" 109 f"Pillow version: {__version__}" 110 ) ImportError: DLL load failed while importing _imaging: The specified module could not be found.展开
作者回复: python的环境的确是个问题,我看一下是否晚点能搞个Docker的Image来解决问题
共 2 条评论2 - 渣渣辉2023-04-02 来自日本为什么同样是用chatgpt的出来的结果跟老师的事例稍有不同,是因为chatgpt这个模型是在实时更新的吗
作者回复: 有两个原因 1. chatgpt的模型在实时更新,我选用的一般都不是快照的模型,而是模型最新版本。 2. 本身 GPT 输出结果是概率采样,有一定的随机性。
2