Продолжение темы:"Поиск в тексте слов, отсутствующих в словаре"

Статус
Закрыто для дальнейших ответов.

Сергий Задонский

Участник
Топикстартер
Сообщения
251
Реакции
4
Скрипт, обсуждавшийся в предыдущей теме, принял окончательный вид и заработал :) .
Код:
#include Arr.jsx// словарь
Array.prototype.isElement = function (item) {

    for (var i = 0; i < this.length; i++) {
        if (this[i] == item) {
            return true;
        };
    };
    return false;
}

myDoc = app.activeDocument;
myAbsentColorSample = [100, 0, 100, 0]; //  цвет для отсутствующих в словаре слов

try{
    myColor = myDoc.colors.item("myAbsentColor");
    myName = myColor.name;
    }
catch (myError) {
    myColor = myDoc.colors.add ({name:"myAbsentColor", model:ColorModel.process, space:ColorSpace.CMYK, colorValue:myAbsentColorSample});
    }

var myPage = myDoc.pages[0];
var myTextFrame = myPage.textFrames[0];

for (j=0; j <= myTextFrame.words.length-1; j++){
    var myWord = myTextFrame.words[j];
    myWord = myWord.contents.toLowerCase().replace(/[.,!?:;]*$/, '');
   if (arr.isElement(myWord)) {continue;}
          myTextFrame.words[j].fillColor = "myAbsentColor";
        }

НО, учитывая, что словарь состоит из 114+ тыс. слов работает он неприемлемо медленно. Небольшой абзац обрабатывается порядка 10-15 минут '%)'. Очевидно, что такой алгоритм не годится. Уважаемые профессионалы, может ли кто-нибудь предложить более "шустрый" алгоритм? Итак, задача в следующем. Имеется текст, в котором вручную проставлены ударения. И есть словарь слов с ударениями. Нужен скрипт, который проверяет каждое слово текста на предмет присутствия в словаре и если его там нет, помечает цветом.
 
  • Спасибо
Реакции: Валера1966
Словарь сортированный?
Если да, то искать в нём методом половинного деления: первая буква слова по сравнению с серединой алфавита выше-ниже? Ищем в той половине словаря куда попала первая буква. Потом буква сравнивается с серединой половины алфавита, потом с четвертью. В худшем случае (слово не найдено) на вашем словаре будут десятки проверок. Вашим методом - 114 тыс. проверок на каждое отсутствующее слово.
Я не знаю js возможно в нем есть стандартные быстрые методы поиска элемента в массиве или коллекции. При отсутствии на PC я бы попробовал воспользовался объектом Scripting.Dictionary, не знаю, есть ли он на Мак'е.
 
Вашим методом - 114 тыс. проверок на каждое отсутствующее слово.
Не думаю, что все так плохо :) Ведь даже у отсутствующего слова, хотя бы первые несколько букв попадают в словарь и поиск от буквы к букве сильно сужается. А метод половинного деления - слишком сложная городуха. Мне кажется, должно быть решение проще.
 
объект надо сделать, а не массив, тогда вообще не надо ничего перебирать.


исходный массив слов
var a = ['слово1','слово2','слово3'];

а нужно
var b = {'слово1':true,'слово2':true,'слово3':true}

и все, проверяем
if(b['testword']) then {}
 
Ну как сделано, так и работает, самый большой косяк это функция isElement.
Если массив отсортировать, то необязательно будет прогонять с первого до последнего элемента.
Ну а в этом случае хэш вообще быстро сделает свое дело.
Хотя можно делить массив под длине слова / первым буквам.
 
объект надо сделать, а не массив, тогда вообще не надо ничего перебирать.


исходный массив слов
var a = ['слово1','слово2','слово3'];

а нужно
var b = {'слово1':true,'слово2':true,'слово3':true}

и все, проверяем
if(b['testword']) then {}
С объектом понял, а с проверкой не совсем, если можно, поясните поподробней, пожалуйста.
 
вместо
if (arr.isElement(myWord)) {continue;}

написать
if(myDictionaryObject[myWord]) continue;

в myDictionaryObject словарь
 
Статус
Закрыто для дальнейших ответов.