Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > проверки орфографии


Автор: mclight 5.4.2007, 09:41
Здравствуйте.
на сайте есть :
1) форма поиска........
2) определенное кол-во того что может ввести пользователь. 

Надо сделать так, чтобы при неправильном вводе......пользователю выводилось сообщение, что-то наподобие Гугловского "Возможно, вы имели в виду: фывафываф"........

да....чуть не забыл....надо сделать так чтобы скрипт в случае неудачи попробовал поискать в перечне слов( их примерно 228 ).......и выдал бы пользователю наиболее похожий результат.........


 ! 
PARROT
Не стоит плодить посты, надо было просто отредактировать свое первое сообщение.

Автор: PARROT 5.4.2007, 12:12
А поиск? http://www.opennet.ru/base/dev/spell_check.txt.html 
Другое дело проверить, будет ли оно работать, это уже другой вопрос

Добавлено через 5 минут и 1 секунду
http://ru2.php.net/manual/ru/ref.pspell.php
внизу примеры

Автор: PARROT 5.4.2007, 12:29
http://dklab.ru/chicken/nablas/24.html
http://imtranslator.net/speller.asp

Автор: mclight 6.4.2007, 07:41
конечно спасибо....но ничего не подходит.......

Автор: The Thing 9.4.2007, 14:20
Так а в чем проблема-то?

Автор: mclight 11.4.2007, 08:20
проблема в след........есть определенное кол-во глав....каждая из которых имеет свое название.......
пользователь делает поиск по главам......
пользователь выбирает главу и делает поиск......все работает отлично......
но недавно решил переделать скрипт и сделать так чтоб пользователь сам вводил название главы......

так вот......хочу сделать так чтоб при неправильном написании, скрипт выводил нечто подобное, типа 
"Возможно, Вы имели ввиду <aasdfasf>"

Автор: artfabrique 15.4.2007, 16:00
эта технология очень дорогая и дико грузит БД.
Ты имеешь в виду поиск с учетом морфологии русского языка.
ключевые слова для поиска iSpell + PHP
но сразу говорю что мучится ты будешь очень долго.
Мускуль не тянет некоторые запросы а если HEAP таблица во время запроса слишком большая то ваще он не будет её обрабатывать и записывать. зато на Оракле пашет и на Постаж тоже кле как.
Есть вариант делать для самых новых версий Мускуля. там есть встроенные процедуры.

а у гугля подумай какие мощьности? =))

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

Автор: mclight 16.4.2007, 07:00
Цитата(artfabrique @  15.4.2007,  18:00 Найти цитируемый пост)
Ты имеешь в виду поиск с учетом морфологии русского языка.

нет......названий глав всего 114...а поиск хочу по названиям глав......поэтому не так уж и много

Автор: artfabrique 16.4.2007, 08:41
а ну тогда все проще как я выше написал с помощью LIKE запросов к БД.
Если не в БД хранишь, то регулярками проверяй preg_match_all тебя спасёт.
а ещё круче можно это сделать либа на AJAX либо просто в тупую на JavaScript.
Ну как на этом форуме сделано, когда новую тему создаешь и вводишь Заголовок то ниже тебе по мере того как печатаешь выводится список тем "возможно" подходящих твоему вопросу.
Можешь поискать этот модуль к IPB и позырить изнутри как оно сделано..

Маза кстати.. перед юзером список тем длинющий и помере того как он вводит слово список сокращается.

Если глав немного (140) тогда можно и без аджакса обойтись..
просто с помощью пхп будешь генерить яваскриптовый массив глав и по мере написания слова будешь пробегать по нему яваскриптом и регулярками.

точно! ща модуль такой для CMS напишу своей =))

Автор: mclight 16.4.2007, 09:00
опишу проблему в примере....

1. Открывающая Книгу
2. Корова
...
113. Рассвет
114. Люди

если пользователь введет "Расвет", то вывести ему сообщение....типа 
Код

Возможно Вы имели ввиду "Рассвет"



Автор: artfabrique 17.4.2007, 05:55
ну да! я так и написал или что-то не понятно?

Автор: mclight 18.4.2007, 09:04
т.е. ты советуешь через явяскрипт делать?

все равно не понятно..... smile 

Автор: artfabrique 20.4.2007, 14:20
я код писать не буду, так как задвая подобный вопрос изначально предпологается что ты знаком с яваскриптом и php

1)вариант 1 - сделать только с помошью яваскрипта:

с помощью php генерируешь яваскриптовый массив
и выдаешь его браузеру.
$chArray - тут php массив имен глав

Код

$chapters = "<script languge=\"javascript\" type =\"text\javascript\">
chapters = new array();";

$i=0;
foreach($chArray as $row) {
 $chapters .= "chapters[".$i."] = \"".$row."\"";
 $i++;
}
$chapters .="</script>";
echo $chapters;


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

2)вариант 2 - делаем с помощью пхп.
делаешь форму строка для ввода, скрытое поле actionflag и сабмит кнопку.метод формы ставишь GET чтобы можно было сохранять ссылку на поисковый запрос. Например, поисковая строка у нас называется search

далее после сабмита проверяем экшнфлаг. если он стоит в поиск значит делаем поиск.

из за того что русские символы URL кодируются в GET запросах нам нада расшифровать полученные данные и сделать все нужные проверки.

Код

$search = trim(urldecode($_GET['search']));


далее проверяем не пытается ли кто нить нас поломать (проверяем на запретные символы строку)

далее если глав не много то получаем их в массив $chArray
 далее пробегаемся по массиву циклом проверяя не совпадает ли полученная строка с названием
тут тоже нада регулярки юзать. сложнее если пользователь сделал опечатку и слова не совпадают.
далее ищи статьи на тему контекстный поиск и пользуйся кодом приведенным в них.

суда возвращайся когда по делу разговор уже будет (когда будет код)

Автор: koloskov 20.4.2007, 16:18
Советую обратить внимание на PHP функцию levenshtein.
Она вычисляет расстояние Левенштейна между двумя строками (это минимальное количество вставок, замен и удалений символов, необходимое для преобразования str1 в str2)

В данном случае можно применить следующим образом:
1. Задаем допустимый предел ошибок (например 10% от общего кол-ва букв слова);
2. Принимаем данные пользователя;
3. Делаем выборку из БД всех глав;
4. Циклический перебор с проверкой схожести введенной фразы той что есть в базе.

Можно таким образом найти наиболее похожую фразу из БД введенной пользователем.

ЗЫ: Можешь еще посмотреть на функции metaphone и soundex (поддерживается MySQL)


Автор: mclight 25.4.2007, 08:22
 smile  как раз то что нужно.......спасибо большое!
ЗЫ.: насчет metaphone и soundex - пробовал....не то!

Автор: koloskov 25.4.2007, 13:54
 smile да не за что!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)