From 3e0566832119ee5e10ca7d96d432115ae0a19861 Mon Sep 17 00:00:00 2001 From: Noah Negrey Date: Thu, 9 Jan 2020 12:29:46 -0700 Subject: [PATCH] docs: add natural language text classification ga samples (#294) * docs: add natural language text classification ga samples * update package.json * lint fix * Update license headers * update license headers --- ...uage_text_classification_create_dataset.js | 67 +++++++++++++++++++ ...nguage_text_classification_create_model.js | 59 ++++++++++++++++ .../language_text_classification_predict.js | 64 ++++++++++++++++++ ...text_classification_create_dataset.test.js | 57 ++++++++++++++++ ...e_text_classification_create_model.test.js | 49 ++++++++++++++ ...nguage_text_classification_predict.test.js | 60 +++++++++++++++++ 6 files changed, 356 insertions(+) create mode 100644 automl/language_text_classification_create_dataset.js create mode 100644 automl/language_text_classification_create_model.js create mode 100644 automl/language_text_classification_predict.js create mode 100644 automl/test/language_text_classification_create_dataset.test.js create mode 100644 automl/test/language_text_classification_create_model.test.js create mode 100644 automl/test/language_text_classification_predict.test.js diff --git a/automl/language_text_classification_create_dataset.js b/automl/language_text_classification_create_dataset.js new file mode 100644 index 0000000000..ce0e7ce861 --- /dev/null +++ b/automl/language_text_classification_create_dataset.js @@ -0,0 +1,67 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +function main( + projectId = 'YOUR_PROJECT_ID', + location = 'us-central1', + displayName = 'YOUR_DISPLAY_NAME' +) { + // [START automl_language_text_classification_create_dataset] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'YOUR_PROJECT_ID'; + // const location = 'us-central1'; + // const displayName = 'YOUR_DISPLAY_NAME'; + + // Imports the Google Cloud AutoML library + const {AutoMlClient} = require(`@google-cloud/automl`).v1; + + // Instantiates a client + const client = new AutoMlClient(); + + async function createDataset() { + // Construct request + const request = { + parent: client.locationPath(projectId, location), + dataset: { + displayName: displayName, + textClassificationDatasetMetadata: { + classificationType: 'MULTICLASS', + }, + }, + }; + + // Create dataset + const [operation] = await client.createDataset(request); + + // Wait for operation to complete. + const [response] = await operation.promise(); + + console.log(`Dataset name: ${response.name}`); + console.log(` + Dataset id: ${ + response.name + .split('/') + [response.name.split('/').length - 1].split('\n')[0] + }`); + } + + createDataset(); + // [END automl_language_text_classification_create_dataset] +} + +main(...process.argv.slice(2)); diff --git a/automl/language_text_classification_create_model.js b/automl/language_text_classification_create_model.js new file mode 100644 index 0000000000..66a2165579 --- /dev/null +++ b/automl/language_text_classification_create_model.js @@ -0,0 +1,59 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +function main( + projectId = 'YOUR_PROJECT_ID', + location = 'us-central1', + datasetId = 'YOUR_DATASET_ID', + displayName = 'YOUR_DISPLAY_NAME' +) { + // [START automl_language_text_classification_create_model] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'YOUR_PROJECT_ID'; + // const location = 'us-central1'; + // const dataset_id = 'YOUR_DATASET_ID'; + // const displayName = 'YOUR_DISPLAY_NAME'; + + // Imports the Google Cloud AutoML library + const {AutoMlClient} = require(`@google-cloud/automl`).v1; + + // Instantiates a client + const client = new AutoMlClient(); + + async function createModel() { + // Construct request + const request = { + parent: client.locationPath(projectId, location), + model: { + displayName: displayName, + datasetId: datasetId, + textClassificationModelMetadata: {}, // Leave unset, to use the default base model + }, + }; + + // Don't wait for the LRO + const [operation] = await client.createModel(request); + console.log(`Training started... ${operation}`); + console.log(`Training operation name: ${operation.name}`); + } + + createModel(); + // [END automl_language_text_classification_create_model] +} + +main(...process.argv.slice(2)); diff --git a/automl/language_text_classification_predict.js b/automl/language_text_classification_predict.js new file mode 100644 index 0000000000..4a450d765f --- /dev/null +++ b/automl/language_text_classification_predict.js @@ -0,0 +1,64 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +function main( + projectId = 'YOUR_PROJECT_ID', + location = 'us-central1', + modelId = 'YOUR_MODEL_ID', + content = 'text to predict' +) { + // [START automl_language_text_classification_predict] + /** + * TODO(developer): Uncomment these variables before running the sample. + */ + // const projectId = 'YOUR_PROJECT_ID'; + // const location = 'us-central1'; + // const modelId = 'YOUR_MODEL_ID'; + // const content = 'text to predict' + + // Imports the Google Cloud AutoML library + const {PredictionServiceClient} = require(`@google-cloud/automl`).v1; + + // Instantiates a client + const client = new PredictionServiceClient(); + + async function predict() { + // Construct request + const request = { + name: client.modelPath(projectId, location, modelId), + payload: { + textSnippet: { + content: content, + mimeType: 'text/plain', // Types: 'test/plain', 'text/html' + }, + }, + }; + + const [response] = await client.predict(request); + + for (const annotationPayload of response.payload) { + console.log(`Predicted class name: ${annotationPayload.displayName}`); + console.log( + `Predicted class score: ${annotationPayload.classification.score}` + ); + } + } + + predict(); + // [END automl_language_text_classification_predict] +} + +main(...process.argv.slice(2)); diff --git a/automl/test/language_text_classification_create_dataset.test.js b/automl/test/language_text_classification_create_dataset.test.js new file mode 100644 index 0000000000..0467a70eec --- /dev/null +++ b/automl/test/language_text_classification_create_dataset.test.js @@ -0,0 +1,57 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {after, describe, it} = require('mocha'); +const {AutoMlClient} = require('@google-cloud/automl').v1; + +const cp = require('child_process'); +const uuid = require('uuid'); + +const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); + +const CREATE_DATASET_REGION_TAG = 'language_text_classification_create_dataset'; +const LOCATION = 'us-central1'; + +describe('Automl Natural Language Text Classification Create Dataset Test', () => { + const client = new AutoMlClient(); + let datasetId; + + it('should create a dataset', async () => { + const projectId = await client.getProjectId(); + const displayName = `test_${uuid + .v4() + .replace(/-/g, '_') + .substring(0, 26)}`; + + // create + const create_output = execSync( + `node ${CREATE_DATASET_REGION_TAG}.js ${projectId} ${LOCATION} ${displayName}` + ); + assert.match(create_output, /Dataset id:/); + + datasetId = create_output.split('Dataset id: ')[1].split('\n')[0]; + }); + + after('delete created dataset', async () => { + const projectId = await client.getProjectId(); + const request = { + name: client.datasetPath(projectId, LOCATION, datasetId), + }; + const [operation] = await client.deleteDataset(request); + await operation.promise(); + }); +}); diff --git a/automl/test/language_text_classification_create_model.test.js b/automl/test/language_text_classification_create_model.test.js new file mode 100644 index 0000000000..b4a7708db5 --- /dev/null +++ b/automl/test/language_text_classification_create_model.test.js @@ -0,0 +1,49 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {after, describe, it} = require('mocha'); +const {AutoMlClient} = require('@google-cloud/automl').v1; + +const cp = require('child_process'); + +const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); + +const CREATE_MODEL_REGION_TAG = 'language_text_classification_create_model'; +const LOCATION = 'us-central1'; +const DATASET_ID = 'TCN4742936920458264576'; + +describe('Automl Natural Language Text Classification Create Model Test', () => { + const client = new AutoMlClient(); + let operationId; + + it('should create a model', async () => { + const projectId = await client.getProjectId(); + const create_output = execSync( + `node ${CREATE_MODEL_REGION_TAG}.js ${projectId} ${LOCATION} ${DATASET_ID} classification_test_create_model` + ); + + assert.match(create_output, /Training started/); + + operationId = create_output + .split('Training operation name: ')[1] + .split('\n')[0]; + }); + + after('cancel model training', async () => { + await client.operationsClient.cancelOperation({name: operationId}); + }); +}); diff --git a/automl/test/language_text_classification_predict.test.js b/automl/test/language_text_classification_predict.test.js new file mode 100644 index 0000000000..7a86284e89 --- /dev/null +++ b/automl/test/language_text_classification_predict.test.js @@ -0,0 +1,60 @@ +// Copyright 2020 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +'use strict'; + +const {assert} = require('chai'); +const {before, describe, it} = require('mocha'); +const {AutoMlClient} = require('@google-cloud/automl').v1; + +const cp = require('child_process'); + +const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); + +const MODEL_ID = 'TCN7483069430457434112'; +const PREDICT_REGION_TAG = 'language_text_classification_predict'; +const LOCATION = 'us-central1'; + +describe('Automl Natural Language Text Classification Predict Test', () => { + const client = new AutoMlClient(); + + before('should verify the model is deployed', async () => { + const projectId = await client.getProjectId(); + const request = { + name: client.modelPath(projectId, LOCATION, MODEL_ID), + }; + + const [response] = await client.getModel(request); + if (response.deploymentState === 'UNDEPLOYED') { + const request = { + name: client.modelPath(projectId, LOCATION, MODEL_ID), + }; + + const [operation] = await client.deployModel(request); + + // Wait for operation to complete. + await operation.promise(); + } + }); + + it('should predict', async () => { + const projectId = await client.getProjectId(); + const content = "'Fruit and nut flavour'"; + + const predictOutput = execSync( + `node ${PREDICT_REGION_TAG}.js ${projectId} ${LOCATION} ${MODEL_ID} ${content}` + ); + assert.match(predictOutput, /Predicted class name/); + }); +});