jpreprocess_core/pos/
meishi.rs

1use std::{fmt::Display, str::FromStr};
2
3use serde::{Deserialize, Serialize};
4
5use super::{POSKind, POSParseError};
6
7#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
8/// 名詞
9pub enum Meishi {
10    /// サ変接続
11    SahenSetsuzoku,
12    /// ナイ形容詞語幹
13    NaiKeiyoushiGokan,
14    /// 一般
15    General,
16    /// 引用文字列
17    QuoteStr,
18    /// 形容動詞語幹
19    KeiyoudoushiGokan,
20    /// 固有名詞
21    KoyuMeishi(KoyuMeishi),
22    /// 数
23    Kazu,
24    /// 接続詞的
25    Setsuzokushiteki,
26    /// 接尾
27    Setsubi(Setsubi),
28    /// 代名詞
29    Daimeishi(Daimeishi),
30    /// 動詞非自立的
31    DoushiHijiritsuteki,
32    /// 特殊
33    Special,
34    /// 非自立
35    Hijiritsu(MeishiHijiritsu),
36    /// 副詞可能
37    FukushiKanou,
38
39    /// \*
40    None,
41}
42
43impl Meishi {
44    pub fn from_strs(g1: &str, g2: &str, g3: &str) -> Result<Self, POSParseError> {
45        match g1 {
46            "サ変接続" => Ok(Self::SahenSetsuzoku),
47            "ナイ形容詞語幹" => Ok(Self::NaiKeiyoushiGokan),
48            "一般" => Ok(Self::General),
49            "引用文字列" => Ok(Self::QuoteStr),
50            "形容動詞語幹" => Ok(Self::KeiyoudoushiGokan),
51            "固有名詞" => KoyuMeishi::from_strs(g2, g3).map(Self::KoyuMeishi),
52            "数" => Ok(Self::Kazu),
53            "接続詞的" => Ok(Self::Setsuzokushiteki),
54            "接尾" => Setsubi::from_str(g2).map(Self::Setsubi),
55            "代名詞" => Daimeishi::from_str(g2).map(Self::Daimeishi),
56            "動詞非自立的" => Ok(Self::DoushiHijiritsuteki),
57            "特殊" => Ok(Self::Special),
58            "非自立" => MeishiHijiritsu::from_str(g2).map(Self::Hijiritsu),
59            "副詞可能" => Ok(Self::FukushiKanou),
60            "*" => Ok(Self::None),
61
62            _ => Err(POSParseError::new(1, g1.to_string(), POSKind::Meishi)),
63        }
64    }
65}
66
67impl Display for Meishi {
68    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
69        f.write_str(match &self {
70            Self::SahenSetsuzoku => "サ変接続",
71            Self::NaiKeiyoushiGokan => "ナイ形容詞語幹",
72            Self::General => "一般",
73            Self::QuoteStr => "引用文字列",
74            Self::KeiyoudoushiGokan => "形容動詞語幹",
75            Self::KoyuMeishi(_) => "固有名詞",
76            Self::Kazu => "数",
77            Self::Setsuzokushiteki => "接続詞的",
78            Self::Setsubi(_) => "接尾",
79            Self::Daimeishi(_) => "代名詞",
80            Self::DoushiHijiritsuteki => "動詞非自立的",
81            Self::Special => "特殊",
82            Self::Hijiritsu(_) => "非自立",
83            Self::FukushiKanou => "副詞可能",
84
85            Self::None => "*",
86        })?;
87
88        match &self {
89            Self::KoyuMeishi(koyumeishi) => write!(f, ",{}", koyumeishi),
90            Self::Setsubi(setsubi) => write!(f, ",{}", setsubi),
91            Self::Daimeishi(daimeishi) => write!(f, ",{}", daimeishi),
92            Self::Hijiritsu(meishi_hijiritsu) => write!(f, ",{}", meishi_hijiritsu),
93
94            _ => f.write_str(",*,*"),
95        }?;
96
97        Ok(())
98    }
99}
100
101#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
102/// 固有名詞
103pub enum KoyuMeishi {
104    /// 一般
105    General,
106    /// 人名
107    Person(Person),
108    /// 組織
109    Organization,
110    /// 地域
111    Region(Region),
112}
113
114impl KoyuMeishi {
115    pub fn from_strs(g2: &str, g3: &str) -> Result<Self, POSParseError> {
116        match g2 {
117            "一般" => Ok(Self::General),
118            "人名" => Person::from_str(g3).map(Self::Person),
119            "組織" => Ok(Self::Organization),
120            "地域" => Region::from_str(g3).map(Self::Region),
121
122            _ => Err(POSParseError::new(2, g2.to_string(), POSKind::KoyuMeishi)),
123        }
124    }
125}
126
127#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
128/// 人名
129pub enum Person {
130    /// 一般
131    General,
132    /// 姓
133    Sei,
134    /// 名
135    Mei,
136}
137
138impl FromStr for Person {
139    type Err = POSParseError;
140    fn from_str(s: &str) -> Result<Self, Self::Err> {
141        match s {
142            "一般" => Ok(Self::General),
143            "姓" => Ok(Self::Sei),
144            "名" => Ok(Self::Mei),
145
146            _ => Err(POSParseError::new(3, s.to_string(), POSKind::Person)),
147        }
148    }
149}
150
151#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
152/// 地域
153pub enum Region {
154    /// 一般
155    General,
156    /// 国
157    Country,
158}
159
160impl FromStr for Region {
161    type Err = POSParseError;
162    fn from_str(s: &str) -> Result<Self, Self::Err> {
163        match s {
164            "一般" => Ok(Self::General),
165            "国" => Ok(Self::Country),
166
167            _ => Err(POSParseError::new(3, s.to_string(), POSKind::Region)),
168        }
169    }
170}
171
172impl Display for KoyuMeishi {
173    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
174        f.write_str(match &self {
175            Self::General => "一般,*",
176            Self::Person(Person::General) => "人名,一般",
177            Self::Person(Person::Sei) => "人名,姓",
178            Self::Person(Person::Mei) => "人名,名",
179            Self::Organization => "組織,*",
180            Self::Region(Region::General) => "地域,一般",
181            Self::Region(Region::Country) => "地域,国",
182        })
183    }
184}
185
186#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
187/// 名詞・接尾
188pub enum Setsubi {
189    /// サ変接続
190    SahenSetsuzoku,
191    /// 一般
192    General,
193    /// 形容動詞語幹
194    KeiyoudoushiGokan,
195    /// 助数詞
196    Josuushi,
197    /// 助動詞語幹
198    JodoushiGokan,
199    /// 人名
200    Person,
201    /// 地域
202    Region,
203    /// 特殊
204    Special,
205    /// 副詞可能
206    FukushiKanou,
207}
208
209impl FromStr for Setsubi {
210    type Err = POSParseError;
211    fn from_str(s: &str) -> Result<Self, Self::Err> {
212        match s {
213            "サ変接続" => Ok(Self::SahenSetsuzoku),
214            "一般" => Ok(Self::General),
215            "形容動詞語幹" => Ok(Self::KeiyoudoushiGokan),
216            "助数詞" => Ok(Self::Josuushi),
217            "助動詞語幹" => Ok(Self::JodoushiGokan),
218            "人名" => Ok(Self::Person),
219            "地域" => Ok(Self::Region),
220            "特殊" => Ok(Self::Special),
221            "副詞可能" => Ok(Self::FukushiKanou),
222
223            _ => Err(POSParseError::new(2, s.to_string(), POSKind::MeishiSetsubi)),
224        }
225    }
226}
227
228impl Display for Setsubi {
229    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
230        write!(
231            f,
232            "{},*",
233            match &self {
234                Self::SahenSetsuzoku => "サ変接続",
235                Self::General => "一般",
236                Self::KeiyoudoushiGokan => "形容動詞語幹",
237                Self::Josuushi => "助数詞",
238                Self::JodoushiGokan => "助動詞語幹",
239                Self::Person => "人名",
240                Self::Region => "地域",
241                Self::Special => "特殊",
242                Self::FukushiKanou => "副詞可能",
243            },
244        )
245    }
246}
247
248#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
249/// 代名詞
250pub enum Daimeishi {
251    /// 一般
252    General,
253    /// 縮約
254    Contraction,
255}
256
257impl FromStr for Daimeishi {
258    type Err = POSParseError;
259    fn from_str(s: &str) -> Result<Self, Self::Err> {
260        match s {
261            "一般" => Ok(Self::General),
262            "縮約" => Ok(Self::Contraction),
263
264            _ => Err(POSParseError::new(2, s.to_string(), POSKind::Daimeishi)),
265        }
266    }
267}
268
269impl Display for Daimeishi {
270    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
271        write!(
272            f,
273            "{},*",
274            match &self {
275                Self::General => "一般",
276                Self::Contraction => "縮約",
277            },
278        )
279    }
280}
281
282#[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)]
283/// 名詞・非自立
284pub enum MeishiHijiritsu {
285    /// 一般
286    General,
287    /// 形容動詞語幹
288    KeiyoudoushiGokan,
289    /// 助動詞語幹
290    JodoushiGokan,
291    /// 副詞可能
292    FukushiKanou,
293    /// \*
294    None,
295}
296
297impl FromStr for MeishiHijiritsu {
298    type Err = POSParseError;
299    fn from_str(s: &str) -> Result<Self, Self::Err> {
300        match s {
301            "一般" => Ok(Self::General),
302            "形容動詞語幹" => Ok(Self::KeiyoudoushiGokan),
303            "助動詞語幹" => Ok(Self::JodoushiGokan),
304            "副詞可能" => Ok(Self::FukushiKanou),
305            "*" => Ok(Self::None),
306
307            _ => Err(POSParseError::new(
308                2,
309                s.to_string(),
310                POSKind::MeishiHijiritsu,
311            )),
312        }
313    }
314}
315
316impl Display for MeishiHijiritsu {
317    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
318        write!(
319            f,
320            "{},*",
321            match &self {
322                Self::General => "一般",
323                Self::KeiyoudoushiGokan => "形容動詞語幹",
324                Self::JodoushiGokan => "助動詞語幹",
325                Self::FukushiKanou => "副詞可能",
326                Self::None => "*",
327            },
328        )
329    }
330}