Как представить таблицы сопряжения в C #
Я проектирую лингвистический анализатор для французского текста. У меня есть словарь в формате XML, который выглядит так:
Извинитак долго, но этоНеобходимо точно показать, как моделируются данные (древовидная структура).
В настоящее время я используюstructs
моделировать таблицы сопряжения, вложенныеstructs
быть более конкретным. Вот класс, который я создал для моделирования того, чтоодна запись в файле XML: я
class Word
{
public string word { get; set; }
public bool aspirate { get; set; }
public List forms { get; set; }
struct GrammaticalForms
{
public string form { get; set; }
public string definition { get; set; }
}
struct NounForms
{
public string gender { get; set; }
public string masculinSingular { get; set; }
public string femininSingular { get; set; }
public string masculinPlural { get; set; }
public string femininPlural { get; set; }
}
struct AdjectiveForms
{
public string masculinSingular { get; set; }
public string femininSingular { get; set; }
public string masculinPlural { get; set; }
public string femininPlural { get; set; }
public string nonAspirate { get; set; }
public string location { get; set; }
}
struct VerbForms
{
public string group { get; set; }
public string auxillary { get; set; }
public string[] prepositions { get; set; }
public bool transitive { get; set; }
public string pronominalForm { get; set; }
struct IndicativePresent
{
public string firstPersonSingular { get; set; }
public string secondPersonSingular { get; set; }
public string thirdPersonSingular { get; set; }
public string firstPersonPlural { get; set; }
public string secondPersonPlural { get; set; }
public string thirdPersonPlural { get; set; }
}
struct IndicativeSimplePast
{
public string firstPersonSingular { get; set; }
public string secondPersonSingular { get; set; }
public string thirdPersonSingular { get; set; }
public string firstPersonPlural { get; set; }
public string secondPersonPlural { get; set; }
public string thirdPersonPlural { get; set; }
}
struct IndicativePresentPerfect
{
public string firstPersonSingular { get; set; }
public string secondPersonSingular { get; set; }
public string thirdPersonSingular { get; set; }
public string firstPersonPlural { get; set; }
public string secondPersonPlural { get; set; }
public string thirdPersonPlural { get; set; }
}
struct IndicativePastPerfect
{
public string firstPersonSingular { get; set; }
public string secondPersonSingular { get; set; }
public string thirdPersonSingular { get; set; }
public string firstPersonPlural { get; set; }
public string secondPersonPlural { get; set; }
public string thirdPersonPlural { get; set; }
}
struct IndicativeImperfect
{
public string firstPersonSingular { get; set; }
public string secondPersonSingular { get; set; }
public string thirdPersonSingular { get; set; }
public string firstPersonPlural { get; set; }
public string secondPersonPlural { get; set; }
public string thirdPersonPlural { get; set; }
}
struct IndicativePluperfect
{
public string firstPersonSingular { get; set; }
public string secondPersonSingular { get; set; }
public string thirdPersonSingular { get; set; }
public string firstPersonPlural { get; set; }
public string secondPersonPlural { get; set; }
public string thirdPersonPlural { get; set; }
}
struct IndicativeFuture
{
public string firstPersonSingular { get; set; }
public string secondPersonSingular { get; set; }
public string thirdPersonSingular { get; set; }
public string firstPersonPlural { get; set; }
public string secondPersonPlural { get; set; }
public string thirdPersonPlural { get; set; }
}
struct IndicativePastFuture
{
public string firstPersonSingular { get; set; }
public string secondPersonSingular { get; set; }
public string thirdPersonSingular { get; set; }
public string firstPersonPlural { get; set; }
public string secondPersonPlural { get; set; }
public string thirdPersonPlural { get; set; }
}
struct SubjunctivePresent
{
public string firstPersonSingular { get; set; }
public string secondPersonSingular { get; set; }
public string thirdPersonSingular { get; set; }
public string firstPersonPlural { get; set; }
public string secondPersonPlural { get; set; }
public string thirdPersonPlural { get; set; }
}
struct SubjunctivePast
{
public string firstPersonSingular { get; set; }
public string secondPersonSingular { get; set; }
public string thirdPersonSingular { get; set; }
public string firstPersonPlural { get; set; }
public string secondPersonPlural { get; set; }
public string thirdPersonPlural { get; set; }
}
struct SubjunctiveImperfect
{
public string firstPersonSingular { get; set; }
public string secondPersonSingular { get; set; }
public string thirdPersonSingular { get; set; }
public string firstPersonPlural { get; set; }
public string secondPersonPlural { get; set; }
public string thirdPersonPlural { get; set; }
}
struct SubjunctivePluperfect
{
public string firstPersonSingular { get; set; }
public string secondPersonSingular { get; set; }
public string thirdPersonSingular { get; set; }
public string firstPersonPlural { get; set; }
public string secondPersonPlural { get; set; }
public string thirdPersonPlural { get; set; }
}
struct ConditionalPresent
{
public string firstPersonSingular { get; set; }
public string secondPersonSingular { get; set; }
public string thirdPersonSingular { get; set; }
public string firstPersonPlural { get; set; }
public string secondPersonPlural { get; set; }
public string thirdPersonPlural { get; set; }
}
struct ConditionalFirstPast
{
public string firstPersonSingular { get; set; }
public string secondPersonSingular { get; set; }
public string thirdPersonSingular { get; set; }
public string firstPersonPlural { get; set; }
public string secondPersonPlural { get; set; }
public string thirdPersonPlural { get; set; }
}
struct ConditionalSecondPast
{
public string firstPersonSingular { get; set; }
public string secondPersonSingular { get; set; }
public string thirdPersonSingular { get; set; }
public string firstPersonPlural { get; set; }
public string secondPersonPlural { get; set; }
public string thirdPersonPlural { get; set; }
}
struct ImperativePresent
{
public string secondPersonSingular { get; set; }
public string firstPersonPlural { get; set; }
public string secondPersonPlural { get; set; }
}
struct ImperativePast
{
public string secondPersonSingular { get; set; }
public string firstPersonPlural { get; set; }
public string secondPersonPlural { get; set; }
}
struct Infinitive
{
public string present { get; set; }
public string past { get; set; }
}
struct Participle
{
public string present { get; set; }
public string past { get; set; }
}
}
}
я новичок в C #, и яЯ не слишком знаком со структурами данных. Основываясь на моих ограниченных знаниях C ++, я знаю, чтоstructs
полезны, когда вы моделируете небольшие, тесно связанные между собой фрагменты данных, поэтому в настоящее время я использую их таким образом.
Все эти структуры могут быть реально превращены вConjugationTables class
и будет иметь в высокой степени ту же структуру. Я'Я не уверен, следует ли превратить их в класс или использовать другую структуру данных, которая лучше подходит для этой проблемы. Чтобы дать больше информации о спецификациях проблемы, яскажу следующее:
IndicativePresent
должны быть вложены вVerbForms
; то же самое относится ко всем другим структурам, которые являются членамиVerbForms
структура. Это спряжениетаблицы в конце концов!Пожалуй самое важное: Мне нужно организовать данные таким образом, чтобы, например,Word
в файле XML нетGrammaticalForm
изглагол, это неVerbForms
Структура будет фактически создана для этой записи. Это в целях повышения эффективности - зачем создаватьVerbForms
если слово на самом деле не глагол? Эта идея избежать ненужного создания этих "формы» таблицы (которые в настоящее время представлены какstruct XXXXXForms
) абсолютно необходимо.В соответствии с (прежде всего) пунктом# 4 выше, какие структуры данных лучше всего использовать при моделировании сопряжениятаблицы (небаза данных таблицы)? Нужно ли менять формат моих данных, чтобы соответствовать # 4? Если я создаюnew Word
Будут ли структуры, в их текущем состоянии, также созданы и займут много места? Вот'какая-то математика ... после того, как погуглить и в конце концов найтиэтот вопрос...
Во всех таблицах спряжения (существительные, прилагательные, глаголы) есть общее количество (совпадение?)100 string
S выделены, и это пустые. Так100 х18 байт =1800 байт для каждогоWord
Как минимум, если эти структуры данных созданы и остаются пустыми (всегда будут какие-то издержки для значений, которые фактически будут заполнены). Таким образом, предполагая (просто случайно, может быть более или менее)50000 Word
Это должно быть в памяти, это90 миллионов байтили примерно85,8307 мегабайт.
Тот'много накладных расходов только на пустые таблицы. Так как же я могу собрать эти данные, чтобы позволить мне создаватьтолько определенные таблицы (существительное, прилагательное, глагол) в зависимости откакиеGrammaticalForms
Word
на самом деле имеет (в файле XML).
Я хочу, чтобы эти таблицы были членамиWord
класс, но только создавать экземпляры таблиц, которые мне нужны. Я могу'не думаю об этом, и теперь, когда я сделал математику наstructs
Я знаю, что этоне очень хорошее решение. Моя первая мысль состоит в том, чтобы сделать класс для каждого типа,NounForms
AdjectiveForms
, а такжеVerbForms
и создать экземпляр класса, если форма появляется в файле XML. Я'я не уверен, что это правильно, хотя ...
Какие-либо предложения?