WedX - журнал о программировании и компьютерных науках

Как я могу распараллелить проверку орфографии с помощью Delphi?

У меня есть что-то вроде проверки орфографии, написанной на Delphi. Он анализирует текст предложение за предложением. Он окрашивает неправильные элементы в соответствии с некоторыми правилами после разбора каждого предложения. Пользователь может прервать этот процесс, что важно. Как я могу распараллелить этот процесс в целом, используя некоторые сторонние библиотеки Delphi? В текущем состоянии у меня есть окраска предложения на лету после проверки. Таким образом пользователь видит прогресс.


  • Обратите внимание, что вопрос о том, как распараллелить это, не зависит (или должен быть) от какой-либо сторонней библиотеки. Сначала вам нужна стратегия, затем вы можете решить, какие инструменты использовать для ее реализации. 15.06.2012
  • Хорошо, тогда мне нужен пример такой стратегии. Конкретные средства (например, прямое создание потоков или их использование через стороннюю библиотеку) менее важны. 15.06.2012
  • Зачем вам нужно распараллеливать отображение проверки орфографии, которая охватывает один экран? 15.06.2012
  • Если вы все еще хотите сделать это многопоточным (после прочтения действительного вопроса Дэвида) и вы новичок в многопоточности, не сворачивайте свои собственные. Используйте библиотеку OmnithreadLibrary (OTL). 15.06.2012
  • Параллелизм не решает проблему медлительности. Вы должны оптимизировать алгоритм, потому что он непригоден, если пользователю приходится слишком долго ждать. 15.06.2012
  • Одна важная вещь, пожалуйста, уточните, должна ли проверка орфографии вызываться при изменении текста или по команде пользователя. 15.06.2012
  • @LU RD: он будет перепроверять только предложение, в котором произошло изменение. Если у нас есть 100 предложений и ПК с 2 ядрами, то это будет нормально, если прибл. 50 предложений будут проверяться одним ядром, а остальные — другим. 15.06.2012
  • @hubalu Я тоже пытаюсь найти и устранить узкие места. Но будет круто, если у меня будет ускорение 1,7х для ПК с 2 ядрами, например. 15.06.2012
  • @David Heffernan: проверка орфографии является подзадачей, также проверяется грамматика. Это своего рода анализатор предложений. 15.06.2012

Ответы:


1

Алгоритм будет таким:

  • Создайте несколько рабочих.
  • Создайте проверку правописания в каждом воркере.
  • Возьмите текст и разделите его на рабочие единицы (слова или предложения). Каждая единица работы должна сопровождаться указанием местоположения в исходном тексте.
  • Отправка рабочих единиц рабочим. Хорошим подходом является отправка данных в общую очередь, из которой рабочие берут единицы работы. Очередь должна либо поддерживать несколько считывателей, либо вы должны использовать блокировку для доступа к ней.
  • Each worker takes a work unit, runs a spell-check and returns the result (together with the location in the original text) to the owner.
    • The simplest way to return a result is to send a message to the main thread.
    • В качестве альтернативы вы можете записать результаты в очередь результатов (которая должна либо использовать блокировку, либо поддерживать несколько модулей записи), а затем приложение может опрашивать эти результаты (либо с помощью таймера, либо с помощью обработчика OnIdle).

Другая проблема заключается в том, как несколько программ проверки орфографии будут получать доступ к словарю. Вы можете загрузить копию словаря в каждый воркер или защитить доступ к словарю блокировкой (но это замедлит работу). Если вам повезет, словарь является потокобезопасным для чтения, и вы можете выполнять одновременные запросы без блокировки.

Подходящей абстракцией OmniThreadLibrary для решения проблемы может быть либо ParallelTask или BackgroundWorker.

15.06.2012
  • Разве словарь не будет доступен только для чтения и не требует блокировки? 15.06.2012
  • Еще один момент: возможно, вы могли бы добавить некоторую информацию о том, как вернуть результаты обратно в пользовательский интерфейс. Это сделало бы ответ еще лучше. 15.06.2012
  • Smasher, да, ты прав, но я понятия не имею, как работает его проверка орфографии. 15.06.2012
  • Словарь доступен только для чтения. На самом деле инструмент не является примитивной проверкой орфографии, но также использует словарь. Этот инструмент проверяет специализированную грамматику, поэтому он работает в контексте предложений. 15.06.2012
  • @gabr OmniThreadLibrary поддерживает Delphi с версии 2007 года. Но я должен использовать древнюю Delphi 7. Какая разница между 7 и 2007 в отношении этой библиотеки без графического интерфейса? 15.06.2012
  • OTL не будет работать в Delphi 7, поскольку он использует некоторые языковые инструменты, недоступные в D7 (интеллектуальные записи, т. е. записи с функциями). Вам придется использовать TThread. 15.06.2012
  • Отличный ответ. Разделяй и властвуй, короче. 15.06.2012

  • 2

    Для распараллеливания достаточно создать новый класс-потомок от TThread, создать из него объект, отдать часть задания новому потоку, запустить Execute и собрать результаты в основном потоке.

    Так:

    TMySpellChecker = class(TThread)
    protected
      FText: String;
      FResult: String; 
    public
      procedure Execute; override;
      property Text: String read FText write FText;
      property Result: String read FResult write FResult;
    end;
    
    TMySpellChecker.Execute;
    begin
      // Analyze the text, and compute the result
    end;
    

    В основной теме:

    NewThread := TMySpellChecker.Create(True); // Create suspended
    NewThread.Text := TextSegment;
    NewThread.Execute;
    

    Затем объект потока будет выполнять анализ в фоновом режиме, в то время как основной поток продолжает работать.

    Для обработки результатов необходимо назначить обработчик событию OnTerminate объекта потока:

    NewThread.OnTerminate := HandleMySpellCheckerTerminate;
    

    Это необходимо сделать до того, как вы запустите Execute для объекта потока.

    Чтобы допустить прерывание, одна из возможностей состоит в том, чтобы разбить основной текст на сегменты, поместить сегменты в список в основном потоке, а затем проанализировать сегменты один за другим, используя объект потока. Затем вы можете разрешить перерывы между каждым запуском.

    15.06.2012
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]