Задача стоит следующим образом. Есть в базе данных таблица терминов. Порядка 100 000 терминов. Много терминов состоят из двух и более слов. Например, "хлорид натрия".
Система примерно раз в час в бизнес-время добавляет новые документы в базу данных (каждый документ порядка 100 слов). При сохранении документа в базу данных нужно все термины в документе автоматически обрамить некоторым тегом, содержащим в атрибуте тэга идентификатор термина из таблицы терминов
Вопрос: как это сделать?
Делаем это для веб-сайта. В дальнейшем при отображении документа на веб-странице все термины должны преобразоваться на лету во вью-слое в ссылки на страницу термина.
Используемые технологии: база данных Postgres, также используем поисковый движок Lucene, возможно, его тоже можно как-то применить к этой задаче.
Рассмотренные нами варианты решения: 1) Простой:
Разбить входящий документ на слова, и для каждого слова находить его вхождение в таблицу терминов. Если нашел, обрамлять слово тегом. Вариант плох тем, что не учитывается морфология.
2) Учет морфологии:
К примеру, есть слово в документе "аллюминием". Для таких случаев думали модифицировать вариант из пункта 1 тем, что взять какую-то морфологическую библиотеку, найти для каждого слова именительный падеж (в данном случае "аллюминий"), и искать в таблице терминов по именительному падежу. Но тут есть проблема, что морфология может плохо работать для специальных терминов. Например, таких как "магальдрат". Я не знаю, как работают технологии морфологического разбора, но если они работают через словарь, то вряд-ли в словаре есть такие специальные термины. Поэтому если где-то будет в тексте слово "магальдратами", то не факт, что морфологией правильно будет найден именительный падеж.
3) Составные термины:
Допустим даже, если нашли даже библиотеку морфологии. Всплывает следующая проблема. Как быть с составными терминами? Например, тот же "хлорид натрия". Если там еще и он используется в каком-то падеже. Например, в тексте встречается "хлоридом натрия". Тут, во-первых, в именительном падеже это будет "хлорид натрий", а в таблице терминов это "хлорид натрия". Уже не совпадает. А во-вторых, уже не получится в исходном документе делать цикл по одному слову, так как термины бывают многословные.
4) Обратный проход:
Поэтому рисуется здесь обратное решение. Идти по всем 100 000 значениям таблицы терминов, и проверять вхождение каждого из них в документ. Это похоже на правильное решение. Но как быть тогда снова-таки с морфологией? Ведь в таблице терминов все в именительном падеже, а в документе в любом падеже.
Я уверен, что задача решаема. Ведь гугл ищет же комбинации слов с учетом морфологии. Подозреваю, что Lucen'ом можно будет эту задачу также решить.
Вопрос производительности здесь не критичный — возможна задержка в обработке документа хоть в несколько часов. Главное, чтобы тяжелая по ресурсам обработка не мешала жить основной части системы. Новые документы будут появляться примерно раз в час. Понятно, что для производительности лучше будет написать хранимую процедуру в БД, но можно ли морфологию использовать из хранимых процедур?
Вопрос точности тоже не критичный. Допускается пропуск некоторых слов, которые могли бы быть ссылкой. 80% терминов ссылками — это отличный результат.
Вобщем, подскажите, пожалуйста, как правильно разработать такое решение?
Re: Есть база терминов. Как в тексте документа найти вхождения всех терминов?
Здравствуйте, VetalB, Вы писали:
VB>Всем привет!
VB>Я уверен, что задача решаема.
конечно, решаема. морфология это вообще ерунда по сравнению с тем, что вас ждет, когда вы столкнетесь с закисью азота, которую нужно выдать по запросу веселящий газ. или от вас такого не требуют? вы упомянули хлорид натрия, известный как "поваренная соль".
морфология может работать и без словаря, но с поправкой на ветер. перекись и диперикись ацетона -- это два разных вещества. тут главное, чтобы машина не сказала, что самые популярные термины это мыть и какать. кстати, не шутка. например, "лишая" — это от слова "лишать" (глагол) или от слова "лишай" (существительное)? как здорово будет если мы ищем документы на медицинскую тему, а нам выдают что-то совершенно левое, причем в огромных количествах. причем, таких "вредных" терминов слишком много, чтобы от них отмахиваться.
VB> Ведь гугл ищет же комбинации слов с учетом морфологии.
вы когда родились? когда гугл только появился он на русском искал без учета. да и по английски выдавал в основном точное соответствие.
VB>Вопрос точности тоже не критичный. Допускается пропуск некоторых слов, которые могли бы быть ссылкой. 80% терминов ссылками — это отличный результат. VB>Вобщем, подскажите, пожалуйста, как правильно разработать такое решение?
как вы сами сказали -- 80% терминов можно найти и так. а вот что делать с остальными...
americans fought a war for a freedom. another one to end slavery. so, what do some of them choose to do with their freedom? become slaves.
Re: Есть база терминов. Как в тексте документа найти вхождения всех терминов?
Здравствуйте, VetalB, Вы писали:
VB>Всем привет!
VB>Задача стоит следующим образом. Есть в базе данных таблица терминов. Порядка 100 000 терминов. Много терминов состоят из двух и более слов. Например, "хлорид натрия".
VB>Система примерно раз в час в бизнес-время добавляет новые документы в базу данных (каждый документ порядка 100 слов). При сохранении документа в базу данных нужно все термины в документе автоматически обрамить некоторым тегом, содержащим в атрибуте тэга идентификатор термина из таблицы терминов
VB>Вопрос: как это сделать?
если нужно быстрее — используйте Solr. Если есть время — берите Lucene и встраивайте в свое приложение...
С уважением Denys Valchuk
IMHO чем больше мнений тем оптимальней выбор варианта... :)
Re[2]: Есть база терминов. Как в тексте документа найти вхождения всех терминов?
Здравствуйте, мыщъх, Вы писали:
VB>>Я уверен, что задача решаема. М>конечно, решаема. морфология это вообще ерунда по сравнению с тем, что вас ждет, когда вы столкнетесь с закисью азота, которую нужно выдать по запросу веселящий газ. или от вас такого не требуют? вы упомянули хлорид натрия, известный как "поваренная соль".
Нет, такого не требуют. Нужно искать только по словоформам терминов.
М>морфология может работать и без словаря, но с поправкой на ветер. перекись и диперикись ацетона -- это два разных вещества. тут главное, чтобы машина не сказала, что самые популярные термины это мыть и какать. кстати, не шутка. например, "лишая" — это от слова "лишать" (глагол) или от слова "лишай" (существительное)? как здорово будет если мы ищем документы на медицинскую тему, а нам выдают что-то совершенно левое, причем в огромных количествах. причем, таких "вредных" терминов слишком много, чтобы от них отмахиваться.
Ну, у нас преобладающие большинство терминов достаточно специфические. Поэтому если и будет небольшой процент неправильно проставленных ссылок, это не страшно. Тем более, что планируется модератор, который будет просматривать в том числе все ссылки и заменять некорректно проставленные.
VB>> Ведь гугл ищет же комбинации слов с учетом морфологии. М>вы когда родились? когда гугл только появился он на русском искал без учета. да и по английски выдавал в основном точное соответствие.
Больше 30 лет назад Ну, сейчас же уже ищет с морфологией, значит, есть готовые библиотеки, и их можно и нужно использовать
VB>>Вопрос точности тоже не критичный. Допускается пропуск некоторых слов, которые могли бы быть ссылкой. 80% терминов ссылками — это отличный результат. VB>>Вобщем, подскажите, пожалуйста, как правильно разработать такое решение? М>как вы сами сказали -- 80% терминов можно найти и так. а вот что делать с остальными...
"Так" как раз не получится. Так как большинство терминов в документах находятся не в именительном падеже. И составных терминов (из нескольких слов) почти половина.
Поэтому и вопрос — как построить алгоритм и какие технологии использвать? Идти по всем 100 000 терминам и искать вхождение в документ для каждого? Какие технологии использовать тогда для поиска с учетом морфологии? И не слишком ли — цикл по 100 000 записям из базы — может, можно придумать решения полегче?
Re[2]: Есть база терминов. Как в тексте документа найти вхождения всех терминов?
Здравствуйте, Denys V., Вы писали:
DV>если нужно быстрее — используйте Solr. Если есть время — берите Lucene и встраивайте в свое приложение...
Так в этом то и был мой вопрос! Lucene уже есть. Как его использовать? У меня ж обратная задача от поисковой.
По классике пользователь задает поисковый запрос, Lucene ищет список документов, который соответствует запросу.
У меня же фактически обратная задача — по одному документу найти те поисковые запросы (термины, в том числе многословные), по которым этот документ может найтись, и найти место вхождения запроса в документ.
А количество поисковых запросов (терминов) порядка 100 000. Вот и как сделать достаточно производительное решение?
Как решить мою задачу с помощью Lucene/Solr да и вообще?
Re: Есть база терминов. Как в тексте документа найти вхождения всех терминов?
P.S.: Здесь прошу обратить внимание на морфологию. В исходном справочнике терминов есть термин "хлорид натрия", а в документе этот термин в родительном падеже: "хлорида натрия". Также прошу учесть, что если найти именительный падеж от "хлорида натрия" по каждому слову, то мы получим "хлорид натрий", что не совпадает со значением в словаре терминов.