分层数据的关系数据库设计?
Relational database design for hierarchical data?
我正在尝试设计一个数据库来充当语言词典,其中每个单词不仅与其定义相关联,还与其语法 "taxon" 相关联。例如,它应该看起来像这样:
"eat": verb.imperative
"eat": verb.present
"ate": verb.past
"he": pronoun.masculine.singular
"she": pronoun.feminine.singular
"heiress": noun.feminine.singular
"heirs": noun.masculine.plural
"therefore": adverb
"but": conjunction
似乎一个自然的数据结构来保存这样一个语法 "taxonomy" 应该是某种树或图。虽然我还没有考虑清楚,但我认为应该可以更轻松地执行
类型的查询
plural OF masculine OF "heiress" -> "heirs"
然而,在这一点上,我只是试图想出一种将此类字典存储在常规关系数据库(即 LibreOffice Base)中的最低效方法。您建议数据模式应该是什么样的?有没有比蛮力方法更有效的方法,在这种方法中,我拥有与语法类型和子类型一样多的布尔列?例如,"she" 对于代词、阴性和单数列为真,但对于所有其他列(动词、副词、连词等)为假?
这是一个非常开放的问题,有很多应用和很多相关研究。结合我用过的软件,给大家指点一下。
一列是词位,例如 "eat." 第二列是词性,在您上面的数据中,它是一个字符串或其他标识符,显示它是否是动词、代词, 名词, 副词或连词。
为动词信息创建另一个 table 可能有意义。例如,时态、方面和情绪可能各自是单独的列。但是这些列只对动词有意义。对于名词 table,这些列将包括数字(单数、复数)和性别,也许还有它是否是 count or mass noun。代词也包括人称(第一人称、第二人称或第三人称)。
您打算包括每个单词的所有形式吗?例如,这个数据库会存储 "eats" 和 "eating" 以及 "jumps" 和 "jumping?" 存储像“-s”这样的规则更有效-ing”代表进步。那么如果有例外的话,比如"ate,"就可以描述为具有"eat"+“-ed”的底层形式。该规则将在 "eat" 词素下,并且不会有单独的 "ate" 条目。
还有一些规则,例如复数将以y结尾的词变成-ies。这将在复数名词后缀(“-s”)下,而不是单个动词下。
考虑到这些因素,我对您的问题提供了一个更具体的答案:不,我不认为这种数据最好是分层描述,也不是用树或图来描述,而是分析和关联。 LibreOffice Base 将是此类相当简单的项目的合理选择,它使用宏来帮助处理。
因此:
"heiress" -> masculine plural = "heirs"
首先要做的是将 "heiress" 分析为 "heir" + 阴性。然后通过组合 "heir" 和“-s.”
组成所需的字形
我打算添加一个相关软件列表,例如 Python NLTK,但一方面,可用软件列表几乎是无止境的,另一方面,软件推荐与 Whosebug 无关。
我正在尝试设计一个数据库来充当语言词典,其中每个单词不仅与其定义相关联,还与其语法 "taxon" 相关联。例如,它应该看起来像这样:
"eat": verb.imperative
"eat": verb.present
"ate": verb.past
"he": pronoun.masculine.singular
"she": pronoun.feminine.singular
"heiress": noun.feminine.singular
"heirs": noun.masculine.plural
"therefore": adverb
"but": conjunction
似乎一个自然的数据结构来保存这样一个语法 "taxonomy" 应该是某种树或图。虽然我还没有考虑清楚,但我认为应该可以更轻松地执行
类型的查询plural OF masculine OF "heiress" -> "heirs"
然而,在这一点上,我只是试图想出一种将此类字典存储在常规关系数据库(即 LibreOffice Base)中的最低效方法。您建议数据模式应该是什么样的?有没有比蛮力方法更有效的方法,在这种方法中,我拥有与语法类型和子类型一样多的布尔列?例如,"she" 对于代词、阴性和单数列为真,但对于所有其他列(动词、副词、连词等)为假?
这是一个非常开放的问题,有很多应用和很多相关研究。结合我用过的软件,给大家指点一下。
一列是词位,例如 "eat." 第二列是词性,在您上面的数据中,它是一个字符串或其他标识符,显示它是否是动词、代词, 名词, 副词或连词。
为动词信息创建另一个 table 可能有意义。例如,时态、方面和情绪可能各自是单独的列。但是这些列只对动词有意义。对于名词 table,这些列将包括数字(单数、复数)和性别,也许还有它是否是 count or mass noun。代词也包括人称(第一人称、第二人称或第三人称)。
您打算包括每个单词的所有形式吗?例如,这个数据库会存储 "eats" 和 "eating" 以及 "jumps" 和 "jumping?" 存储像“-s”这样的规则更有效-ing”代表进步。那么如果有例外的话,比如"ate,"就可以描述为具有"eat"+“-ed”的底层形式。该规则将在 "eat" 词素下,并且不会有单独的 "ate" 条目。
还有一些规则,例如复数将以y结尾的词变成-ies。这将在复数名词后缀(“-s”)下,而不是单个动词下。
考虑到这些因素,我对您的问题提供了一个更具体的答案:不,我不认为这种数据最好是分层描述,也不是用树或图来描述,而是分析和关联。 LibreOffice Base 将是此类相当简单的项目的合理选择,它使用宏来帮助处理。
因此:
"heiress" -> masculine plural = "heirs"
首先要做的是将 "heiress" 分析为 "heir" + 阴性。然后通过组合 "heir" 和“-s.”
组成所需的字形我打算添加一个相关软件列表,例如 Python NLTK,但一方面,可用软件列表几乎是无止境的,另一方面,软件推荐与 Whosebug 无关。