Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Формирование выдачи результатов поиска #2

Open
iprst opened this issue May 13, 2023 · 87 comments
Open
Assignees
Labels
documentation Improvements or additions to documentation enhancement New feature or request
Milestone

Comments

@iprst
Copy link
Collaborator

iprst commented May 13, 2023

Название книги

Заголовок главы и/или раздела (чтобы можно было ориентироваться в бумажной книге)

Далее единым блоком в виде трёх параграфов:

Текст, представляющий собой предыдущий контекст
Найденный текст с подсветкой результатов поиска
Текст, продолжение контекста

Далее добавим ссылки, когда поймём куда они должны вести.
Предыдущее обсуждение в репозитории поисковика.

@iprst iprst added documentation Improvements or additions to documentation enhancement New feature or request labels May 13, 2023
@iprst iprst added this to the frontend milestone May 13, 2023
@iprst
Copy link
Collaborator Author

iprst commented May 14, 2023

Тестирую парсер. Всё описанное в README работает, парсер парсит docx, постман ищет запросы.
Пара вопросов:

  1. В описании не написано, как, например, удалить всю созданную базу, чтобы создать новую, например из обновлённых файлов, которые нужно протестировать?
  2. Насколько сложно ввести функционал парсинга FB2 или EPUB — подавляющее большинство книг у меня в этом формате (FB2 достаточно легко сохранить из ворда в docx и такая книга прекрасно парсится, но не нашёл варианта конвертации в пакетном режиме, вручную очень сложно будет пересохранить тысячу документов).

@audetv
Copy link
Collaborator

audetv commented May 14, 2023

В описании не написано, как, например, удалить всю созданную базу, чтобы создать новую, например из обновлённых файлов, которые нужно протестировать?

Да точно не написано.
Сейчас сделано очень просто, после запуска парсера book-parser64.exe, он удаляет предыдущую базу (таблицу booksearch) в мантикоре и создаёт её снова, данные теряются. Далее сканирует папку books/VPSSSR/DOCX/ и парсит по очереди все файлы, которые расположены в ней и записывает результат в базу.

Т.е. если в папку books/VPSSSR/DOCX/ положить новые файлы и запустить book-parser64.exe, то они будут обработаны.

Можно для тестирования/экспериментов сделать так:
Рядом с папкой books/VPSSSR/DOCX/ сделать другую папку, например: process и в эту папку надо будет самому копировать те файлы, которые надо парсить, например только 2 книги. Я внесу изменение в код парсера поменяю папку, которую он будет обрабатывать. Эту папку process добавить в исключение гита(репозитория) т.е. все файлы которое будут находиться в этой папке будут только локально у пользователя, и не попадут при commit в репозиторий. Тем самым мы не нарушаем целостность архива books/VPSSSR/DOCX/ и можно обновлять репозиторий с помощью команды git pull

git pull вытягивает последние изменения из репозитория и обновляет локальный репозиторий, клонированный ранее. Синхронизирует оба репозитория. Но, если в локальном репозитории были ранее внесены изменения, например поменяли код, или удалили, или добавили какую либо книгу в папку books/VPSSSR/DOCX/, то перед слиянием надо эти изменения отправить в remote репозиторий с помощью git commit, иначе при git pull возникнет ошибка, гит напишет, что у вас в локальном репозитории есть файлы, которые отличаются от файлов в репозитории(remote) и предложит или сделать commit (предложит без пояснения как делать), или отменить локальные изменения. И не обновит репозиторий.
Если интересно, я напишу про git commit как делать, или можно почитать в документации https://git-scm.com/docs/git-commit .

Добавление папки process в исключение (.gitignore) позволяет иметь локальное содержимое папки отличное от того, что в remote репозитории - https://github.com/audetv/book-parser.git . В нашем случае папка process в remote репозитории https://github.com/audetv/book-parser будет пустая.

Или же можно делать совсем просто, если возникла вышеописанная ошибка при вводе команды git pull, просто удалять всю папку и клонировать репозиторий снова. Почему бы и нет).

git pull надо будет делать тогда, когда я буду вносить изменения в код (когда в принципе внесены изменения в репозиторий, например добавили еще с 10ок книг).

  1. Итого, прямо сейчас можно в папку books/VPSSSR/DOCX/ скопировать новые docx файлы и запустить book-parser64.exe он заново обработают всю папку и перепишет БД.
  2. Вариант сделать для этого отдельную папку, например: process или parsed и добавить её в исключения git

По идее второй вариант правильнее, если по методичкам подходить, как рекомендуют.

Но мы же тестируем и оба варианта могут быть для нас приемлемы.

Насколько сложно ввести функционал парсинга FB2 или EPUB — подавляющее большинство книг у меня в этом формате (FB2 достаточно легко сохранить из ворда в docx и такая книга прекрасно парсится, но не нашёл варианта конвертации в пакетном режиме, вручную очень сложно будет пересохранить тысячу документов).

На данный момент не могу сказать, но точно не сложнее, чем docx. Эти форматы по структуре вроде более простые.
И есть уже написанные парсеры, надо только будет соединить все как нам надо или доработать:
https://pkg.go.dev/github.com/centrypoint/fb2
https://pkg.go.dev/github.com/mathieu-keller/epub-parser

Почитаю, посмотрю. Думаю сделаем.

@audetv
Copy link
Collaborator

audetv commented May 14, 2023

По фронтенду, согласен, так и сделаем.

Хочу предупредить, что мне надо рабочий проект закончить и придется недели две сосредоточиться на нем и решить вопросы. Я просто не смогу сейчас сделать фронтенд, как только там будет результат, переключусь обратно, иначе мне пока сложно, в том плане, что я начинаю делать задачи тут, которые интереснее, и не сделаю там. Фиксить баги и простые изменения я буду, я буду полностью доступен, и буду участвовать в обсуждениях, просто мне надо написать много кода по работе. Как только сделаю там основное и почувствую, что в рабочем проекте все ок, переключусь обратно к написанию кода тут. Так что, все нормально, просто маневры.

@iprst
Copy link
Collaborator Author

iprst commented May 14, 2023

Принято. Описанное понял, если будут вопросы задам для уточнения.

@audetv
Copy link
Collaborator

audetv commented May 14, 2023

Название книги

Заголовок главы и/или раздела (чтобы можно было ориентироваться в бумажной книге)

И да надо в парсер добавить сохранение с привязкой к заголовку, посмотреть какими заголовками главы размечаются(технически в xml) и добавить в следующую версию парсера в выдачу:

"book": название книги,
 "chapter/title": заголовок,
 "position": номер параграфа,
 "text": "параграф"

@iprst
Copy link
Collaborator Author

iprst commented May 15, 2023

2. Вариант сделать для этого отдельную папку, например: process или parsed и добавить её в исключения git

По идее второй вариант правильнее, если по методичкам подходить, как рекомендуют.

Этот вариант более логичный. Я правильно понимаю, что после того, как файл обработан, то его можно автоматически скопировать в «хранилище»?

@iprst
Copy link
Collaborator Author

iprst commented May 15, 2023

На данный момент не могу сказать, но точно не сложнее, чем docx. Эти форматы по структуре вроде более простые.
И есть уже написанные парсеры, надо только будет соединить все как нам надо или доработать:
https://pkg.go.dev/github.com/centrypoint/fb2
https://pkg.go.dev/github.com/mathieu-keller/epub-parser

Изучил, могу вполне однозначно сказать, что сам ничего не сделаю. Я могу в принципе подправить какой-то готовый код, но не имею совершенно никакого представления как от представленных ссылок и содержащимся там файлов перейти к нашему book-parser64.exe, этот путь у меня отсутствует.

@audetv
Copy link
Collaborator

audetv commented May 16, 2023

Этот вариант более логичный. Я правильно понимаю, что после того, как файл обработан, то его можно автоматически скопировать в «хранилище»?

Да, можно, но я ранее описывал вариант простой, когда база удаляется полностью и создаётся снова. Без дополнительного функционала, который сейчас не смогу добавить. Под дополнительным функционалом я имею ввиду, добавление записей (книг, файлов) в базу к уже существующим книгам и записям. Этого функционала сейчас нет, т.е сейчас можно только удалить всю базу и загрузить все файлы, которые надо парсить, снова. По идее, по хорошему для загрузки надо написать механизм, который будет отслеживать, что таких записей в БД еще нет. Т.е. что один и тот же файл не спарсен 2 раза. Проще всего удалять книгу по названию файла и загружать ее снова, если этот файл появился в папке для парсинга, т.е это надо будет еще написать, позже, в ближайшее время я это не сделаю.

С комментариями я сделал так. Так как прошлые комментарии никогда не меняются, я так предположил,, т.е те, что попали в бд уже не могут быть изменены, и на сайте ФКТ комментарии не редактируют. Т.о. если комментарий с номером 2345678 уже есть в бд, то его не надо записывать снова, а надо записать только те номера, которых еще нет. Программа читает спарсенный файл, составляет массив id комментариев и сравнивает с массивом id в бд, и добавляет, только те записи которые отсутствуют.

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

@audetv
Copy link
Collaborator

audetv commented May 16, 2023

Изучил, могу вполне однозначно сказать, что сам ничего не сделаю. Я могу в принципе подправить какой-то готовый код, но не имею совершенно никакого представления как от представленных ссылок и содержащимся там файлов перейти к нашему book-parser64.exe, этот путь у меня отсутствует.

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

@audetv
Copy link
Collaborator

audetv commented May 17, 2023

Сделал изменения. Поменял папку по умолчанию для обработки файлов на process
Так же добавил опцию в консоли, можно запустить парсер и дополнительно указать путь папки для обработки.
Обновил readme
сделал 2 релиза,
v0.0.1 - предыдущая версия файла
v0.0.2 - текущая версия файла

Скопировать файлы или файл для обработки в папку ./books/VPSSSR/process

Запускаем парсер. Парсер удалит таблицу booksearch в мантикоре и создаст её снова. Если ранее там были обработанные данные (книги), сохранённые после предыдущего запуска парсера, данные будут уничтожены. Далее парсер просканирует папку books/VPSSSR/process/ и обработает по очереди все файлы, которые расположены в этой папке и запишет результат в базу Manticoresearch.

Для запуска парсера книг набрать в консоли Git CMD:

book-parser64.exe
При необходимости — указать в консоли Git CMD полный путь к этому файлу.

При необходимости можно изменить путь обработки файлов по умолчанию, для этого надо при запуске парсера в командной строке указать опцию -o /путь/к/папке

Например, если указать:

book-parser64.exe -o ./books/VPSSSR/DOCX/
Будет обработан весь архив толстых книг ВП СССР, находящийся в папке /books/VPSSSR/DOCX/

@iprst
Copy link
Collaborator Author

iprst commented May 17, 2023

Работают оба варианта.
Выявлена ошибка, скорее всего не связанная с обновлением: если в адаптере сети выставлен гугловский dns 8.8.8.8 / 8.8.4.4 — git не работает корректно и при запуске book-parser64.exe отдаёт страшные ошибки. Если в адаптере убрать гугловский dns, всё работает.

@iprst
Copy link
Collaborator Author

iprst commented May 17, 2023

Сколько результатов должен отдавать запрос пфу в постмане? У меня отдаёт 1 результат. Другие запросы, вроде бы, довольно массовые. Как проверить полноту формирования базы?

@audetv
Copy link
Collaborator

audetv commented May 17, 2023

У меня тоже 1 результат, можно конечно проверить, есть ли такое сокращение ещё в тексте и поискать по тексту файлов .txt попробую. Но с самого начала был 1 результат.
Можно составить такой сложный запрос, который покажет кол-во записей:

{
    "index": "booksearch",
    "aggs": {
        "type": {
            "terms": {
                "field": "type"
            }
        }
    },
    "highlight": {
        "fields": [
            "text"
        ],
        "limit": 0,
        "no_match_size": 0
    },
    "max_matches": 353545,
    "limit": 50,
    "offset": 0,
    "query": {
        "bool": {
            "must": [
                {
                    "in": {
                        "type": [
                            1
                        ]
                    }
                }
            ]
        }
    }
}

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

@iprst
Copy link
Collaborator Author

iprst commented May 17, 2023

Поиск по документам в Total Commander показывает, что пфу можно найти в этих книгах:

Вера и Мера
Как и для чего писания делаются священными
Мастер и Маргарита — гимн демонизму либо Евангелие беззаветной веры
Матрица «Матрице» - рознь
Медный Всадник - это вам не медный змий…
По вере вашей да будет вам…
Последний гамбит
Разгерметизация
Разрешение проблем национальных взаимоотношений в русле КОБ
Российское общество и гибель АПЛ «Курск» 12 августа 2000 года
Русское правоведение — «юридическая чума» на Руси — вылечим
Сборник аналитических записок «Вехи» (1989-1995-1998-2004-2005-2007-2010)
Сборник аналитических записок «Концептуальная власть на Руси»
Смута на Руси — зарождение, течение, преодоление…

@audetv
Copy link
Collaborator

audetv commented May 17, 2023

Возможно, но например, я сейчас не смог посмотреть все книги, открыл только первые 4:

Вера и Мера
Как и для чего писания делаются священными
Мастер и Маргарита — гимн демонизму либо Евангелие беззаветной веры
Матрица «Матрице» - рознь

https://github.com/audetv/book-parser/tree/main/books/VPSSSR/TXT , и поиском ctrl+f набрал пфу, и в этих файлах нет этого слова.

Надо разобраться, где расхождение происходит.

@iprst
Copy link
Collaborator Author

iprst commented May 17, 2023

Возможно ТС нашёл в других кодировках. Если искать только в utf-8 и utf-16, то вроде бы всё совпадает, только одна сборная книга и несколько записок. Пока забудем. Наверное пока можно просто надеяться, что в базу добавлено всё и ищется всё, а потом придумаем как это проверить.

@audetv
Copy link
Collaborator

audetv commented May 17, 2023

Можно составить такой сложный запрос, который покажет кол-во записей:

При составлении этого запроса я имел ввиду, что с помощью него можно получить общее количество записей в базе, но нельзя определить полноту формирования... Я задумался и не знаю, как можно проверить полноту. Т.е. если бы я не доверял алгоритму и предположить, что он что-то вырезал, удалил, то как это проверить? Можно перед сохранением считать кол-во символов в параграфе и вывести результат в конце, что столько то символов сохранено, с некоторой погрешностью или полностью должно совпасть с кол-вом в docx. Но есть пустые парагарфы, есть всякий мусор, как кол-во символов посчитает ворд?
По хорошему надо проверять файлы, которые в папке VPSSSR/DOCX Это в них total commander находит слово пфу в списке?

Вера и Мера
Как и для чего писания делаются священными
Мастер и Маргарита — гимн демонизму либо Евангелие беззаветной веры
Матрица «Матрице» - рознь
Медный Всадник - это вам не медный змий…
По вере вашей да будет вам…
Последний гамбит
Разгерметизация
Разрешение проблем национальных взаимоотношений в русле КОБ
Российское общество и гибель АПЛ «Курск» 12 августа 2000 года
Русское правоведение — «юридическая чума» на Руси — вылечим
Сборник аналитических записок «Вехи» (1989-1995-1998-2004-2005-2007-2010)
Сборник аналитических записок «Концептуальная власть на Руси»
Смута на Руси — зарождение, течение, преодоление…

Или в других файлах, локальных не в архиве? может быть были удалены какие-то сноски при конвертации? Если ПФУ реально есть не в сносках, то это очень странно, даже если предположить что это сочетание букв в слове ....пфу.. Не приходит на ум такое слово, типа пропфушный. То если бы такие слова были в текущем архиве, то при открытии файла, используя обычный поиск ctrl+f они бы нашлись. Не знаю.

Возможно ТС нашёл в других кодировках. Если искать только в utf-8 и utf-16, то вроде бы всё совпадает, только одна сборная книга и несколько записок. Пока забудем. Наверное пока можно просто надеяться, что в базу добавлено всё и ищется всё, а потом придумаем как это проверить.

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

И если есть символы - слова в книгах в другой кодировке, т.е. utf-8 и тут же coi8r, это конечно очень странно, но если буду такие аномалии, надо бы их выявить и отработать в парсере. Или смоделировать такую ситуацию.

@iprst
Copy link
Collaborator Author

iprst commented May 17, 2023

Но есть пустые парагарфы, есть всякий мусор, как кол-во символов посчитает ворд?

В свежем ворде в открытом файле количество слов прямо показано в нижнем левом углу, а кликом по нему вызывается вот такая табличка (файл «Вера и Мера»):

image

По хорошему надо проверять файлы, которые в папке VPSSSR/DOCX Это в них total commander находит слово пфу в списке?

Нет, в оригинальном формате из архива медиамеры. Там был .doc
Это ошибка — ТС находит во всех кодировках, нужно при поиске отключать всё кроме utf, и тогда всё совпадает. Действительно в толстых книгах ищется только 1 вхождение пфу.

@iprst
Copy link
Collaborator Author

iprst commented May 17, 2023

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

И если есть символы - слова в книгах в другой кодировке, т.е. utf-8 и тут же coi8r, это конечно очень странно, но если буду такие аномалии, надо бы их выявить и отработать в парсере. Или смоделировать такую ситуацию.

Вкратце ситуация такова, обратите внимание на проставленные галочки в поисковом запросе:

image

Это однозначно проблема дешифровки кодировок — при подключении только utf и офисных форматов, обнаруживаются только актуальные вхождения. Но при подключении ANSI ASCII — ищется мусор. Если это актуально для баз данных, парсеров и тд, можно иметь в виду. Маловероятно, что слова типа «вседержительность» или даже «элита» будут сформированы в неправильной кодировке из мусора, но вот всякие «пфу», «гп» и даже «краб» — легко.

@audetv
Copy link
Collaborator

audetv commented May 17, 2023

Да, вижу и вижу слева на скриншоте «Сборник аналитических записок «Концептуальная власть на Руси», в котором как раз у нас мантикора и находит пфу. Хорошо, понял.

@iprst
Copy link
Collaborator Author

iprst commented May 17, 2023

Я проверил четырёхбуквенные слова типа краб, штык, крот, прок и тому подобные — ситуация аналогичная, в двух режимах ищутся совсем разные результаты. Так что четырёхбуквенные слова тоже представляют опасность, если где-то в системе возникнет подобный сценарий. Пишу просто чтобы запомнить и если в будущем когда-то где-то всплывёт, иметь представление откуда ноги могут расти.

UPD. Нет, всё не так радужно, как я описал. В действительности актуальные вхождения могут быть обнаружены как в «правильном», так и в «неправильном» режиме поиска по документам — это зависит от обработчика знаков препинания в формате .doc / .docx и такое поведение я уже встречал в ворде.

Пример. Ищем слово элита — «правильный» поисковик выдаёт много результатов, это те файлы, где слово употреблено либо в составе сложного слова типа элитарный, либо непосредственно как в запросе. Однако «правильный» поиск не находит (!) вхождений, где слово элита оформлено, например, кавычками хотя бы с одной стороны, также бывает проблема с элементарными точками и запятыми. А неправильный — обнаруживает!

Такое поведение мне попалось при попытке заменить указатели сносок на собственно текст примечания — есть скрипт, который позволяет это сделать, но он не выполняет все вхождения, заменяет только часть. Те вхождения, которые расположены со знаками препинания, рядом с кавычками и так далее, просто не обнаруживаются и не заменяются. Это беспредел!

@audetv
Copy link
Collaborator

audetv commented May 22, 2023

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

Теперь подробно: посмотрел несколько графовых баз данных – это Nebula, Neo4J (авторитеты заявляют, что это лучшее, это лидер) и EdgeDB (надстройка postgres, не совсем графовая, скорее графо ориентирована, graph-relational model). Давно хотел изучить этот вопрос, дозрел и в выходные увлекся, что могу сказать: интересно, но пока не очень понятно, как эти БД можно применить в наших сценариях поиска, технически на практике, но именно поэтому, я и решил посмотреть графовые БД, чтобы сложить понимание как их применять. Я пока не знаю, как это будет работать в итоге, но уже ясно, что это целый новый мир и его надо изучить, тем более что концепция связности означает, что мы строим связный граф. Т.е. в общем то специализированные БД должны нам в этом вопросе помочь, но как соединить наш поиск и графы я пока ещё не понял, и надо ли это делать не знаю. Надо изучать.

При беглом изучении инструментов понравилось, что в таких БД можно легко создавать узлы, как объекты, т.е. добавлять свойства и менять, в обычной реляционной БД это была бы таблица, а свойства – колонки, и чтобы изменить ее колонки надо изменить схему базы. По сути, узлы — это все, что надо спроектировать, а связи можно легко добавлять позже. Например, использование реляционной модели предполагает, что схема БД спроектирована и созданы нужные связи, так как на легко лету таблицы, ключи и связи не добавляются, потом структура БД отображается в код (map), т.е. надо знать заранее, что ты хочешь от системы и спроектировать её. Конечно, знать заранее это хорошо и правильно, но не во всех сценариях это осуществимо. В текущем процессе с графами, я еще к написанию кода не приступал, я сейчас на стадии изучения и понимания как извлекать данные по запросам из БД и создавать записи и связи, и как только в этом будет прогресс, то можно уже что-то программировать, и поэтому, возможно, я пока просто нахожусь в состоянии некоторой «эйфории», так часто бывает, когда изучаешь что-то новое, но много чего ещё не знаешь, и кажется, что это просто. Поэтому пока не могу адекватно сравнить подходы графовой и реляционных моделей, авторитеты говорят, что графы проще и лучше, надо проверять. Не хочу торопиться с выводами, но потребность поделиться изученным возникла.

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

Но по идее сейчас поиск создан, я имею в виду техническое решение как он сделан, так, чтобы в реальном времени по запросу выдавать результат, и поиск с этим справляется, зачем в этом случае граф? Сейчас поиск без модного ИИ, но, если добавить графы, у нас уже «самообучающаяся система», почти.

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

Видимо я просто пока не придумал, зачем и как еще можно использовать графовую БД, хотя вспомнил, но надо будет об этом написать в следующем сообщении, вот это, например, одна из ваших идей в копилку, думаю хорошо ляжет в графовую БД:

Управляемое облако тегов, которое бы формировалось из глобального словаря на основании отобранного субъектом набора «тем». Данная процедура будет также полезна для сопоставления производных понятий, которые в обсуждениях формируются на лету — например сейчас в поиске результаты по запросам «вегане», «вегетары», «вегетариане» и прочие возможные формы (в том числе написанные с ошибками) понятного слова ищутся раздельно, в то время как их имело бы смысл объединить.

Позже я пришел к выводу, что похоже все-таки данные надо проектировать, и не все так просто, как показывают во вступительных обучающих роликах.

Предполагаю, что графовая БД может хорошо лечь в «геоматрицу». Там похоже это будет именно то, что надо. События, объекты и хэши связаны, при решении геодезических задач надо искать другие события и объекты и создавать связи между узлами – событиями и объектами.

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

Из красоты, в nebula и в neo4J построенный граф выглядит красиво, да, предоставляемые инструменты рисуют кружки-ноды и связи между ними, и все это выглядит эффектно. Насмешил момент при просмотре одного обучающего видео, в котором какой-то китаец рассказывает об nebula, его собеседник китаец кивает, тот ему показывает итог манипуляций – граф картинку и собеседник ещё больше кивает и улыбается, теперь он всё понимает. Смешное представление. Кстати, все просмотренные БД имеют документацию на китайском, закономерно, тянут за уши китайский ЦКУ.

По поводу нашего парсера книг, я попробовал схему книга-[]->параграф, позже выгружу ветку graph, в которой я написал код, чтобы делать csv файлы из книг для БД, файлы я загружал в nebula для экспериментов. Пока не очень, больше похоже на баловство. Обычная логика таблиц кажется проще.

Я пробовал так: книга и параграф – 2 типа узлов, связываем их между собой отношением belong_to, и параграфы связываем между собой follow. Далее пытался делать запросы, пока не очень успешно, и поэтому преимуществ в такой схеме увидел не много, почти не увидел. Более того в этом примере с книгами все очень просто, и этот пример легко решается в логике реляционных баз, даже проще сделать обычных пару запросов в таблицы, чем городить огород с графами, но есть предположение, что с увеличением источников 100% увеличится количество написанного кода и обсуживать, и поддерживать такую систему будет не просто, запросы будут обрастать джойнами и циклами и система начнёт работать медленно и печально. Не факт, что графовая БД это изменит, не знаю, но что-то заставляет меня продолжать изучение в этом направлении. Ну, и куда же без авторитетов, которые заявляют, что такие задачи решает графовая модель хранения данных и графовая БД.

Думаю, что надо как-то параллельно вести работу и начать разбираться с этими БД и смотреть, что из этого выходит, строить ПФУ и работать, сейчас у меня стадия, что я заметил эти инструменты, и надо бы выработать стереотип, для чего они нужны и отработать и реальные сценарии пользователей и попробовать это спроектировать, чтобы потом запрограммировать.

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

Такие мысли, хотел коротко, но не получилось.

2023-05-22_22-53-23

2023-05-22_22-55-56

2023-05-22_23-17-43

@iprst
Copy link
Collaborator Author

iprst commented May 22, 2023

Думаю, что надо как-то параллельно вести работу и начать разбираться с этими БД и смотреть, что из этого выходит, строить ПФУ и работать, сейчас у меня стадия, что я заметил эти инструменты, и надо бы выработать стереотип, для чего они нужны и отработать и реальные сценарии пользователей и попробовать это спроектировать, чтобы потом запрограммировать.

Понял.

Можно сделать пробники на геоматрице. Поясню почему — во-первых, за это время у меня постепенно собрались очищенные CSV всех моих текущих баз геоданных, и хотя они слегка отличаются друг от друга заголовками полей и их количеством, это на несколько порядков лучше того беспредела, что творится с форматированием xml / kml файлов. В оригинале там полная беда, притом речь не о моих файлах, а об официально публикуемых источниках, в том числе серьёзных. Нашёл программу-парсер геоданных, которая переводит любой формат гео-данных в любой другой, включая все публикуемые проприетарные, от всех существующих гео-систем. За две недели разобрался и теперь есть несколько сотен тысяч достаточно однотипных записей, к которым можно прикручивать расчётку геохэшей и собирать всё это в базы, будь то мантикоры или любые другие. Сейчас проверяю последние несколько файлов перед публикацией в репозиторий.

По остальному мысли есть, но написать пока некогда, буду комментировать далее по мере развития сюжета.

@audetv
Copy link
Collaborator

audetv commented May 23, 2023

Можно сделать пробники на геоматрице.

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

@audetv
Copy link
Collaborator

audetv commented Jun 28, 2023

Хочу попробовать второй вариант: — (текст в скобках это сноска) —

Думаю это будет наиболее малой кровью. Про курсив понятно, пусть пока без него.

хорошо

@iprst
Copy link
Collaborator Author

iprst commented Jun 28, 2023

Можно пока текст не размещать, если вы сможете развернуть или подкорректировать этот.

Хорошо, сделаю. У него есть какая-то страничка редактирования типа статического блока где-то в движке сайта, или просто сюда скинуть?

@audetv
Copy link
Collaborator

audetv commented Jun 28, 2023

Хорошо, сделаю. У него есть какая-то страничка редактирования типа статического блока где-то в движке сайта, или просто сюда скинуть?

Нету, пока только html, код и хардкор)
Да, просто сюда скинуть, я заверстаю тэги div, p , h и т.д. Вот я делал текс анонса, хотя без файла стилей на локальном будет просто текст, с версткой не заворачивайтесь, я сделаю:

<div class="card">
        <div class="card-body">
          <h5>Товарищи!</h5>

          <p>Мы запустили поисковик по текстам толстых книг<br>
            ★ <span class="link">https://kob.svodd.ru</span></p>

          <p>Этот метод удобен во многих сценариях. Как пример, если нужно найти поблизости два термина в толстых книгах. В нашем случае поиск ведётся по тексту одного параграфа, включая сноски, если они есть. Также в поиске удобно то, что подключен словарь синонимов, и таким образом при поиске «пфу» со включенным «концептуальным словарём» будут получены все связанные термины, например «полная функция управления» или «цели».</p>

          <p>Приведу примеры связок, которые будет сложно найти быстро без нашего поисковика:</p>

          <p>«предиктор + пфу»<br>
            ★ <span class="link">https://svodd.ru/exxyAS9p</span></p>

          <p>«достоевский + магия»<br>
            ★ <span class="link">https://svodd.ru/NYxu2lGg</span></p>

          <p>«пушкин + масоны»<br>
            ★ <span class="link">https://svodd.ru/hOJ0iS0u</span></p>

          <p>Такие запросы практически нереально обработать простым поиском по тексту книги в файле (пдф или док), поскольку в большинстве случаев поиск слеп к расстоянию между поисковыми словами, а в поисковике запрос ограничивается параграфами книг, и результаты в виде подходящих параграфов доступны мгновенно.</p>

          <p>Но это не единственный сценарий, их много. Это обычный поисковик. Рядом с кнопкой «поиск» есть кнопка опций, где можно выбрать режим поиска и подключить «концептуальный словарь синонимов». Поисковый запрос, к которому вы часто обращаетесь, можно сохранить при помощи кнопки «короткая ссылка» — будут также сохранены настройки конкретного поиска. Для удобства в выдаче к каждой цитате присоединяется название толстой книги из которой она взята.</p>

          <p>Вопросы, предложения, замечания и найденные ошибки приветствуются.</p>
        </div>
      </div>

upd А если будет много текста подумаем как разместить

@iprst
Copy link
Collaborator Author

iprst commented Jun 28, 2023

Товарищи!

Мы запустили поисковик по текстам толстых книг ВП СССР
https://kob.svodd.ru

Поиск реализуется внутри содержания отдельного параграфа, включая сноски, если они есть. Таким образом текстовый запрос в строке поиска служит цели найти наиболее подходящие под этот запрос параграфы. Рядом с кнопкой «поиск» есть кнопка опций, где можно выбрать режим и подключить «концептуальный словарь синонимов». Режимы поиска позволяют выбрать точное совпадение фразы в результатах (по соответствию фразе), появление хотя бы одного из слов запроса в параграфе (по совпадению слов), или найдя подходящий параграф, можно выбрать его номер и взяв соседние (отняв или добавив единицу), показать несколько параграфов подряд. Это удобно, если нужна более развёрнутая информация, но нет необходимости обращаться к целой книге.

Если цель поиска — найти книгу по искомому запросу, то для этой цели в выдаче к каждой цитате присоединяется название толстой книги, откуда она была получена. Поисковый запрос, к которому вы часто обращаетесь, можно сохранить при помощи кнопки «короткая ссылка» — в ней также сохраняется режим конкретного поиска. Режим «словаря концептуальных терминов» позволяет искать все синонимы (иногда антонимы) понятий, перечисленных в поисковой строке, так, при поиске «пфу» со включенным «концептуальным словарём» будут получены все связанные термины, например «полная функция управления» или «цели», однако если вы поищите «пфу» без словаря, результатом будет лишь единственный параграф, где понятие полной функции управления было обозначено аббревиатурой.

Пример одного из сценариев работы с поисковиком.

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

Вот примеры связок, которые будет сложно найти быстро без нашего поисковика:

«предиктор + пфу»
https://svodd.ru/exxyAS9p

«достоевский + магия»
https://svodd.ru/NYxu2lGg

«пушкин + масоны»
https://svodd.ru/hOJ0iS0u

Вопросы, предложения, замечания и найденные ошибки приветствуются. Можно написать в комментариях на ФКТ, на гитхабе или воспользоваться страницей обратной связи. Удачного поиска, друзья!

@iprst
Copy link
Collaborator Author

iprst commented Jun 28, 2023

Если что-то нужно править, добавлять, удалять или уточнять, смело это делайте.

@audetv
Copy link
Collaborator

audetv commented Jun 28, 2023

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

Я уже неоднократно пользовался этим способом сегодня, что даже уже появилась мысль, сделать кнопку-ссылку типа: «посмотреть параграфы рядом 3, 5,10»

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

Думаю в сторону объединения мелких параграфов, примерно по такому алгоритму (это надо сделать на уровне парсера, до попадения в БД и мантикору):
после получения массива обработанных параграфов со вставленными сносками, провести следующую обработку,

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

Звучит вроде просто, надо попробовать.

Еще подумал, надо ли нам где либо указать список книг которые присутствуют в поиске? Вроде бы полезно, думаю.

@iprst
Copy link
Collaborator Author

iprst commented Jun 28, 2023

Я уже неоднократно пользовался этим способом сегодня, что даже уже появилась мысль, сделать кнопку-ссылку типа: «посмотреть параграфы рядом 3, 5,10»

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

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

Кажется избыточным, думаю нет острой необходимости.

Уже есть небольшая ОС в новой теме от Ф. Владимира:

Попробовал поиск по вхождению "полная функция управления" и под меткой #5941 только это и нашлось и еще как мне кажется там есть не очень адекватные результаты поиска:
https://svodd.ru/5OlbX15p

Речь, по видимому, о заголовке. Кстати по его ссылке также виден крупный шрифт, тег пролез.

@iprst
Copy link
Collaborator Author

iprst commented Jun 28, 2023

Думаю в сторону объединения мелких параграфов, примерно по такому алгоритму (это надо сделать на уровне парсера, до попадения в БД и мантикору): после получения массива обработанных параграфов со вставленными сносками, провести следующую обработку,

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

Звучит вроде просто, надо попробовать.

Вроде логично, но скорее всего скорость обработки весьма просядет. Во время парсинга как передаётся параграф? Быть может есть какая-то метка о размере текста в байтах или её можно откуда-то получить?

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

@iprst
Copy link
Collaborator Author

iprst commented Jun 28, 2023

Выделил в отдельный issue обработку длинных параграфов

@audetv
Copy link
Collaborator

audetv commented Jun 28, 2023

Товарищи!

Мы запустили поисковик по текстам толстых книг ВП СССР ★ https://kob.svodd.ru
...

Обновил главную страницу

@iprst
Copy link
Collaborator Author

iprst commented Jun 28, 2023

Обновил главную страницу

Создал обсуждение поиск по толстым книгам ВП СССР где пользователи могут оставлять непосредственно свои вопросы и пожелания. Думаю ссылку на главной можно отправить прямо в эту дискуссию.

@audetv
Copy link
Collaborator

audetv commented Jun 28, 2023

Речь, по видимому, о заголовке. Кстати по его ссылке также виден крупный шрифт, тег пролез.

результат поиска содержит только поисковый запрос, что кончено странно, но нормально, с точки зрения поискового алгоритма #5941

Создал обсуждение поиск по толстым книгам ВП СССР где пользователи могут оставлять непосредственно свои вопросы и пожелания. Думаю ссылку на главной можно отправить прямо в эту дискуссию.

Обновил ещё раз текст на главной, убрал «попсу» в шапке, добавил ссылку на обсуждение , внизу, где перечисление фкт, гитхаб, обратная связь

@iprst
Copy link
Collaborator Author

iprst commented Jun 28, 2023

результат поиска содержит только поисковый запрос, что кончено странно, но нормально, с точки зрения поискового алгоритма #5941

Это заголовок или название таблицы, возможно строка списка.

@audetv
Copy link
Collaborator

audetv commented Jun 28, 2023

Похоже Это строка списка, я ранее их по номерам смотрел специально. Несколько параграфов назад есть параграф, заканчивается двоеточием. И после идут несколько таких коротких параграфов, но они заканчиваются точкой. (с точкой с запятой было бы проще распарсить) в общем смотрел на них и понятно, что список, но как составить алгоритм, не знаю пока. Как то соотношение длин надо учитывать, видимо.

@audetv
Copy link
Collaborator

audetv commented Jun 28, 2023

Алгоритм, чтобы спарсить такие записи, как список.

@iprst
Copy link
Collaborator Author

iprst commented Jun 28, 2023

Ага. Странно что нет открывающего символа. А из xml список не достать? Или тут вообще оформление отсутствует, такое типографское решение автора.

@audetv
Copy link
Collaborator

audetv commented Jun 28, 2023

Да, надо источник docx посмотреть.

@iprst
Copy link
Collaborator Author

iprst commented Jun 28, 2023

Да, надо источник docx посмотреть.

В оригинале там нумерованный список. Проверял файл, который лежит непосредственно в репозитории.

@audetv
Copy link
Collaborator

audetv commented Jun 28, 2023

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

Добавил ссылки на параграфы рядом

Upd: но похоже, что мне не нравится, хочется слева: назад 3,5,10, а справа, где сейчас параграфы рядом, чтобы было вперёд 3,5,10. И можно читать книгу)

@iprst
Copy link
Collaborator Author

iprst commented Jun 28, 2023

хочется слева: назад 3,5,10, а справа, где сейчас параграфы рядом, чтобы было вперёд 3,5,10

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

Потестировал ещё результаты. Можно сделать одну единственную кнопку «контекст», которая будет вмещать установленное число параграфов в обе стороны, на первый взгляд достаточно по три штуки вперёд и назад. Этой кнопкой может быть прямо номер комментария. В странице выдачи контекста можно убрать заголовки, нумерацию и вообще всё остальное оформление блоков, текст разделять лишь пустой строкой, как в книге. Восприниматься будет чище и легче.

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

Что в принципе более эффективно (или вообще возможно) — найти и установить другой шаблон для общей книжной выдачи, или доработать текущий?

@iprst
Copy link
Collaborator Author

iprst commented Jun 28, 2023

Как-то так можно оформить поисковую выдачу по книгам.

Номера параграфов — ссылки на страницу контекста. Названия книг в подписи под цитатами.

Картинка  

image

@audetv
Copy link
Collaborator

audetv commented Jul 3, 2023

Подключил на локальном 7733 книг и запустил фронетнед:
Сделал форк поиска по книгам коб, в общем то немного изменил настройки и все работает, на локальном. Дальше буду пробовать на сервере запускать. Возможно завтра сделаю.

По союзу и выдало 9 694 216 записей

2023-07-03_23-03-38

Потом зачем-то поискал крымский мост

2023-07-03_23-07-42

Работаем.

@iprst
Copy link
Collaborator Author

iprst commented Jul 3, 2023

Подключил на локальном 7733 книг и запустил фронетнед:

Отлично.

Потом зачем-то поискал крымский мост

Я думаю в мире довольно много мостов, носящих такое название, в топонимах это распространённый подход.

По выдаче если оценивать, то уже пришёл момент изучать score и другие методы оценки полезности элементов внутри мантикоры, которые формируют очерёдность показа записей.

@audetv
Copy link
Collaborator

audetv commented Jul 3, 2023

Я думаю в мире довольно много мостов, носящих такое название, в топонимах это распространённый подход.

Это да, согласен, просто стало интересно и почитал пару страниц выдачи)

По выдаче если оценивать, то уже пришёл момент изучать score и другие методы оценки полезности элементов внутри мантикоры, которые формируют очерёдность показа записей.

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

@iprst
Copy link
Collaborator Author

iprst commented Jul 3, 2023

Возможно, но пока не готов)

Это не было заданием )) Просто размышление, самому интересно. Так то в уме уже много костылей, просто если всё есть в стандартном функционале, логично использовать его.

@iprst
Copy link
Collaborator Author

iprst commented Jul 5, 2023

Подключил на локальном 7733 книг и запустил фронетнед

Вижу функциональный фронтенд уже работает на поддомене, можно осуществлять поиск по книгам.

Пока не собирал локальную базу 7733, поэтому сложно сравнить результаты выдачи с локальными, но кажется что в некоторых случаях находится больше результатов, чем в стандартных локальных запросах даже на базе с дубликатами. Видимо подключены словоформы?

@audetv
Copy link
Collaborator

audetv commented Jul 5, 2023

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

Например запрос: Сталин.
Будет очень долго обрабатываться. Или: Москва, там десятки тысяч результатов, и сервер не справляется)

@iprst
Copy link
Collaborator Author

iprst commented Jul 5, 2023

Например запрос: Сталин.
Будет очень долго обрабатываться

Да. Где-то минуту шустрил по базе и выдал 223420 результатов.
Локально (но на старой базе 8480) находится лишь 146771 результат, правда за пару секунд.
Смущает разница в размерах выдачи. Со временем запроса всё понятно.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants