Watson NLU で 機械学習ベースの分類器を作成・利用してみる (Java)


# セットアップ

Watson API 呼び出し用に用意されているライブラリを利用します。

https://github.com/watson-developer-cloud/java-sdk


```xml:pom.xml
<!-- https://mvnrepository.com/artifact/com.ibm.watson/natural-language-understanding -->
<dependency>
	<groupId>com.ibm.watson</groupId>
	<artifactId>natural-language-understanding</artifactId>
	<version>10.0.0</version>
</dependency>
```
# モデル作成用CSVファイルを用意する

以下のようなCSVファイルを用意します。UTF-8で作成します。BOM付でも問題無いようです。
１列目が例文で２列目が分類したいカテゴリです。例文は適宜用意してください。

```
テキスト1-1,CATEGORY1
テキスト1-2,CATEGORY1
テキスト1-3,CATEGORY1
テキスト1-4,CATEGORY1
テキスト1-5,CATEGORY1
テキスト1-6,CATEGORY1
テキスト1-7,CATEGORY1
テキスト1-8,CATEGORY1
テキスト1-9,CATEGORY1
テキスト2-1,CATEGORY2
テキスト2-2,CATEGORY2
テキスト2-3,CATEGORY2
テキスト2-4,CATEGORY2
テキスト2-5,CATEGORY2
テキスト2-6,CATEGORY2
テキスト2-7,CATEGORY2
テキスト2-8,CATEGORY2
テキスト2-9,CATEGORY2
テキスト2-10,CATEGORY2
```

# モデルの作成

Watson NLU の管理コンソールからAPI KEYを取得しておきます。
以下サンプルでは Config.API_KEY1 にセットしてあります。
また、APIをコールするエンドポイントのURLも管理コンソールで取得しておきます。
以下サンプルでは Config.URL_NLU1 にセットしてあります。

```java
package nlu;
import java.io.File;
import com.ibm.cloud.sdk.core.security.IamAuthenticator;
import com.ibm.watson.natural_language_understanding.v1.NaturalLanguageUnderstanding;
import com.ibm.watson.natural_language_understanding.v1.model.ClassificationsModel;
import com.ibm.watson.natural_language_understanding.v1.model.CreateClassificationsModelOptions;
/**
 * https://cloud.ibm.com/apidocs/natural-language-understanding?code=java#createclassificationsmodel
 */
public class P001CreateModel {
	public static void main(String[] args) throws Exception {
		@SuppressWarnings("deprecation")
		IamAuthenticator authenticator = new IamAuthenticator(Config.API_KEY1);
		NaturalLanguageUnderstanding naturalLanguageUnderstanding = new NaturalLanguageUnderstanding(
				"2022-04-07", authenticator);
		naturalLanguageUnderstanding.setServiceUrl(Config.URL_NLU1);
		File trainingData = new File("data/classification/model_q1.csv");
		CreateClassificationsModelOptions op = new CreateClassificationsModelOptions.Builder() //
				.description("This is test") //
				.language("ja") //
				.modelVersion("1.0.1") //
				.name("test name") //
				.trainingData(trainingData) //
				.versionDescription("test versionDescription") //
				.trainingDataContentType("text/csv") //
				.build();
		ClassificationsModel res = naturalLanguageUnderstanding
				.createClassificationsModel(op).execute().getResult();
		System.err.println(res);
	}
}
```

# モデルの一覧を取得する

作成した分類モデルの一覧や、ステータスを確認できます。
「モデルID」を取得することができるので控えておきます。

```java
package nlu;
import com.ibm.cloud.sdk.core.security.IamAuthenticator;
import com.ibm.watson.natural_language_understanding.v1.NaturalLanguageUnderstanding;
import com.ibm.watson.natural_language_understanding.v1.model.ClassificationsModelList;
/**
 * https://cloud.ibm.com/apidocs/natural-language-understanding?code=java#listclassificationsmodels
 */
public class P002ListModels {
	public static void main(String[] args) throws Exception {
		@SuppressWarnings("deprecation")
		IamAuthenticator authenticator = new IamAuthenticator(Config.API_KEY1);
		NaturalLanguageUnderstanding naturalLanguageUnderstanding = new NaturalLanguageUnderstanding(
				"2022-04-07", authenticator);
		naturalLanguageUnderstanding.setServiceUrl(Config.URL_NLU1);
		ClassificationsModelList res = naturalLanguageUnderstanding
				.listClassificationsModels().execute().getResult();
		System.err.println(res);
	}
}
```

# モデルを利用してテキストの分類を行う

```java
package nlu;
import com.ibm.cloud.sdk.core.security.IamAuthenticator;
import com.ibm.watson.natural_language_understanding.v1.NaturalLanguageUnderstanding;
import com.ibm.watson.natural_language_understanding.v1.model.AnalysisResults;
import com.ibm.watson.natural_language_understanding.v1.model.AnalyzeOptions;
import com.ibm.watson.natural_language_understanding.v1.model.ClassificationsOptions;
import com.ibm.watson.natural_language_understanding.v1.model.Features;
/**
 * https://cloud.ibm.com/apidocs/natural-language-understanding?code=java#analyze
 */
public class P004Classification {
	public static void main(String[] args) throws Exception {
		@SuppressWarnings("deprecation")
		IamAuthenticator authenticator = new IamAuthenticator(Config.API_KEY1);
		NaturalLanguageUnderstanding naturalLanguageUnderstanding = new NaturalLanguageUnderstanding(
				"2022-04-07", authenticator);
		naturalLanguageUnderstanding.setServiceUrl(Config.URL_NLU1);
		String model = "XXX";
		String text = "{分類したいテキスト}";
		ClassificationsOptions op = new ClassificationsOptions.Builder() //
				.model(model) //
				.build();
		Features features = new Features.Builder() //
				.classifications(op) //
				.build();
		AnalyzeOptions parameters = new AnalyzeOptions.Builder().text(text)
				.features(features).build();
		AnalysisResults response = naturalLanguageUnderstanding
				.analyze(parameters).execute().getResult();
		System.out.println("Input : " + text);
		System.out.println("Output: ");
		System.out.println(response);
	}
}

```

以上。

（APIレスポンスの例は後日追加予定です。。）