Можно ли использовать DAWG для хранения вспомогательной информации, относящейся к каждому пути, например. частотность слова в английском языке? Если да, то как я могу это сделать?
Можно ли использовать DAWG для хранения информации, связанной со словами?
Ответы (3)
Как правило, вы не можете хранить информацию о словах в DAWG так же, как в дереве или другой структуре данных. Причина этого в том, что несколько разных слов в DAWG могут иметь общие узлы, поэтому существует риск того, что информация для одного слова «просочится» в информацию для других слов.
В качестве простого примера предположим, что у нас есть DAWG для слов «is», «as», «i» и «a». В этом случае DAWG будет выглядеть так:
START
a / \ i
ACC ACC
s \ / s
ACC
Обратите внимание, что узел, представляющий слова «как» и «есть», является одним и тем же узлом. Следовательно, если бы вы попытались аннотировать слово «как» информацией, узел, содержащий эту информацию, также был бы таким же, как узел для «есть», что означает, что «как» и «есть» оба получат одно и то же. набор информации.
Вы можете попытаться обойти это, сохранив карту в узле для «как» и «есть», которая сопоставляет слово, оканчивающееся в этом узле, с дополнительной информацией об этом слове, но это резко увеличивает использование памяти DAWG. Теперь вы сохраняете каждый символ в слове, поэтому использование вашей памяти увеличится (помните, что весь смысл DAWG состоит в том, чтобы уменьшить использование памяти, необходимое для хранения набора слов). Лучше просто хранить хеш-таблицу, которая отображает слова в информацию.
Другим вариантом, который вы можете попробовать сохранить эту информацию, будет расширение каждого пути через DAWG в отдельную ветвь, чтобы узлы для разных слов всегда были разными. Однако проблема с этим подходом заключается в том, что вы эффективно конвертируете DAWG обратно в дерево, что значительно увеличивает задействованное использование памяти.
Короче говоря, нет простого способа аннотировать слова в DAWG метаинформацией без значительного увеличения использования памяти. Если вам нужно это сделать, вам лучше использовать другую структуру данных.
Надеюсь это поможет!
Да, вообще говоря, ориентированный ациклический взвешенный граф (DAWG) может быть аннотирован либо по узлу, либо по ребру, либо по более сложной структуре, такой как заданный путь, который я возьму из последовательности узлов и рёбер. Вы можете подклассировать существующую структуру, чтобы включить эту информацию, или, если это невозможно, вы можете хэшировать структуру в аннотацию.
Да, ты можешь. Каждый путь от начала dawg до конца слова уникален, и этот путь можно индексировать как целое число. Затем этот номер индекса может быть сопоставлен со вспомогательной информацией.
См. статью здесь: http://www.ic.unicamp.br/~reltech/1992/92-01.pdf См. хорошую реализацию здесь: https://github.com/WojciechMula/pyDAWG/blob/master/dawg_mph.c#L37