Оптимизация итерации проверки орфографии в php

Недавно начав работать над проектом, который может нуждаться в (хороших) возможностях масштабирования, у меня возник следующий вопрос:

Не принимая во внимание алгоритм Левенштейна (я работаю с/над разными вариантами), я перебираю каждое слово словаря и вычисляю расстояние Левенштейна между словом словаря и каждым из слов в моей входной строке. Что-то вроде:

<?php
$input_words = array("this", "is", "a", "test");
foreach ($dictionary_words as $dictionary_word) {
    foreach ($input_words as $input_word) {
        $ld = levenshtein($input_word, $accepted_word);
        if ($ld < $distances[$input_word] || $distances[$word] == NULL) {
            $distances[$input_word] = $ld;
            if ($ld == 0)
                continue;
        }
    }
}
?>

Мой вопрос о наилучшей практике: время выполнения составляет ~ 1-2 секунды. Я думаю о запуске «словарного сервера», который при запуске загружает словарные слова в память, а затем выполняет итерацию как часть проверки орфографии (как описано выше) при получении запроса. Уменьшит ли это время выполнения или медленная часть будет итерацией (для циклов)? Если да, то могу ли я что-нибудь сделать для правильной оптимизации?

Google "Вы имели в виду:?" не требуется несколько секунд, чтобы проверить одну и ту же строку ввода;)

Заранее спасибо и с наступающим Новым годом.


person James    schedule 28.12.2010    source источник
comment
Поскольку вы упомянули Google answers.google.com/answers/threadview?id=526503   -  person Dejan Marjanović    schedule 28.12.2010


Ответы (2)


Прочтите статью Норвига Как написать корректор правописания. Хотя в статье используется Python, другие реализовали его на PHP здесь и здесь.

person moinudin    schedule 28.12.2010
comment
Внизу есть 2 ссылки на 2 PHP-реализации - person Tom Vervoort; 28.12.2010
comment
мне удалось получить время выполнения 0,0001-0,001 на слово, взяв пример Norvig, немного подправив и оставив инициализацию для запуска (запуск скрипта python в качестве сервера, принимающего вопросы по правописанию и отвечающего с исправленной версией), так что спасибо много! - person James; 29.12.2010

Вы бы хорошо реализовали свой словарь как двоичное дерево или другую более эффективную структуру данных. Дерево значительно сократит время поиска.

person walkingTarget    schedule 28.12.2010