пример:
text1:
This is a test text.
text2:
This is another test text.
text2:
What do you think about this test text.
Результат сколько и в каких текстах
встречается такая фраза:
"test text" - 3 (1,2,3)
"This is" - 2 (1,2)
Задача не теоретическая, а вполне
практическая. Размеры текстов большие
+/- 400 тыс. (20 гиг.) и поиск нужно делать
довольно часто (несколько раз в день).
интересует аглоритм разбора/поиска.
ym> Задача не теоретическая, а вполне
ym> практическая. Размеры текстов большие
ym> +/- 400 тыс. (20 гиг.) и поиск нужно делать
ym> довольно часто (несколько раз в день).
ym> интересует аглоритм разбора/поиска.
1) Каждому слову присваивается свой численный идентификатор (лучше хеш n
бит, n приблизительно равно 32-64 бита). Весь текст преобразуется в массив
идентификаторов. Сами идентификаторы - это словарь.
2) Весь текст, по которому будет идти поиск преобразуется в массив
идентификаторов (произойдет небольшая компрессия текстов). Для каждого
текста составляется массив присутствующих идентификаторов.
3) При поиске, строка поиска преобразуется в массив идентификаторов, если
один из этих идентификаторов не присутствует в словаре, то искомой
последовательности в тексте нет. Далее проверяется каждый текст на
присутствие всех идентификаторов строки поиска. Если хоть одного нет, текст
пропускается.
4) Если присутствуют все идентификаторы поиска в массиве идентификаторов
присутствия для каждого текста, то производится их поиск в массиве
идентификаторов самого текста.
Естественно все доступы к словарям, поиск подстрок в строке (из пункта 4)
организовываются быстрыми алгоритмами с постоянным временем поиска.
P.S. можно посмотреть тут: http://goog-sparsehash.sourceforge.net/ очень
шикарную имплементацию мап'ов и хешей от гугля на C++. Всё под BSD
лицензией.
With best regards, Mike Gorchak. E-mail: mi...@malva.ua
Думаю что на этапе предобработки текста нужно создать поисковые индексы на базе инвертированных файлов и потом юзать их как это делают поисковики:
http://www.google.com/search?q=inverted+files
[...]