人工智能技术的迅速发展使得自然语言处理成为了一个备受关注的热门领域。大型语言模型的出现,为传统的自然语言处理问题提供了全新的解决方案。然而,这些模型的庞大和复杂常常让人望而生畏。本文将介绍如何使用ChatGPT等大语言模型(LLM)的简单接口来解决传统自然语言处理问题。我们将以情感分析为例,探究LLM在自然语言处理中的应用。
大型语言模型的接口非常简单,例如OpenAI提供的Complete和Embedding两个接口。Complete可以自动续写你的输入,Embedding可以将输入转化为向量。但是,可能会有疑问,用这么简单的接口能够解决传统的自然语言处理问题吗?比如情感分析、文本分类、文章聚类、摘要撰写、搜索等问题。接下来,我会告诉你如何利用大语言模型的这两个简单的API来解决这些问题。首先,我们将从情感分析问题开始,来看看如何使用。
传统的二分类方法
传统的情感分析解决方案是将其视为一个二分类问题。先对一部分评论数据进行人工标注,然后将其用来训练一个机器学习模型,从而预测剩余评论数据的情感分析结果。常用的机器学习算法包括朴素贝叶斯和逻辑回归。这些算法的基本原理是计算单词与好评和差评之间的条件概率。例如,朴素贝叶斯算法就是通过统计每个单词在好评和差评中出现的概率来进行垃圾邮件分类。这些传统解决方案已经被广泛应用于互联网产品中,例如大众点评和京东。
传统方法的挑战:特征工程与模型调参
传统的情感分析方法存在两个挑战:特征工程和模型调参。特征工程是指通过设计更多的特征来提高模型的性能。在自然语言处理中,单纯的考虑单个词语的出现概率可能不足以解决问题。例如,“这家餐馆太糟糕了,一点都不好吃”和“这家餐馆太好吃了,一点都不糟糕”这两句话从意义上是完全相反的,但是它们包含的词语是相同的。为了解决这个问题,我们可以使用2-Gram和3-Gram来考虑前后相邻词语的组合。此外,特征工程还包括去除停用词、对低频词进行处理和使用TF-IDF等统计特征。但是这些特征工程的方法需要大量的经验和文本处理代码。
除了特征工程,模型调参也是需要经验和技巧的。模型调参包括将数据集分成训练、验证和测试集,使用AUC或混淆矩阵来衡量模型性能,以及使用K-Fold等技术来提高训练效果的稳定性。如果你没有机器学习的背景知识,这些技术可能会让你感到困惑。
大语言模型:20 行代码的情感分析解决方案
使用大型语言模型进行情感分析的最简单方法是利用其提供的 Embedding API。我们可以将评论文本转换为大语言模型下的向量,并计算其与“好评”和“差评”向量之间的余弦相似度。然后,通过将两者之间的相似度进行相减,得到一个分数来判断评论的情感倾向。以下是一个使用 OpenAI 的 Embedding API 进行情感分析的简单示例代码:
import openai
import os
from openai.embeddings_utils import cosine_similarity, get_embedding
# 设置 OpenAI API 密钥
openai.api_key = os.getenv("OPENAI_API_KEY")
# 选择使用最小的 ada 模型
EMBEDDING_MODEL = "text-embedding-ada-002"
# 获取“好评”和“差评”的 Embedding
positive_review = get_embedding("好评")
negative_review = get_embedding("差评")
# 获取样例评论的 Embedding
positive_example = get_embedding("买的银色版真的很好看,一天就到了,晚上就开始拿起来完系统很丝滑流畅,做工扎实,手感细腻,很精致哦苹果一如既往的好品质")
negative_example = get_embedding("降价厉害,保价不合理,不推荐")
def get_score(sample_embedding):
# 计算样例评论与“好评”之间的相似度减去与“差评”之间的相似度,得到情感倾向分数
return cosine_similarity(sample_embedding, positive_review) - cosine_similarity(sample_embedding, negative_review)
# 输出样例评论的情感倾向分数
print("Positive example score:", get_score(positive_example))
print("Negative example score:", get_score(negative_example))
输出结果:
好评例子的评分 : 0.070963
差评例子的评分 : -0.081472
京东上的好评通过 Embedding 相似度计算得到的分数是大于 0 的,京东上面的差评,这个分数是小于 0 的。这样的方法,是不是特别简单?
这样的方法,是不是特别简单?我们再拿刚才的例子试一下,看看这个方法是不是对所有词语都管用,只是出现的位置不同但含义截然相反的评论,能得到什么样的结果。
good_restraurant = get_embedding("这家餐馆太好吃了,一点都不糟糕")
bad_restraurant = get_embedding("这家餐馆太糟糕了,一点都不好吃")
good_score = get_score(good_restraurant)
bad_score = get_score(bad_restraurant)
print("好评餐馆的评分 : %f" % (good_score))
print("差评餐馆的评分 : %f" % (bad_score))
输出结果:
好评餐馆的评分 : 0.062719
差评餐馆的评分 : -0.074591
可以看到,虽然两句话分别是“太好吃”“不糟糕”和“太糟糕”“不好吃”,其实词语都一样,但是大语言模型一样能够帮助我们判断出来他们的含义是不同的,一个更接近好评,一个更接近差评。
总结
通过这个方法,我们利用不同文本在大语言模型里 Embedding 之间的距离,可以快速对文本进行情感分析,而不需要进行繁琐的特征工程和模型调参。这让一些原本需要机器学习研发经验才能完成的任务变得更加容易,从而大大降低了门槛