はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】UnityでText Summarization APIを使って文章要約をしてみる

はじめに

今回はText Summarization APIを使って長文を要約してみる記事になります!

Text Summarization APIとは、リクルートが提供している「文章ごとの意味を分類し特徴的な文章を抽出してくれるAPI」のことです。

とある用事でこちらを使ってみたので、共有しておきたいと思います。

APIキーを取得する

このAPIを使うためにはまずユーザー登録する必要があります。

まずはこちらのリンクからAPIキーを取得してください。

a3rt.recruit-tech.co.jp

f:id:hanaaaaaachiru:20190702145640p:plain

確かメールでAPIキーが届いたはずなので、そちらをあらかじめメモ等するなどして忘れないようにしておくとよいでしょう。

コード

実際に動くコードを書いてみました。

TextSummarization
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using UnityEngine;

public static class TextSummarization
{
    private const string A3RT_URL = "https://api.a3rt.recruit-tech.co.jp/text_summarization/v1?";
    private static readonly HttpClient _httpClient = new HttpClient();

    /// <summary>
    /// テキストを要約する
    /// </summary>
    /// <param name="text">テキスト</param>
    /// <returns>要約された文</returns>
    public static string SummarySentence(string text)
    {
        if (string.IsNullOrEmpty(text)) return null;

        var content = new FormUrlEncodedContent(new Dictionary<string, string>
                {
                    {"apikey", "---------------------------------" },
                    {"sentences", text}
                });

        var task = Task.Run(() =>
        {
            return HttpPost(A3RT_URL, content);
        });

        return ExtractSentence(task.Result);
    }

    /// <summary>
    /// Jsonのデータから目的の要約文を抽出する
    /// </summary>
    /// <param name="data">Json</param>
    /// <returns>要約文</returns>
    private static string ExtractSentence(string data)
    {
        if (string.IsNullOrEmpty(data)) return null;

        NewsSummaryData newsSummaryData = JsonUtility.FromJson<NewsSummaryData>(data);

        if (newsSummaryData.status != 0)
        {
            Debug.LogWarning("A3RTという要約APIでなにかあったみたいです。右のステータスコードを以下のサイトと照らし合わせてください。ステータスコード-> " + newsSummaryData.status);
            Debug.LogWarning("https://a3rt.recruit-tech.co.jp/product/TextSummarizationAPI/");
            return null;
        }

        string text = "";
        foreach (var item in newsSummaryData.summary)
        {
            text += item;
        }

        return text;
    }


    /// <summary>
    /// パラメータ付きのHttpリクエスト
    /// </summary>
    /// <param name="url">URL</param>
    /// <param name="content">パラメータ</param>
    /// <returns>レスポンス</returns>
    private static async Task<string> HttpPost(string url, FormUrlEncodedContent content)
    {
        try
        {
            var response = await _httpClient.PostAsync(url, content);
            return await response.Content.ReadAsStringAsync();

        }
        catch(Exception e)
        {
            Debug.LogWarning(e);
            return null;
        }
    }
}

public class NewsSummaryData
{
    public int status;              //処理ステータス
    public string message;          //メッセージ
    public List<string> summary;    //抽出結果を格納した配列
}
Test
using UnityEngine;

public class Test : MonoBehaviour
{

    void Start()
    {
        var text = "私の名前ははなちると申します。最近はずっとゲームやアプリの制作が趣味です。ツイッターのフォローや読者登録を是非是非よろしくお願いします。";

        var summarizedText = TextSummarization.SummarySentence(text);

        Debug.Log(summarizedText);  //私の名前ははなちると申します
    }
}

f:id:hanaaaaaachiru:20190702152116p:plain

また自分でこれを再現する際は、TextSummaryzationクラスのSummarySentenceメソッドの中にて自分のAPIキーを打ち込むことを忘れないでください。

要約できる条件

要約できる1文の最大文字数は200文字、且つ最大文章数は10までという条件があるので注意してください。

また今回指定したパラメータ以外にも2つ追加することもできるので、詳細は公式のサイトから確認してみるとよいでしょう。

a3rt.recruit-tech.co.jp

さいごに

これでテキストの要約をすることができました。

まだたくさん試しているわけではないので何ともいえませんが、結構最初の文を拾ってくることが多い?ような印象です。

是非上手く活用してみてください。