LINUX.ORG.RU

Помогите придумать систему организации и ведения данных (формат записи, базу данных, etc...)

 , ,


0

2

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

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

Суть проблемы в том, что непонятно как все это хранить/организовать. На данный момент не придумалось ничего лучше, чем искать токены в оригинальной фразе и высирать текстовые файлики с правилами для матчинга этих токенов, т.е. в данном примере будет создано 5 файлов: красный.txt, заяц.txt, вымя.txt, болгария.txt, перец.txt, внутри которых изобретается свой синтаксис вида, который бы и хотелось как-то в более человеческий вид оформить:

^перц - префикс
пере[чц] - корень
!перецел - стоп-слово (перецелованный)
!имперец - еще стоп-слово
*черный молотый перец - возможное определение
*черный перец горошком - еще определение
=Специя, добавляемая людьми в пищу для придания пище острого вкуса или особого аромата
=Вид овоща, выращиваемого для салатов или в качестве основы для соусов и приправ
=Что-то, что имеет особенности или свойства перца, к примеру Перечная Мята
+специи, кулинария, пища людей

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

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

Придумало ли человечество что-то такое, где можно было бы все это вести красиво? Или стоит взять mysql и начать велосипедить, а все файлики заменить на таблицы и надеяться, что схема не поменяется? Может быть использовать что-то хипстерское на безсхемной основе? Я не умею в SQL (умею простые запросы, а такое мне непонятно как представить).

Может быть еще уже существуют подобные базы/словари?

Парсер на Perl/AWK, манипулирование парсеровского хлама --> SQL [MariaDB]

bookman900 ★★★★★ ()
Ответ на: комментарий от bookman900

Ну проблем с написанием парсера (токенизатора) нет, а вот как этот хлам укладывать? В этом и есть задача.

SkynetCreator ()
Ответ на: комментарий от SkynetCreator

Можно хранить не хлам, а все разобранные слова. Как это делать и что это вообще, можно узнать тут. И вы еще как-то странно матчите пере[ц|ч] не должно матчить имперец, если пере[ц|ч] - префикс.

rk17 ()
Ответ на: комментарий от SkynetCreator

А можете объяснить, что именно за хлам? Может быть удобнее тогда хранить в виде документов? (MongoDB) или просто как набор записей без таблицы (Графовые БД)

bookman900 ★★★★★ ()

Или стоит взять mysql и начать велосипедить, а все файлики заменить на таблицы и надеяться, что схема не поменяется?

А что значит надеяться? Схему ты пишешь.

Может быть использовать что-то хипстерское на безсхемной основе?

Можно. Сэкономишь на спичках, а потом огребёшь по полной на сопровождении. Подучи таки лучше SQL, лишним в жизни не будет.

hobbit ★★★★★ ()

Ужс какой, даже не представляю что за монстра вы там готовите у себя на кухне:)
Зачем вам изобретать велосипеды? Есть простой детектер «понимания». Откройте, например, реализацию стемминга для разных языков у люцены
https://github.com/apache/lucene-solr/tree/master/lucene/analysis/common/src/... (если лень переводить юникод-символы, смотрите сразу реализацию для английского, будет понятнее). Или выберите какой-либо анализатор на близком для вас языке, и смотрите его реализацию.
Если вы чувствуете что ничего не понимаете, значит вам точно не нужно изобретать велосипед, ведь судя по фразам

По слову «перец» будет матчится в том числе слово «имперец» и «перецелован»
Суть проблемы в том, что непонятно как все это хранить/организовать.
внутри которых изобретается свой синтаксис вида

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

Придумало ли человечество что-то такое, где можно было бы все это вести красиво?

Да, придумало. И это называется системами полнотекстового поиска. ElasticSearch/Sphinx/etc — сотни их.

znenyegvkby ()
Ответ на: комментарий от znenyegvkby

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

Iron_Bug ★★★★ ()
Последнее исправление: Iron_Bug (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.