Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Web, ASP.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.65/17: Рейтинг темы: голосов - 17, средняя оценка - 4.65
error_404
2 / 2 / 1
Регистрация: 14.03.2011
Сообщений: 82
Записей в блоге: 1
1

Умный поиск по сайту

01.03.2013, 13:21. Просмотров 3421. Ответов 12
Метки нет (Все метки)

Здравствуйте, у меня такая проблема: сайт работает с большим количеством книг, и мне нужно сделать поиск, который будет искать нужные куски текста , игнорируя ошибки, недочеты и морфологические формы... Например, при вводе фразы " Машина красиво стАяла" он должен найти "у дома стояла красивая машина.." Как возможно это сделать? Можно ли использовать поисковые системы Google или Яндекс для такого поиска по тексту( поиск нужен и по базам и по тексту).
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2013, 13:21
Ответы с готовыми решениями:

Поиск по сайту
Реализовываю поиск по всему сайту, ищу по контенту, по заголовком и т.д. У кого какие идеи есть по...

Поиск ссылок по сайту
День добрый! Нужно осуществить поиск битых ссылок по сайту. Программа подгружает с главной...

Бот поиск по сайту
Доброго времени суток! Хочу написать бота который будет посылать запрос на поиск на сайте....

Необходимо организовать поиск по сайту
Задача: необходимо организовать поиск по сайту. Все страницы ASP динамические с информацией из базы...

Как работает поиск по сайту?
Подскажите как работает поиск по сайту, т.е. как найти тот или иной раздел, и вообще возможно ли...

12
ninasus
3 / 3 / 2
Регистрация: 14.03.2012
Сообщений: 23
04.03.2013, 17:43 2
скажим так, это очень не простая задача, это элемент штучного интеллекта, полностью ее решить вряд ли Вам получится
0
error_404
2 / 2 / 1
Регистрация: 14.03.2011
Сообщений: 82
Записей в блоге: 1
04.03.2013, 19:36  [ТС] 3
В общем: интернет и правда не помог, поэтому я просто тупо создал бальную систему слов: выдавал баллы по проценту совпадающих букв, по относительному расположению слов, по содержанию внутренних кусков(типа отошел найдет шел и обратно), в итоге при высоких коэффициентах точности, тот запрос, который предлагал заработал, но также по запросу "шел в даль сторож" найдется и "шел далее осторожно" (сходу придумывал, но при усилении фильтра нужные запросы не находит...)), есть у кого мысли как здесь просто интуитивно выбить этот результат? Со словарями не предлагайте-вышло только хуже, у меня на такое рук не хватило....С увеличением точности: все же "отошел далее" и "отошел в даль" должны остаться взаимонаходящимися....
0
ninasus
3 / 3 / 2
Регистрация: 14.03.2012
Сообщений: 23
05.03.2013, 10:32 4
Словари придется делать, потому что при большом объеме информации у Вас будет очень долго побуквено перебирать (насколько я Вас понял). Придется делать какие то индексные таблицы. Как вариант: сразу они не заполняются, а заполняются при выполнении запроса. Первый раз запрос выполняется долго, зато следующие разы - быстро.

Что же по вопросу ("шел в даль сторож" найдется и "шел далее осторожно"), так Вам надо или пообщаться с специалистом-морфологом или почитать книги по морфологии (кажется так называется этот раздел) для выяснения особенностей и закономерностей слов и фраз.
Как на первый взгляд, так Вам надо выставлять процент точного совпадения слов и фраз. Но честно говорю, не знаю или поможет, надо пробовать.

А Вы нигде не встречали алгоритмы проверки текста на уникальность? Это фактически идентичные задачи.
0
05.03.2013, 10:32
error_404
2 / 2 / 1
Регистрация: 14.03.2011
Сообщений: 82
Записей в блоге: 1
05.03.2013, 22:17  [ТС] 5
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
 public class Search
    {
        public IQueryable<b_ru_sinodal> SinodalBibleTable { get; set; }
        public string SearchText { get; set; }
        public string SearchTextResult { get; set; }
        public int CountSearch { get; set; }
        public List<StixFormat> BigSearchResult { get; set; }
        public IQueryable<StixFormat> SearchResultArray { get; set; }
        public bool Sravnenie(double tochnost,string wordSearch, string wordInText) {
            wordSearch = wordSearch.ToLower(); wordInText = wordInText.ToLower();
            double Tochnost = 0;
            int del; del = wordSearch.Count() / 3;
            if (del == 0 || wordInText.Length< 3)
            {
                if (wordInText.IndexOf(wordSearch) > -1 && wordInText.Length <= wordSearch.Length+1)
                { return true; }
                else { return false; }
            }
            // for (int j = 0; j < wordSearch.Length; j++)
            int lenTrue = 0;
            for (int i = 0; i < Math.Min(wordSearch.Length,wordInText.Length); i++)
            {
                if (wordSearch[i] == wordInText[i])
                    lenTrue++;
            }
            if((double)lenTrue/wordInText.Length>=0.7)
                return true;
            int kof=0;
            for (int i = 0; i < wordSearch.Length - del; i++)
            {
                if (wordInText.IndexOf(wordSearch.Substring(i, del+1)) > -1)
                {
                    kof++;
                }
                Tochnost = (double)kof / (wordInText.Count() - del);
            }
            if (Tochnost >= tochnost && wordSearch.Count() > wordInText.Count()-del)
            return true;
            return false;
        }
        public string ChistkaSlova(string word){
            word = word.Replace("/", "");
            word = word.Replace(".", "");
            word = word.Replace("?", "");
            word = word.Replace(",", "");
            word = word.Replace(",", "");
            word = word.Replace("  ", " ");
            word = word.Replace("'", "");
            return word;
    }
        public double WordSravnenine(StixFormat stix, string word)
        {
          //  double k = 0;int del=(double)word.
           // for(int i=0;i<
            return 0.1;
        }
 
        public List<StixFormat> BigSearch(string SearchText)
        {
            //создание массива слов.
            string SearchTextFromSensitence = ChistkaSlova(SearchText);
           
            //List<string> ListWord= new List<string>();
            string[] ListWord = SearchTextFromSensitence.ToString().Split(' ');
           List<StixFormat> ListStix= new List<StixFormat>();
           foreach (b_ru_sinodal item in SinodalBibleTable)
           {
               int wordSuccess = 0; string[] WordInStix = item.verse.ToString().Split(' ');
                for (int r = 0; r < ListWord.Count(); r++)
               {
                   ListWord[r] = ChistkaSlova(ListWord[r]);
                  for (int j = 0; j < WordInStix.Count(); j++)
                   {
                       if (Sravnenie(0.6, ListWord[r], WordInStix[j]))
                       {
                           wordSuccess++;
                           j = WordInStix.Count();
                       }
                       //if (item.verse.IndexOf(ListWord[r]) > -1)
                       //    {
                       //        wordSuccess++;
                       //    }
                   }
               }
               if ((double)wordSuccess /(double)ListWord.Count() >= 0.7)
               {
                   StixFormat Stix = new StixFormat();
                   Stix.verse = item.verse;
                   Stix.verse_code = item.verse_code;
                   ListStix.Add(Stix);
               }
           }
           return ListStix;
        }
C#
1
2
3
4
5
public class StixFormat 
    {
        public string verse_code{ get; set;}
        public string verse { get; set; }
    }
В общем это мои наброски как раз и с процентом совпадений и так далее, только на позиции ошибку нашел-пока алгоритм выбил... Вот вопрос-есть какие мысли по моификации и исправлении, я просто не особо-то и шарю.. работаю вообще на php, а этио просто свой сайт решил на mvc3 написать...
0
t1m0n
633 / 411 / 28
Регистрация: 03.11.2009
Сообщений: 1,853
06.03.2013, 02:09 6
в каком формате у вас книги?
возможно Sphinx подойдет
есть еще аналогичные поисковики
0
error_404
2 / 2 / 1
Регистрация: 14.03.2011
Сообщений: 82
Записей в блоге: 1
06.03.2013, 17:49  [ТС] 7
У меня база в MS Sql server r2, база достаточно большая - 77 книг одной таблицей, сфинкс посмотрел -в итоге он отпал: 1) ужасная совместимость, а скорее отсутствие с MSSQl((, а главное, по крайней мере в демо тестах морфологический поиск будто отсутствовал, в общем , идейка хорошая, но реализовать по-моему не реально... была бы mySql.... вот есть идеи, как усилить бальную систему, чтобы по банальным проверкам(не надо доскональной словарной точности) выводить схожие результаты?

Суть такая: пусть человеку выдастся 300 левых мест по оочень корявому запросу. но чтобы то, что он примерно вспомнил-вошло в лимит 300....
0
Moonshine
43 / 43 / 7
Регистрация: 09.10.2012
Сообщений: 147
10.03.2013, 15:56 8
Для поиска с морфологией языка есть библиотека Lucene.Net. Вещь крутая, а из минусов то, что книжки из базы данных будут продублированы на жёстком диске (хранятся в архивированном виде, так что места не много надо).

Исправления ошибок там нету, так что можно поискать библиотеку для проверки русской орфографии и перед тем как запустить поиск Lucene проверять на орфографию.
0
__PION__
958 / 799 / 85
Регистрация: 21.07.2010
Сообщений: 3,521
26.04.2013, 14:31 9
error_404, нашел как проиндексировать БД? у меня тоже ms sql, вот думаю тоже сфинкс подключить, вроде на википедии пишут, что он совместим с ms sql'ем
0
Haravodec
27 / 27 / 5
Регистрация: 11.09.2012
Сообщений: 107
29.04.2013, 00:33 10
а Full-Text Search с учётом ранга не подойдёт ?

у меня например на сайте по запросу "text fuull suarch" находит статью
"Организация поиска на сайте средствами Full-Text Search"
0
__PION__
958 / 799 / 85
Регистрация: 21.07.2010
Сообщений: 3,521
29.04.2013, 08:36 11
Haravodec, нее.., это не то. text full suarch у меня тоже вкл. и работает, но записей сотни млн. + по нескольким таблицам + огромный фильтр + вывод по страницам (тут 3 вложенных запроса, т.к., в MS SQL нет такой вкусности как LIMIT , как в MySQL) = в результате поиск длится до 5-6 секунд!
0
Haravodec
27 / 27 / 5
Регистрация: 11.09.2012
Сообщений: 107
01.05.2013, 10:15 12
Интересная тема, если кто найдёт решение напишите.
0
__PION__
958 / 799 / 85
Регистрация: 21.07.2010
Сообщений: 3,521
01.05.2013, 12:47 13
Haravodec, ну как, так то теоретически идея есть в голове.., но тут есть готовое решение (сфинкс), поэтому пока думаю его прикрутить (это тоже гемор).
идея поиска примерно такая -
1. нужно создать словарь (таблицу всех слов находящиеся во всех полях, по которым выполняется поиск). поля в новой таблице связаны с теми из которых взяты эти слова.
2. создать вспомогательный класс, который будет понимать слова по корню.

но опять таки сфинкс уже написан и говорят быстрый
0
01.05.2013, 12:47
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.05.2013, 12:47

Поиск по сайту с базы sql
Добрый день! Как мне организовать поиск по сайту? Я новичок в asp так что не сердитесь. Я...

Поиск по сайту на www.relib.com
Люди, объясните как что-либо найти в форуме?

Можно ли сделать поиск по сайту на АСП?
Просто 'да/нет'. Если 'да', то сложнее это, чем на PHP или нет? Заранеее большое спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.