DAWG可以用来存储与字相关的信息吗?

时间:2012-12-24 19:58:39

标签: c++ data-structures dawg

DAWG是否可用于存储与每条路径相关的辅助信息,例如一个单词在英语中的频率?如果是,那我该怎么做?

3 个答案:

答案 0 :(得分:2)

是的,一般来说,有向非循环加权图(DAWG)可以通过节点,边缘或更复杂的结构(例如给定路径)进行注释,我将采用一系列节点和边。您可以将现有结构子类化以包含此信息,或者如果不可能,则可以从结构哈希到注释。

答案 1 :(得分:2)

通常,您不能以与在trie或其他数据结构中相同的方式将每个单词信息存储在DAWG中。这样做的原因是DAWG中的多个不同单词可能都共享节点,因此存在一个单词的信息“泄漏”为其他单词的信息的风险。

作为一个简单的例子,假设我们有一个DAWG用于单词“is”,“as”,“i”和“a”。在这种情况下,DAWG看起来像这样:

                     START
                  a /     \ i
                   ACC    ACC
                 s  \     / s                        
                      ACC

请注意,表示单词“as”和“is”的节点是完全相同的节点。因此,如果您尝试使用信息对“as”一词进行注释,则保存该信息的节点也将与“is”的节点相同,这意味着“as”和“is”都会选择相同的一组信息。

您可以尝试通过在节点中存储“as”和“is”来映射,从该节点结束的单词映射到该单词的额外信息,但这会大大增加内存的使用量。 DAWG。您现在正在将每个字符存储在单词中,因此您的内存使用量将会上升(请记住,DAWG的重点是减少存储一组单词所需的内存使用量)。你最好只存储一个从单词映射到信息的哈希表。

您可能尝试存储此信息的另一个选项是将通过DAWG的每条路径扩展到其自己的分支中,以便不同单词的节点始终不同。但是,这种方法的问题在于,您正在有效地将DAWG转换回trie,从而大大增加了所涉及的内存使用量。

简而言之,没有直接的方法来使用元信息在DAWG中注释单词而不会大幅增加内存使用量。如果必须这样做,最好使用不同的数据结构。

希望这有帮助!

答案 2 :(得分:0)

是的,你可以。从dawg开始到word结尾的每条路径都是唯一的,并且该路径可以被索引为整数。然后可以将该索引号映射到辅助信息。

请参阅此处的论文:http://www.ic.unicamp.br/~reltech/1992/92-01.pdf 请参阅此处的良好实施:https://github.com/WojciechMula/pyDAWG/blob/master/dawg_mph.c#L37

相关问题