天天看點

如何對文本進行情感分析和分類(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 AnalyticsApi#analyticsSentiment");
    e.printStackTrace();
}           

請注意,每個請求每句話将消耗 1-2 次 API 調用,并且在使用免費層 API 密鑰進行身份驗證時,您每月的 API 調用限制為 800 次(無承諾)。

繼續閱讀