проверка сходства строк в листах Google с помощью скрипта приложений Google (средство обновления орфографии) - PullRequest
0 голосов
/ 15 октября 2018

Я пишу программу, которая:

  • выполняет итерации в диапазоне
  • сравнивает каждую текущую ячейку со строкой (строка является правильно написанным словом. Thisпредполагает, что каждое новое слово написано правильно)
  • обновляет текущую ячейку, чтобы соответствовать строке, если она похожа (> = установленный процент)

важное примечание: Это предназначено для итерации по диапазону в одном столбце, и в настоящее время у меня нет необходимости повторять по нескольким столбцам.

Программа в настоящее время находится в рабочем состоянии, но у нее много проблем с длинными строками, иЯ не могу понять, почему.Я хотел посмотреть, может ли кто-нибудь указать мне правильное направление.

Цель этой программы:

В настоящее время я застрял, работая с грязными данными из импорта OCR, которыйбыло нежелательно.

многие мои повторяющиеся значения написаны с ошибками (и не для проверки правописания)

например:

  • тестирование
  • t3st1ng
  • t3-й 1 г
  • tes5fng
  • te5f1n @
  • бананы
  • 3abanas
  • benAnes
  • 8n4anans

исправляется как:

  • проверка
  • проверка
  • тестирование
  • тестирование
  • тестирование
  • бананы
  • бананы
  • бананы
  • бананы

Я делаю все эти значения равными первому значению.Когда он попадает в бананы, он использует бананы в качестве нового первого значения.Я надеюсь, что это имеет смысл.

Программа отлично работает, используя этот первый пример

НО

Проблема в том, что у меня есть строки, подобные этой:

  • это тест системы аварийного вещания
  • это тест аварийного вещания r @ io system
  • th1s это тест Emerg3ncyсистема радиовещания
  • система радиовещания в чрезвычайных ситуациях сейчас тестирует
  • система радиосвязи аварийного вещания br0adcast в настоящее время
  • система вещания в чрезвычайных ситуациях [st adio sysfm сейчас тестирует
  • пожалуйста, не пугайтесь, так как это всего лишь тест
  • , пожалуйста, не пугайтесь, так как это всего лишь 2 теста
  • пожалуйста, не будьте @ larm3d, как этотолько лучший
  • и теперь вернемся к вашему регулярному программированию
  • и теперь 8ack к вашей регулярной программе ming
  • и теперь 8ack к вашему регулярному программированию re @ flarly

исправленоs:

  • это тест системы радиовещания в чрезвычайных ситуациях
  • это тест системы радиовещания в чрезвычайных ситуациях
  • это тестсистемы радиовещания в чрезвычайных ситуациях
  • это испытание системы радиовещания в чрезвычайных ситуациях
  • это испытание системы радиовещания в чрезвычайных ситуациях
  • это испытание системы радиосвязи в чрезвычайных ситуацияхсистема радиовещания в чрезвычайных ситуациях
  • это тест системы радиовещания в чрезвычайных ситуациях
  • это проверка системы радиовещания в чрезвычайных ситуациях
  • это проверка системы радиовещания в чрезвычайных ситуацияхрадиосистема
  • это тест системы радиовещания в чрезвычайных ситуациях
  • это тест радиосистемы аварийного вещания
  • это тест системы радиовещания в чрезвычайных ситуациях

Вот моя программа.

function repairDuplicates() {
  try {

    // necessities
    var ui = SpreadsheetApp.getUi();
    var ss = SpreadsheetApp.getActiveSpreadsheet();
    var as = ss.getActiveSheet();


    var sr = as.getDataRange();   // entire sheet range
    var ar = as.getActiveRange(); // active range

    var srv = sr.getValues(); // values of entire sheet
    var arv = ar.getValues(); // values of active range

    function minify(x){ // take a string. trim, remove all white space, convert to array, capitalize, remove special characters
      var txt = x.trim();
      txt = txt.replace(/ /g, '');
      var arr = txt.split('');
      arr = arr.map(function(a){return a.toUpperCase()});
      var std = arr.sort();
      var reg = new RegExp(/\W{1}/);
      for (var z = 0; z < std.length; z++){
        if (reg.exec(std[z]) != null){
          std.splice(z,1);
        }
      }
      return std;
    }


    function compareLength(x,y){ //take two arrays and compare length. if the length is different, then make it the same length by adding "x" n number of times. this will modify the arrays
      var xl = x.length;
      var yl = y.length;
      if (xl < yl){
        for (xl; xl < yl; xl++){
          x.push("x");
        }
      }
      else if (yl < xl){
        for (yl; yl < xl; yl++){
          y.push("x");
        }
      }
    }

    function compareData(x,y){ //take two arrays and compare data. if the arrays match, return "match". else if the arrays are more than (50)% similar, return "pass". else, return "fail"
      var z = [];
      var result;
      if (x.toString() == y.toString()){
        result = "match";
      }
      else if (x.toString() != y.toString()){
        var z = y.filter(function (word) {
          return x.indexOf(word) != -1;
        });

        //ui.alert(x);
        //ui.alert(x.length);
        //ui.alert(z);
        //ui.alert(z.length);

        var score = z.length/x.length;

        if(score > 0.5){
          result = "pass";
        }
        else{
          result = "fail";
        }
      }
      return result;
    }

//    function checkFirst(r, c, x, y){ // deprecated. no need to verify first cell
//      if(r == 0 && c == 0){
//        x = y;
//      }
//      return x;
//    }


    function iterate(range, values, text){ // takes a data range, the values of the range, and a string. 
                                           // iterates over range data (row by row, and cell by cell in each row).
                                           // each current cell is checked and compared against the string.
                                           // if the current cell passes the similarity check (compareData), then make the current cell equal to the previous cell
                                           // if the current cell fails the similarity check, then do not change the value of the cell, but make the string(text) equal to the current cell
      for (var r = 0; r < values.length; r++) {
        var row = values[r];
        for (var c = 0; c < row.length; c++) {
          var cell = row[c];
          //ui.alert("using: " + text);
          //ui.alert(cell);
          var arr = minify(cell);
          var minTxt = minify(text);
          compareLength(minTxt, arr);
          var t = compareData(minTxt, arr);
          //ui.alert(cell + ": " + t)
          if (t == "pass"){
            values[r][c] = text;
          }
          else if (t == "fail"){
            ui.alert("\"" + text + "\"" + "\n \n" +"does not match" + "\n \n" + "\"" + cell + "\"" +  " on row number " + (r + 2) + "..." + "\n \n" + "\"" + cell + "\"" + " is the new comparison string");
            text = cell;
          }
        }
      }
      range.setValues(values);
    }



    // main loop
    var txt = ar.getValue();
    //ui.alert(txt);
    iterate(ar, arv, txt);


  }
  catch (err) {
    ui.alert(err);
  }
}

, а вот ссылка на лист, который я тестирую на .

Вещи, которые я пробовал:

  • корректировка процентной доли подобия.настройка его на 70-90% дает лучшие результаты ... но все же не совсем точные.
  • отключение сравнения Длины.получил точно такой же удивительный результат

Теории:

  • это определенно сработало бы лучше, если бы я мог использовать «include» вместо «indexOf», но, насколько мне известно, скрипт приложений Google не поддерживает ES6

Спасибо за любыепомощь!

...