Искусственный интеллект. Строки, контекст и волны на Паскале. Сергей Соболенко
Читать онлайн книгу.нам не принципиально соблюдение некой константы в виде получения процента, нам важен результат, который может быть выражен некоторым абстрактным числом баллов за количество попаданий и сравним его с другими результатами.
Программное решение этой процедуры может быть следующим.
Илл. 33. Процедура сложного сравнения двух строк.
Что происходит: первоначально, мы присваиваем переменной оценки сравнения (P) исходный балл (10 000), и оцениваем разность длины строк, за что также присваиваем различный размер «шага» оценки (step). В зависимости от величины разницы длины слов (L и L2) мы вычитаем эту разницу из первоначальной оценки (P). Затем происходит процесс приведения обоих слов к одинаковым условиям, – мы считаем их равными по длине, но если одно слово оказывается короче другого, то к нему присоединяется дополнительное число пустых символов-пробелов (S4).
Далее, происходит процесс сравнения с использованием циклов, описанный выше. И в завершении, мы вычитаем исходное количество баллов из полученной оценки.
В результате работы процедуры мы получаем оценку сходства слов «эволюция» и «конституция» в 908 баллов. Если же в качестве первого слова выступит «рыба», или «аргумент», оценка снизится до 0 баллов. Слово же «конституционный» поднимет оценку до 8 880. Конечно, это абстрактное число, однако в рамках столь же абстрактных координат оно дает стабильные сравнительные показатели сходства слов на естественном языке.
Но к сожалению, применять данную процедуру к крупным фрагментам текста проблематично: разделители в виде пробелов в двух строках могут неоправданно повышать показатели сходства. Мы могли бы конечно взять и заменить их на какие-либо другие символы, но никто не гарантирует, что и эти символы не встретятся в тексте. Кроме того, сравнение множества больших фрагментов текста будет сильно замедлять программу и повышает вероятность «зависаний». Ввиду этого, самым адекватным решением может быть специализация процедуры на сравнение одиночных слов.
Теперь следует определиться, что делать в таком случае с предложениями. Для начала попробуем пилить их на слова и выводить в форме массива из отдельных слов. В таком виде обработка больших фрагментов текста значительно упрощается.
А чем разделяются слова в предложениях? Правильно, пробелами и пунктуацией. Мы приготовим универсальную процедуру, которая будет «распиливать» любое предложение на набор слов и складывать их в массив для вывода. Стратегия здесь довольно простая, – идти вдоль индекса предложения и используя маркер разделения (пробел) отделять очередное слово. При этом, мы не станем сохранять пунктуацию, – ведь она «создает шум»: в данном случае – это словарные конструкции, которых нет. Ведь фактически для программы слова «корова» и «корова,» будут двумя разными словами, разными наборами символов. Это нас не устраивает. Поэтому, помня о том, что нам еще следует обработать пунктуацию, выделим исключительно все слова в предложении. Так может выглядеть эта процедура: