如何使用Java对文本进行情感分析和分类?


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

当然,与人脑不同的是,计算机并没有被培养和社会化,无法从不断发展的人类语言中得出具体的情感结论。它们需要经过训练才能做到这一点--而这正是情感分析和分类领域发挥作用的地方。  使用自然语言处理(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"
}


 Sentiment Analysis API 会像这样对这句话进行分类:

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


作为具有此响应上下文的人,我们可以轻松验证此结果的准确性。这句话在本质上确实是“积极的”,但不是压倒性的;因此,分数不超过+0.5。

让我们处理第二个例子。这一次,客户收到的包裹颜色与他们预期的不同,并指出:

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


Sentiment Analysis 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,稳稳地属于“负面”情绪类别。根据两部分的客户响应,很明显他们对更改非常不满意,这意味着他们的不满可能值得直接解决。  

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

执行
下面,我将演示如何使用Java安装 SDK 和构建 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 AnalyticsApianalyticsSentiment");
    e.printStackTrace();
}


请注意,每个请求每句话将消耗 1-2 次 API 调用,并且在使用免费层 API 密钥进行身份验证时,您每月的 API 调用限制为 800 次。