简单来说,特征结构是属性 - 值对的无序列表。
[number:sg, person:3 | _ ],
可以嵌入:
[cat:np, agr:[number:sg, person:3 | _ ] | _ ],
可以对内容进行子索引并共享值
[number:[1], person:3 | _ ],
其中[1]是另一个特征结构(也就是说,它允许重入)。
我的问题是:人们认为应该实现哪些数据结构以便以后访问值,在2 fts之间执行统一,“键入”它们等等。
有一本关于此的完整书籍,但它在lisp中,这简化了列表处理。所以,我的选择是:列表的哈希,列表列表或者trie。人们对此有何看法?
答案 0 :(得分:1)
稍微考虑什么构成价值。 我会尝试最简单的方法:
typedef struct value {
enum { INT, BOOL, STRING, FEATURE_STRUCTURE } ty;
union {
int int;
bool bool;
char *string;
struct fs *feature_structure;
} u;
} *Value;
typedef struct fs * { // list of pairs; this rep could change
struct avpair *pair;
Value value;
} *Feature_Structure;
struct avpair {
const char *attribute;
Value value;
};
你需要一堆构造函数,比如
Value mkBool(bool p) {
Value v = malloc(sizeof(*v));
assert(v);
v->ty = BOOL;
v->u.bool = p;
return v;
}
此时你可以开始做生意了。如果“对列表”结果不是正确的表示,您可以更改它。如果不知道您计划的操作或您对成本模型的期望,我会从这里开始。然后,如果你需要转向更高效的东西,我可能会使用三元搜索树来表示一个特征结构,并为Value
保留相同的表示。