Консультация № 72896
27.01.2007, 18:47
0.00 руб.
0 2 2
Добрый день, уважаемые эксперты.
Я только начинаю работать с php и часто не могу подобрать функцию..
В двух словах задача такова - добавить xml-разметку определенных слов в текстовом документе. То есть создаю из текста одномерный массив, ищу слова, переписываю строку, вставляя xml-разметку, обратно собираю массив в строку и переписываю исходный файл.
Загвоздка в том, что нельзя искать "в лоб", ведь у одного слова много форм и все надо найти. Подскажите функцию поиска в элементе массива по сочетанию букв. Пример: по сочетнию "ход" будут (должны быть) найдены элементы массива = "пароход", "проход", ходить", походами" и п.т. Важно, чтобы возвращался именно элемент массив (или его №), а не свпадение..

Спасибо!

Обсуждение

Неизвестный
28.01.2007, 00:19
общий
это ответ
Здравствуйте, Ling!
Дело в том, что для нахождения всех словоформ Вам надо прежде всего найти основу слова, а потом уже формировать всю парадигму.
Хорошая морфология не бесплатна. Из некоммерческих
проектов довольно широкое распространение получила морфология
на основе словаря Лебедева для UNIX-программы ispell подробнее <a href=http://fmg-www.cs.ucla.edu/geoff/ispell-dictionaries.html>тут</a>
Предназначение программы - проверка орфографии, поэтому,
вообще говоря, морфология на базе этого словаря сильно уступает
морфологическим модулям, специально разрабатываемых для поис-
ковых систем. Но, тем не менее, этого словаря обычно хватает. Словарь состоит из двух частей:
собственно словаря и набора правил словообразования (аффикс-
файл) подробнее <a href=http://scon155.phys.msu.ru/~swan/orthography.html>тут</a>

Ряд идей по организации поиска обсуждались на форумах
PHPClub и xpoint:
http://phpclub.ru/talk/showthread.php?s=&threadid=45100
http://xpoint.ru/archive/threads/97/19558.html
http://xpoint.ru/archive/threads/37/7492.html
http://xpoint.ru/archive/topic7/62/12482.html
Некоторые весьма интересные обсуждения, статьи и ссылки
можно найти на сайте www.searchengines.ru

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

Неизвестный
28.01.2007, 06:06
общий
это ответ
Здравствуйте, Ling!
Для поиска по массиву, также может пригодится функция:
preg_grep(pattern, input [, flags] )
она возвращает массив, состоящий из элементов входящего массива input, которые соответствуют заданному шаблону pattern.
(если установлен flag: PREG_GREP_INVERT - вернутся элементы, которые НЕ соответвуют pattern)
причем с PHP 4.0.4, результат, возвращаемый функцией preg_grep() использует те же индексы, что и массив исходных данных.

например:
$result=preg_grep(‘/ход/i‘,$words);

теперь $result - массив из элементов $words в которых есть ‘ход‘ и индексы этих элементов одинаковы в обоих массивах.

Конечно, pattern может быть не обязательно таким простым, и во многих случаях использование preg_grep будет эффективнее простого перебора всего массива.
Успехов.
Форма ответа