wordnet_lmf/
lib.rs

1pub type S = Box<str>;
2
3pub type V<T> = Box<[T]>;
4
5#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
6pub struct File {
7    #[serde(rename = "Lexicon")]
8    pub lexicons: V<Lexicon>,
9}
10
11#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
12pub struct Lexicon {
13    pub id: S,
14    pub label: S,
15    pub language: S,
16    pub email: S,
17    pub license: S,
18    pub version: S,
19    pub url: S,
20
21    #[serde(rename = "LexicalEntry")]
22    pub lexical_entries: V<LexicalEntry>,
23
24    #[serde(rename = "Synset")]
25    pub synsets: V<Synset>,
26}
27
28#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
29pub struct LexicalEntry {
30    pub id: S,
31    #[serde(rename = "Lemma")]
32    pub lemma: Lemma,
33    #[serde(rename = "Form", default)]
34    pub forms: V<Form>,
35    #[serde(rename = "Sense")]
36    pub senses: V<Sense>,
37}
38
39#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
40pub struct Lemma {
41    #[serde(rename = "writtenForm")]
42    pub written_form: S,
43    #[serde(rename = "partOfSpeech")]
44    pub part_of_speech: PartOfSpeech,
45}
46
47#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
48pub struct Form {
49    #[serde(rename = "writtenForm")]
50    pub written_form: S,
51}
52
53#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
54pub struct Sense {
55    pub id: S,
56    pub synset: S,
57    #[serde(rename = "SenseRelation", default)]
58    pub relations: V<SenseRelation>,
59}
60
61#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
62pub struct SenseRelation {
63    #[serde(rename = "relType")]
64    pub rel_type: RelationType,
65    pub target: S,
66}
67
68#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
69pub struct Synset {
70    pub id: S,
71    #[serde(rename = "partOfSpeech")]
72    pub part_of_speech: PartOfSpeech,
73    #[serde(rename = "Definition")]
74    pub definitions: V<S>,
75    #[serde(rename = "Example", default)]
76    pub examples: V<S>,
77    #[serde(rename = "SynsetRelation", default)]
78    pub relations: V<SynsetRelation>,
79}
80
81#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
82pub struct SynsetRelation {
83    #[serde(rename = "relType")]
84    pub rel_type: RelationType,
85    pub target: S,
86}
87
88#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
89pub enum PartOfSpeech {
90    #[serde(rename = "a")]
91    Adjective,
92    #[serde(rename = "s")]
93    AdjectiveSatellite,
94    #[serde(rename = "r")]
95    Adverb,
96    #[serde(rename = "n")]
97    Noun,
98    #[serde(rename = "v")]
99    Verb,
100}
101
102#[derive(Clone, Debug, PartialEq, serde::Deserialize)]
103#[serde(rename_all = "snake_case")]
104pub enum RelationType {
105    Also,
106    Antonym,
107    Attribute,
108    Causes,
109    Derivation,
110    DomainRegion,
111    DomainTopic,
112    Entails,
113    Exemplifies,
114    HasDomainRegion,
115    HasDomainTopic,
116    HoloMember,
117    HoloPart,
118    HoloSubstance,
119    Hypernym,
120    Hyponym,
121    InstanceHypernym,
122    InstanceHyponym,
123    IsCausedBy,
124    IsEntailedBy,
125    IsExemplifiedBy,
126    MeroMember,
127    MeroPart,
128    MeroSubstance,
129    Participle,
130    Pertainym,
131    Similar,
132}
133
134impl File {
135    pub fn open(path: impl AsRef<std::path::Path>) -> Result<Self, quick_xml::de::DeError> {
136        use serde::de::Error;
137        let file = std::fs::File::open(path).map_err(quick_xml::de::DeError::custom)?;
138        quick_xml::de::from_reader(std::io::BufReader::new(file))
139    }
140}