Получение определенных типов объектов с использованием GCP в Google Sheets - PullRequest
0 голосов
/ 21 апреля 2020

Я надеюсь, что все здесь в безопасности.

Мне нужно проанализировать 4000 интервью, в среднем по 150 строк в каждом интервью. Сущности должны быть получены из каждого интервью. Следующий код хорошо справляется с поиском сущностей, типа сущности, настроения сущности и количества упоминаний этой сущности из текста.

Все работает хорошо, за исключением того, что код перестает работать после 6-го интервью, и я получаю сообщение об ошибке «Превышено максимальное время выполнения». Чтобы уменьшить нагрузку и время, я подумал об ограничении типа объекта только организациями, людьми и потребительскими товарами. Я не могу понять, как отфильтровать только эти три типа сущностей.

Буду признателен, если кто-нибудь поможет мне здесь. Кроме того, если у вас есть какие-либо комментарии относительно текущего кода, я был бы очень рад услышать это. Спасибо всем!

var COLUMN_NAME = {


  CEOINT: 'CEO_Interview',
  ENTITY: 'entity_sentiment',
  ID: 'ID'
};

/**
 * Creates a ML Tools menu in Google Spreadsheets.
 */
function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('ML Tools')
    .addItem('Mark Entities and Sentiment', 'markEntitySentiment')
    .addToUi();
};

/**
* For each row in the reviewData sheet with a value in "CEOINT" field, 
* will run the retrieveEntitySentiment function
* and copy results into the entitySentiment sheet.
*/

function markEntitySentiment() {
  // set variables for reviewData sheet
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var dataSheet = ss.getSheetByName('reviewData');
  var rows = dataSheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();
  var headerRow = values[0];

  // checks to see if entitySentiment sheet is present; if not, creates new sheet and sets header row
  var entitySheet = ss.getSheetByName('entitySentiment');
  if (entitySheet == null) {
   ss.insertSheet('entitySentiment');
   var entitySheet = ss.getSheetByName('entitySentiment');
   var esHeaderRange = entitySheet.getRange(1,1,1,5);
   var esHeader = [['Review ID','Entity','Entity Type','Sentiment Score','Number of mentions']];
   esHeaderRange.setValues(esHeader);
  };

  // find the column index for CEO Interviews


  var CEOINTColumnIdx = headerRow.indexOf(COLUMN_NAME.CEOINT);
  var entityColumnIdx = headerRow.indexOf(COLUMN_NAME.ENTITY);
  var idColumnIdx = headerRow.indexOf(COLUMN_NAME.ID);
  if (entityColumnIdx == -1) {
    Browser.msgBox("Error: Could not find the column named " + COLUMN_NAME.ENTITY + ". Please create an empty column with header \"entity_sentiment\" on the reviewData tab.");
    return; // bail
  };


  ss.toast("Analyzing entities and sentiment...");
  // Process each row 
  for (var i = 0; i < numRows; ++i) {
    var value = values[i];
var ceointCellVal = value[CEOINTColumnIdx];
var entityCellVal = value[entityColumnIdx];
var reviewId = value[idColumnIdx];

// Call retrieveEntitySentiment function for each row that has comments and also an empty entity_sentiment cell
if(ceointCellVal && !entityCellVal) {
    var nlData = retrieveEntitySentiment(ceointCellVal);
    // Paste each entity and sentiment score into entitySentiment sheet
    for (var j = 0; j < nlData.entities.length; ++j) {  
      var entityInResponse = nlData.entities[j];
      var lastRowIdx = entitySheet.getLastRow() + 1;
      var newValues = [[reviewId, entityInResponse.name, entityInResponse.type, entityInResponse.sentiment.score, entityInResponse.mentions.length]];
      var pastingRange = entitySheet.getRange(lastRowIdx,1,1,5);
      pastingRange.setValues(newValues);
        }
        // Paste "complete" into entity_sentiment column to denote completion of NL API call
        dataSheet.getRange(i+1, entityColumnIdx+1).setValue("complete");
     }
   }
};
...