Es handelt sich um einen Dienst der NTT Group, der verschiedene APIs für die Verarbeitung natürlicher Sprache und die Sprachverarbeitung bereitstellt, z. B. Syntaxanalyse, Korrespondenzanalyse, Schlüsselwortextraktion, Spracherkennung und Zusammenfassung.
COTOHA API | API-Plattform für die Verarbeitung natürlicher Sprache und Spracherkennung unter Verwendung von Japans größtem japanischen Wörterbuch, das von NTT Communications entwickelt wurde https://api.ce-cotoha.com/contents/index.html
Einige mögen sich fragen: "Ist NTT eine Telefongesellschaft?", Aber die NTT-Labors untersuchen seit Jahrzehnten die japanische Verarbeitung auf Computern. (Als Student besuchte ich auch die NTT Communication Science Laboratories und las Papiere.)
In jüngster Zeit hat sich die Cloud-Technologie weiterentwickelt, und es ist möglich geworden, Verarbeitungen, die zuvor auf einem lokalen Computer ausgeführt wurden, als API-Dienst über das Internet bereitzustellen. Es scheint nicht bekannt zu sein, welches Unternehmen / welche Abteilung von NTT die Entwicklung der Logik selbst bereitstellt, aber es scheint, dass die API von NTT Communications bereitgestellt wird.
URL HTTP-Anfrage POST HTTP-Antwort Curl-Befehl POST JSON GSON Java Maven Es ist herum.
Die COTOHA-API-Seite enthält Folgendes:
Syntaxanalyse Die Syntaxanalyse-API empfängt einen in Japanisch geschriebenen Satz als Eingabe, analysiert und gibt die Struktur und Bedeutung des Satzes aus. Der Eingabesatz wird in Klauseln und morphologische Elemente zerlegt, und semantische Informationen wie Abhängigkeitsbeziehungen zwischen Klauseln, Abhängigkeitsbeziehungen zwischen morphologischen Elementen und Teiltextinformationen werden hinzugefügt.
"Sätze in Japanisch geschrieben (= natürliche Sätze)"
Ich bin heute zur Schule gelaufen.
Es sagt ein Satz wie. Wenn Sie dies in Sätze unterteilen
Heute / bin ich zur Schule gegangen / bin gelaufen.
Es wird so sein. (In der API heißt die Klausel chunk) Auch wenn Sie durch morphologische Einheit teilen
Heute / ha / school / ni / run / tsu / te / line / ki / better / ta /.
Es wird so sein. (In der API wird Morphologie als Token bezeichnet.) In der morphologischen Analyse wird das ursprüngliche "go" für den "line" -Teil ausgegeben, und die Teiltexte werden für jedes morphologische Element ausgegeben.
Maschinelles Lernen ist heutzutage ebenfalls sehr beliebt, aber ich denke, die Realität ist, dass es immer noch ein wenig schwierig ist, natürliche Sätze zu verarbeiten, da sie ohne morphologische Analyse und syntaktische Analyse sind oder dass keine guten Ergebnisse erzielt werden können. Selbst wenn Sie maschinelles Lernen anwenden, ist es meiner Meinung nach besser, maschinelles Lernen auf die Werte anzuwenden, die durch morphologische Analyse und syntaktische Analyse erhalten werden. Im Fall der japanischen Analyse gibt es keine Unterteilung in Japanisch, und die Reihenfolge der Wörter ist relativ frei, so dass ich denke, dass es Umstände geben kann, unter denen "einfaches maschinelles Lernen" schwierig anzuwenden ist.
Rufen wir nun die COTOHA-API auf.
Zur Vorbereitung ist der Fluss wie folgt.
Wenn Sie dem Leitfaden folgen, wird die Kontoregistrierung in 1. problemlos abgeschlossen.
Wenn Sie in 2. auf das API-Portal zugreifen, wird der folgende Bildschirm angezeigt. Notieren Sie sich dies, indem Sie die "Client-ID" und das "Client-Geheimnis" kopieren.
"Client-ID" und "Client-Geheimnis" entsprechen der Benutzer-ID und dem Kennwort. In neueren APIs ist es jedoch nicht sinnvoll, Benutzer-ID und Kennwort für jeden Zugriff zu senden. Daher zunächst "Zugriff". Es soll ein "Token" bekommen und es wiederverwenden. Die COTOHA-API hat eine maximale Frist von 24 Stunden, sodass Sie das, was Sie in der ersten Sitzung erhalten haben, 24 Stunden lang wiederverwenden können.
Es ist fast dasselbe, wenn Sie einen API-Dienst aufrufen, aber schauen Sie sich zuerst die Spezifikationen an, um herauszufinden, wie Sie darauf zugreifen können.
Zugriffstoken erhalten|Referenz| COTOHA API https://api.ce-cotoha.com/contents/reference/accesstoken.html
Wenn Sie anschauen
ist was es liest.
Es ist kein Curl-Befehlsformat ... Plötzlich ein Tippfehler!
In der IT-Branche ist es üblich zu sagen, dass die Dokumentation falsch ist. Lassen Sie sich davon nicht täuschen. (Lol) Der Code ist die Spezifikation. (← Zitate)
Aber ich verstehe was ich meine. Dies bedeutet, dass Sie eine POST-Anfrage wie die folgende im Befehl curl senden sollten.
$ curl -X POST -H "Content-Type:application/json;charset=UTF-8" -d '{"grantType":"client_credentials","clientId": "[client id]","clientSecret":"[client secret]"}' "[Access Token Publish URL]"
Geben Sie im Teil [Client-ID] [Client-Geheimnis] [URL zur Veröffentlichung von Zugriffstoken] die im Portal geschriebenen Parameter ein.
Es gibt verschiedene Möglichkeiten, HTTP-Anforderungen in Java zu senden, aber im Moment werde ich versuchen, eine Bibliothek namens OkHttp zu verwenden. Da JSON beim Senden einer Anfrage verwendet wird, wird auch der berühmte Gson verwendet.
Maven
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.14.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
Das Schreiben von Code in Java + OkHttp sieht folgendermaßen aus:
String url = "https://api.ce-cotoha.com/v1/oauth/accesstokens";
String clientId = "[client id]";
String clientSecret = "[client secret]";
// {
// "grantType": "client_credentials",
// "clientId": "[client id]",
// "clientSecret": "[client secret]"
// }
Gson gson = new Gson();
JsonObject jsonObj = new JsonObject();
jsonObj.addProperty("grantType", "client_credentials");
jsonObj.addProperty("clientId", clientId);
jsonObj.addProperty("clientSecret", clientSecret);
OkHttpClient client = new OkHttpClient();
MediaType JSON = MediaType.get("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON, jsonObj.toString());
Request request = new Request.Builder() //
.url(url) //
.post(body) //
.build();
try (Response response = client.newCall(request).execute()) {
int responseCode = response.code();
String originalResponseBody = response.body().string();
System.err.println(responseCode); // 201
System.err.println(originalResponseBody);
// 201
// {
// "access_token": "xxx",
// "token_type": "bearer",
// "expires_in": "86399" ,
// "scope": "" ,
// "issued_at": "1581590104700"
// }
}
}
Ich denke, die Ausgabe sieht wie folgt aus. Das eigentliche Zugriffstoken wird als "xxx" abgekürzt. Programmatisch ist es nicht sehr cool, aber lasst es uns kopieren und verwenden.
{
"access_token": "xxx",
"token_type": "bearer",
"expires_in": "86399" ,
"scope": "" ,
"issued_at": "1581590104700"
}
Lesen Sie Folgendes genau durch.
API-Referenzsyntaxanalyse https://api.ce-cotoha.com/contents/reference/apireference.html
... Es gibt mehrere Aufrufoptionen, aber das folgende Beispiel für einen Curl-Befehl scheint das einfachste zu sein.
$ curl -X POST -H "Content-Type:application/json;charset=UTF-8" -H "Authorization:Bearer [Access Token]" -d '{"sentence":"Der Hund geht.","type": "default"}' "[API Base URL]/nlp/v1/parse"
Der Befehl curl ist eine einfache Zeile, in Java jedoch wie folgt.
String url = "https://api.ce-cotoha.com/api/dev" + "/nlp/v1/parse";
String sentence = "Es ist heute ein gutes Wetter.";
String type = "default";
String access_token = "xxx";
Gson gson = new Gson();
JsonObject jsonObj = new JsonObject();
jsonObj.addProperty("sentence", sentence);
jsonObj.addProperty("type", type);
OkHttpClient client = new OkHttpClient();
MediaType JSON = MediaType.get("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON, jsonObj.toString());
Request request = new Request.Builder() //
.addHeader("Authorization", "Bearer " + access_token) //
.url(url) //
.post(body) //
.build();
try (Response response = client.newCall(request).execute()) {
String originalResponseBody = response.body().string();
System.err.println(originalResponseBody);
}
Was ist mit dem Ergebnis? Ich denke, es wird wie folgt aussehen.
Wenn Sie sich JSON ansehen, während Sie einen Blick auf die technischen Daten werfen, werden Informationen zu Phrasen und Morphologie sehr detailliert ausgegeben. (Die Ergebnisse sind erheblich detaillierter als die Analyseergebnisse der APIs anderer Unternehmen.)
Das Ausgabeergebnis in diesem JSON-Format wird analysiert und als Java-Objekt verwendet. Dieser Teil ist eher eine allgemeine Java-Technik als ein API-Aufruf, daher werde ich ihn im nächsten Artikel schreiben. → Fortsetzung Artikel Analyse der COTOHA-API-Syntaxanalyse mit Java
{
"result": [
{
"chunk_info": {"id": 0,"head": 2,"dep": "D","chunk_head": 0,"chunk_func": 1,
"links": []
},
"tokens": [
{
"id": 0,
"form": "heute",
"kana": "heute",
"lemma": "heute",
"pos": "Substantiv",
"features": ["Datum (und Uhrzeit"],
"dependency_labels": [
{
"token_id": 1,
"label": "case"
}
],
"attributes": {
}
},
{
"id": 1,
"form": "Ist",
"kana": "C.",
"lemma": "Ist",
"pos": "Aufeinanderfolgende Hilfswörter",
"features": [],
"attributes": {
}
}
]
},
{
"chunk_info": {
"id": 1,
"head": 2,
"dep": "D",
"chunk_head": 0,
"chunk_func": 1,
"links": []
},
"tokens": [
{
"id": 2,
"form": "ich",
"kana": "ich",
"lemma": "Gut",
"pos": "Adjektivstamm",
"features": [
"Schritt"
],
"dependency_labels": [
{
"token_id": 3,
"label": "aux"
}
],
"attributes": {
}
},
{
"id": 3,
"form": "ich",
"kana": "ich",
"lemma": "ich",
"pos": "Adjektivsuffix",
"features": [
"Union"
],
"attributes": {
}
}
]
},
{
"chunk_info": {
"id": 2,
"head": -1,
"dep": "O",
"chunk_head": 0,
"chunk_func": 1,
"links": [
{
"link": 0,
"label": "time"
},
{
"link": 1,
"label": "adjectivals"
}
],
"predicate": []
},
"tokens": [
{
"id": 4,
"form": "Wetter",
"kana": "Wetter",
"lemma": "Wetter",
"pos": "Substantiv",
"features": [],
"dependency_labels": [
{
"token_id": 0,
"label": "nmod"
},
{
"token_id": 2,
"label": "amod"
},
{
"token_id": 5,
"label": "cop"
},
{
"token_id": 6,
"label": "punct"
}
],
"attributes": {
}
},
{
"id": 5,
"form": "ist",
"kana": "Tod",
"lemma": "ist",
"pos": "Beurteilung",
"features": [
"halt"
],
"attributes": {
}
},
{
"id": 6,
"form": "。",
"kana": "",
"lemma": "。",
"pos": "Phrase",
"features": [],
"attributes": {
}
}
]
}
],
"status": 0,
"message": ""
}
Recommended Posts