Скрипт, который найдет и отметит те же слова в абзаце - PullRequest
0 голосов
/ 17 июня 2019

Я писатель-фантаст, и я писал в MS Word.Я написал несколько макросов, чтобы помочь мне отредактировать художественный текст, и один из них проверил абзац и пометил (красным) дубликат (или трижды слова и т. Д.).Пример:

"I came **home**. And while at **home** I did this and that."

Слово "дом" используется дважды и стоит проверить, действительно ли я не могу изменить предложение.

Сейчас я в основном использую документы Google для записи, но у меня все еще естьвыполнять редактирование в MS Word, в основном из-за этого макроса - я не могу запрограммировать его в скрипте Google.

function PobarvajBesede() {
    var doc = DocumentApp.getActiveDocument();
    var cursor = DocumentApp.getActiveDocument().getCursor();
    var surroundingText = cursor.getSurroundingText().getText();
    var WordsString = WORDS(surroundingText);
    Logger.log(WordsString);
//so far, so good. But this doesn't work:
    var SortedWordsString =  SORT(WordsString[1],1,False);
// and I'm lost.
}

function WORDS(input) {
  var input = input.toString();
  var inputSplit = input.split(" ");
//  Logger.log(inputSplit);
  inputSplit = inputSplit.toString();

  var punctuationless = inputSplit.replace(/[.,\/#!$%\?^&\*;:{}=\-_`~()]/g," ");
  var finalString = punctuationless.replace(/\s{2,}/g," ");
  finalString = finalString.toLowerCase();
  return finalString.split(" ") ;
}

Если бы я мог получить только список слов (в верхнем регистре, длиннее 3 символов), отсортированный по количеству их появлений в регистраторе, это помогло бы мнеЛот:

HOME (2)
AND (1)
...

Спасибо.

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Это сочетание ответа TheMaster и некоторых моих работ. Мне нужно больше узнать о том, как он это сделал, поэтому я потратил немного времени на обучение сегодня. Эта функция устраняет некоторые проблемы с возвратом каретки, а также удаляет элементы, которые появляются только один раз. Вероятно, вам следует выбрать решение TheMasters, так как я не смог бы сделать это без его работы.

function getDuplicateWords() {
  var str=DocumentApp.getActiveDocument().getBody().getText(); 
  var countObj = str
  .toUpperCase()
  .replace(/\n/g,' ')
  .replace(/[^A-Z ]/g, '')
  .split(' ')
  .reduce(function(obj, word) {
    if (word.length >= 2) {
      obj[word] = obj[word] ? ++obj[word] : 1;
    }
    return obj;
  }, {}); 
  var oA=Object.keys(countObj).map(function(word){return [word, countObj[word]];}).filter(function(elem){return elem[1]>1;}).sort(function(a,b){return b[1]-a[1]});
  var userInterface=HtmlService.createHtmlOutput(oA.join("<br />"));
  DocumentApp.getUi().showSidebar(userInterface);
}

function onOpen() {
  DocumentApp.getUi().createMenu('MyMenu')
  .addItem('Get Duplicates','getDuplicateWords' )
  .addToUi();
}

И да, у меня были проблемы с изменением результатов в моем последнем решении.

0 голосов
/ 17 июня 2019

Поток:

  • Преобразовать строку в верхний регистр и очистить строку от всех не ascii символов
  • После разбиения строки на массив слов уменьшите массив до объекта слова: count
  • Отобразить уменьшенный объект в двумерный массив [[word,count of this word],[..],...] и отсортировать массив по количеству внутреннего массива.

Отрывок:

function wordCount(str) {
  str = str || 'I came **home**. And while at **home** I did this and that.';
  var countObj = str
.toUpperCase() //'I CAME **HOME**...'
.replace(/[^A-Z ]/g, '') //'I CAME HOME...'
.split(' ') //['I', 'CAME',..]
.reduce(function(obj, word) {
  if (word.length >= 3) {
    obj[word] = obj[word] ? ++obj[word] : 1;
  }
  return obj;
}, {}); //{HOME:2,DID:1}

  return Object.keys(countObj)
.map(function(word) {
  return [word, countObj[word]];
}) //[['HOME',2],['CAME',1],...]
.sort(function(a, b) {
  return b[1] - a[1];
});
}
console.info(wordCount());

Читать и практиковаться:

...