From 35e85d4b2bfcae4043e82a9c7f1c3e220c4b9c15 Mon Sep 17 00:00:00 2001 From: Noah Negrey Date: Fri, 20 Dec 2019 12:26:03 -0700 Subject: [PATCH] docs: add natural language sentiment analysis ga samples (#292) * docs: add natural language sentiment analysis ga samples * update package.json * lint fix * Update license headers Co-authored-by: Benjamin E. Coe --- ...guage_sentiment_analysis_create_dataset.js | 67 +++++++++++++++++++ ...anguage_sentiment_analysis_create_model.js | 59 ++++++++++++++++ automl/language_sentiment_analysis_predict.js | 64 ++++++++++++++++++ ..._sentiment_analysis_create_dataset.test.js | 56 ++++++++++++++++ ...ge_sentiment_analysis_create_model.test.js | 48 +++++++++++++ ...anguage_sentiment_analysis_predict.test.js | 59 ++++++++++++++++ 6 files changed, 353 insertions(+) create mode 100644 automl/language_sentiment_analysis_create_dataset.js create mode 100644 automl/language_sentiment_analysis_create_model.js create mode 100644 automl/language_sentiment_analysis_predict.js create mode 100644 automl/test/language_sentiment_analysis_create_dataset.test.js create mode 100644 automl/test/language_sentiment_analysis_create_model.test.js create mode 100644 automl/test/language_sentiment_analysis_predict.test.js diff --git a/automl/language_sentiment_analysis_create_dataset.js b/automl/language_sentiment_analysis_create_dataset.js new file mode 100644 index 0000000000..0a6d3c3a85 --- /dev/null +++ b/automl/language_sentiment_analysis_create_dataset.js @@ -0,0 +1,67 @@ +// Copyright 2019 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_sentiment_analysis_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, + textSentimentDatasetMetadata: { + sentimentMax: 4, // Possible max sentiment score: 1-10 + }, + }, + }; + + // 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_sentiment_analysis_create_dataset] +} + +main(...process.argv.slice(2)); diff --git a/automl/language_sentiment_analysis_create_model.js b/automl/language_sentiment_analysis_create_model.js new file mode 100644 index 0000000000..db4a0c8d88 --- /dev/null +++ b/automl/language_sentiment_analysis_create_model.js @@ -0,0 +1,59 @@ +// Copyright 2019 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_sentiment_analysis_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, + textSentimentModelMetadata: {}, // 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_sentiment_analysis_create_model] +} + +main(...process.argv.slice(2)); diff --git a/automl/language_sentiment_analysis_predict.js b/automl/language_sentiment_analysis_predict.js new file mode 100644 index 0000000000..299c91979a --- /dev/null +++ b/automl/language_sentiment_analysis_predict.js @@ -0,0 +1,64 @@ +// Copyright 2019 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_sentiment_analysis_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 sentiment score: ${annotationPayload.textSentiment.sentiment}` + ); + } + } + + predict(); + // [END automl_language_sentiment_analysis_predict] +} + +main(...process.argv.slice(2)); diff --git a/automl/test/language_sentiment_analysis_create_dataset.test.js b/automl/test/language_sentiment_analysis_create_dataset.test.js new file mode 100644 index 0000000000..a662970572 --- /dev/null +++ b/automl/test/language_sentiment_analysis_create_dataset.test.js @@ -0,0 +1,56 @@ +// Copyright 2019 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 {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_sentiment_analysis_create_dataset'; +const LOCATION = 'us-central1'; + +describe('Automl Natural Language Sentiment Analysis 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_sentiment_analysis_create_model.test.js b/automl/test/language_sentiment_analysis_create_model.test.js new file mode 100644 index 0000000000..1589625b6d --- /dev/null +++ b/automl/test/language_sentiment_analysis_create_model.test.js @@ -0,0 +1,48 @@ +// Copyright 2019 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 {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_sentiment_analysis_create_model'; +const LOCATION = 'us-central1'; +const DATASET_ID = 'TST8765214337653538816'; + +describe('Automl Natural Language Sentiment Analysis 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} sentiment_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_sentiment_analysis_predict.test.js b/automl/test/language_sentiment_analysis_predict.test.js new file mode 100644 index 0000000000..8a0ed9525b --- /dev/null +++ b/automl/test/language_sentiment_analysis_predict.test.js @@ -0,0 +1,59 @@ +// Copyright 2019 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 {AutoMlClient} = require('@google-cloud/automl').v1; + +const cp = require('child_process'); + +const execSync = cmd => cp.execSync(cmd, {encoding: 'utf-8'}); + +const PREDICT_REGION_TAG = 'language_sentiment_analysis_predict'; +const LOCATION = 'us-central1'; +const MODEL_ID = 'TST3171435737203605504'; + +describe('Automl Natural Language Sentiment Analysis 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 = "'Hopefully this Claritin kicks in soon'"; + + const predictOutput = execSync( + `node ${PREDICT_REGION_TAG}.js ${projectId} ${LOCATION} ${MODEL_ID} ${content}` + ); + assert.match(predictOutput, /Predicted sentiment score/); + }); +});