Я надеюсь, что все здесь в безопасности.
Мне нужно проанализировать 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");
}
}
};