如何对文本进行情感分析和分类(Java)

359 阅读6分钟

就像我们与朋友之间的长期关系的发展是由相互间的共鸣决定的一样,它在决定我们企业与客户关系的成功方面也起着关键作用。当客户花时间在产品或服务的评论中输入他们的想法和感受,通过社交媒体平台分享他们的感受,或通过一些类似的媒介提供反馈时,我们有责任把他们作为同胞来同情,并确定他们对他们所经历的事情的集体感受。使用程序化解决方案,我们可以快速分析,然后调整(或维持)我们提供给客户的规模化体验,有效地改善客户与我们品牌的关系。

当然,与人脑不同的是,计算机并没有被培养和社会化,无法从不断发展的人类语言中得出具体的情感结论。它们需要经过训练才能做到这一点--而这正是情感分析和分类领域发挥作用的地方。 使用 自然语言处理(NLP)技术 ,我们可以训练 机器学习算法 来分析和分类文本中的独特情感。

像许多NLP领域一样,情感分析是一个复杂的、多步骤的过程,以一套简单的分类结果为模型。为了让 分类器模型 返回一个简单的情感标签(即正面、负面或中性),它必须经过训练,从文本输入中提取特定的特征,并根据充满预设标签的数据库快速参考这些特征。要达到这一点,需要提前将无数的特征向量与它们各自的情感标签配对--这是一项详尽的任务,需要大量经过彻底审查(而且往往是同行审查)的数据。当涉及到最终创建一个分类预测时,必须应用一个统计模型来匹配输入文本和来自参考数据集的标签特征;之后,它必须根据其相对于特定主题的情感标签的平衡来确定整个句子的情感。

值得注意的是,情感分析分类的基线复杂性因人类表达中的日常不一致而加剧--其中一些是人类分析师在没有对口语中的可听线索做出自然反应或充分理解讨论背景的情况下很难原样解释的。例如,任何模型都很容易被一些语言怪癖绊倒,如讽刺(即 "哦,是的,当然,这个产品真的很棒")、断章取义的评论(即 "不值得")、断章取义的比较("这个服务比其他的好得多"),以及更多。训练一个模型来应对这些挑战,需要额外的预处理工作。

尽管情感分析是非常有益的,但与训练一个有效的模型和处理该模型准确运行所需的大量数据相关的复杂性和成本往往胜过从头创建一个新模型的动力。考虑到所涉及的劳动,纳入情感分析的最佳方式是利用现有的服务,其预测结果经过详尽的验证,并具有强大的底层基础设施。这是一个用情感分析API解决的最好的问题,它使我们能够快速地与强大的底层NLP逻辑对接,而不需要承担任何训练或长期更新模型的责任。

示范

本文的目的是为你提供一个低代码的、免费使用的情感分析和分类API。底层服务根据严格训练的参考数据库分析原始文本句子,以确定输入是积极的、消极的还是中性的(只支持英语输入)。API调用可以用一个免费的API密钥进行验证,你可以通过在Cloudmersive网站上注册一个免费账户来获得。

每个请求(格式化为"TextToAnalyze"字符串)将返回以下信息:

  1. SentimentClassificationResult - 一个字符串,描述输入的文本是正面的、负面的还是中性的
  2. SentimentScoreResult - 一个介于-1.0和+1.0之间的分类分数(浮点数);最接近零的分数被认为是中性情绪,最接近-1.0的分数被认为是负面情绪,最接近+1.0的分数被认为是正面情绪。
  3. SentenceCount - 输入文本字符串中的句子数量(整数)。

正面、中立和负面回应的例子

让我们看一下这个模型对某些文本输入的反应和分类的几个例子。

假设一个客户从一家网上商店订购并收到了一个包裹。 在该企业网站的评论部分,客户写道:

{
  "TextToAnalyze": "the package is nice"
}

情感分析API将对这句话进行这样的分类:

{
  "Successful": true,
  "SentimentClassificationResult": "Positive",
  "SentimentScoreResult": 0.42149999737739563,
  "SentenceCount": 1
}

作为对这个反应有背景的人类,我们可以很容易地验证这个结果的准确性。这句话在本质上确实是 "积极 "的,但不是压倒性的;因此,得分不超过+0.5。

让我们来处理第二个例子。这一次,顾客收到的包裹与他们预期的颜色不同,注意到:

{
  "TextToAnalyze": "the package was red, but I was expecting the color brown"
}

情感分析API将对这句话进行这样的分类:

{
  "Successful": true,
  "SentimentClassificationResult": "Neutral",
  "SentimentScoreResult": 0,
  "SentenceCount": 1
}

虽然我们可能会想把这个输入文本解读为客户的不满情绪,但模型正确地识别出没有具体的消极或积极情绪存在。如果不进一步了解这位客户的感受,我们就无法知道他们注意到的差异是好是坏--我们只能等待进一步的信息。

在最后一个例子中,让我们在前面的例子中加入第二句话,在这句话中,客户澄清了:

{
  "TextToAnalyze": "the package was red, but I was expecting the color brown. I hate the color red."
}

情感分析API的响应将对这两句话的输入进行这样的分类:

{
  "Successful": true,
  "SentimentClassificationResult": "Negative",
  "SentimentScoreResult": -0.7226999998092651,
  "SentenceCount": 2
}

正如我们所看到的,情感评分结果从0下降到-0.72,牢牢地落在 "负面 "情感类别。根据这两部分的客户反应,完全可以看出他们对这个变化非常不满,这意味着他们的不满可能值得直接解决。

当然,这些只是基本的例子--我当然鼓励你根据自己的直觉(和/或其他模型),运行尽可能多的复杂例子,并验证结果。

实施

下面,我将演示你如何安装SDK并在Java中构造你的API调用。

要安装客户端SDK,首先要在你的Maven POM文件中添加对存储库的引用(我们使用JitPack动态编译库):

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

然后再添加对依赖关系的引用:

<dependencies>
<dependency>
    <groupId>com.github.Cloudmersive</groupId>
    <artifactId>Cloudmersive.APIClient.Java</artifactId>
    <version>v4.25</version>
</dependency>
</dependencies>

安装完成后,从下面准备好的Java代码例子中复制和粘贴,以构造你的API调用。包括你的API密钥并在各自的行中配置你的文本输入:

// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.AnalyticsApi;

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");

AnalyticsApi apiInstance = new AnalyticsApi();
SentimentAnalysisRequest input = new SentimentAnalysisRequest(); // SentimentAnalysisRequest | Input sentiment analysis request
try {
    SentimentAnalysisResponse result = apiInstance.analyticsSentiment(input);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling AnalyticsApi#analyticsSentiment");
    e.printStackTrace();
}

请注意,每个请求每句都会消耗1-2个API调用,在用免费的API密钥认证时,你每月会有800个API调用的限制(没有承诺)。