use super::types::EndingRule;
#[allow(clippy::too_many_lines, clippy::vec_init_then_push)]
#[must_use]
pub(super) fn init_ending_rules() -> Vec<EndingRule> {
let mut rules: Vec<EndingRule> = Vec::new();
rules.push(EndingRule::new(
"VV+EF",
vec![
"습니다",
"ㅂ니다",
"습니까",
"ㅂ니까", "는다",
"ㄴ다",
"는가",
"ㄴ가",
"냐",
"니", "오",
"소", "네",
"세",
"게", "어요",
"아요",
"요", "어",
"아", "지",
"죠",
"죠", "군",
"구나",
"구먼", "래",
"려",
"자", "마",
"거라",
"너라", "랴",
"리", "다", "ㄹ게요",
"ㄹ게",
"ㄹ래요",
"ㄹ래",
"ㄹ까요",
"ㄹ까",
],
vec!["VV", "EF"],
));
rules.push(EndingRule::new(
"VA+EF",
vec![
"습니다",
"ㅂ니다",
"습니까",
"ㅂ니까",
"다",
"어요",
"아요",
"요",
"어",
"아",
"지",
"죠",
"네",
"군",
"구나",
],
vec!["VA", "EF"],
));
rules.push(EndingRule::new(
"XSV+EF",
vec![
"습니다",
"ㅂ니다",
"습니까",
"ㅂ니까",
"다",
"어요",
"아요",
"요",
"어",
"아",
"ㄴ다",
"ㅆ다",
"지",
"죠",
"네",
],
vec!["XSV", "EF"],
));
rules.push(EndingRule::new(
"XSV+EC",
vec![
"고",
"면",
"으면",
"서",
"어서",
"아서",
"면서",
"으면서",
"니까",
"으니까",
"지만",
],
vec!["XSV", "EC"],
));
rules.push(EndingRule::new(
"VX+EF",
vec![
"습니다",
"ㅂ니다",
"습니까",
"ㅂ니까",
"어요",
"아요",
"요",
"어",
"아",
"다",
"ㄴ다",
"ㅆ다",
"지",
"죠",
"네",
],
vec!["VX", "EF"],
));
rules.push(EndingRule::new(
"EP+EF",
vec!["입니다", "입니까"],
vec!["VCP", "EF"],
));
rules.push(EndingRule::new(
"VV+VX+EF",
vec![
"어지다",
"아지다", "이다",
"히다",
"리다",
"기다", ],
vec!["VV", "VX", "EF"],
));
rules.push(EndingRule::new(
"VX+EC",
vec![
"고",
"면",
"으면",
"서",
"어서",
"아서",
"면서",
"으면서",
"니까",
"으니까",
"지만",
],
vec!["VX", "EC"],
));
rules.push(EndingRule::new(
"VV+EC",
vec![
"고나서",
"자마자",
"으면서",
"으니까",
"더라도",
"으므로",
"어서",
"아서",
"면서",
"든지",
"든가",
"기에",
"길래",
"거든",
"다면",
"어도",
"아도",
"도록",
"듯이",
"데도",
"니까",
"므로",
"지만",
"거나",
"다가",
"더니",
"ㄴ데",
"는데",
"고",
"며",
"나",
"니",
"면",
"서",
"자",
"게",
"듯",
],
vec!["VV", "EC"],
));
rules.push(EndingRule::new(
"VA+EC",
vec![
"더라도",
"으면서",
"으니까",
"어서",
"아서",
"면서",
"어도",
"아도",
"도록",
"니까",
"므로",
"지만",
"거나",
"거든",
"다면",
"ㄴ데",
"는데",
"더니",
"고",
"며",
"나",
"니",
"면",
"서",
"게",
],
vec!["VA", "EC"],
));
rules.push(EndingRule::new(
"VV+ETM",
vec![
"는", "ㄴ", "은", "ㄹ", "을", "던", ],
vec!["VV", "ETM"],
));
rules.push(EndingRule::new(
"VA+ETM",
vec![
"ㄴ", "은", "ㄹ", "을", "던", ],
vec!["VA", "ETM"],
));
rules.push(EndingRule::new(
"VV+ETN",
vec![
"기", "ㅁ", "음", ],
vec!["VV", "ETN"],
));
rules.push(EndingRule::new(
"VA+ETN",
vec![
"기", "ㅁ", "음", ],
vec!["VA", "ETN"],
));
rules.push(EndingRule::new(
"VV+EP",
vec![
"었", "았", "였", "겠", "시", "으시", "더", ],
vec!["VV", "EP"],
));
rules.push(EndingRule::new(
"VA+EP",
vec![
"었", "았", "였", "겠", "시", "으시", ],
vec!["VA", "EP"],
));
rules.push(EndingRule::new(
"VV+EP+EP+EF",
vec!["셨습니다", "셨습니까", "셨어요", "셨어", "셨다"],
vec!["VV", "EP", "EP", "EF"],
));
rules.push(EndingRule::new(
"VV+EP+EF",
vec![
"으셨습니다",
"으셨습니까",
"으셨어요",
"었습니다",
"았습니다",
"였습니다",
"었습니까",
"았습니까",
"였습니까",
"겠습니다",
"셨습니다",
"었어요",
"았어요",
"였어요",
"었어",
"았어",
"였어",
"었다",
"았다",
"였다",
"었니",
"았니",
"였니",
"었지",
"았지",
"였지",
"었나",
"았나",
"였나",
"겠어요",
"겠다",
"겠지",
"겠어",
"셨어요",
"셨다",
"셨어",
"시네요",
"으시네요",
"더라",
"더군",
"더니",
"던데",
],
vec!["VV", "EP", "EF"],
));
rules.push(EndingRule::new(
"VA+EP+EF",
vec![
"었습니다",
"았습니다",
"였습니다",
"었습니까",
"았습니까",
"였습니까",
"었어요",
"았어요",
"였어요",
"었어",
"았어",
"였어",
"었다",
"았다",
"였다",
"었지",
"았지",
"였지",
"겠습니다",
"겠어요",
"겠다",
"겠지",
"시네요",
"으시네요",
"셨어요",
"셨다",
],
vec!["VA", "EP", "EF"],
));
rules.push(EndingRule::new(
"VV+EP+EC",
vec![
"었고",
"았고",
"였고",
"었는데",
"았는데",
"였는데",
"었지만",
"았지만",
"였지만",
"었으면",
"았으면",
"였으면",
"었어도",
"았어도",
"였어도",
"었으니",
"았으니",
"였으니",
"겠고",
"겠는데",
"겠지만",
],
vec!["VV", "EP", "EC"],
));
rules.push(EndingRule::new(
"VA+EP+EC",
vec![
"었고",
"았고",
"였고",
"었는데",
"았는데",
"였는데",
"었지만",
"았지만",
"였지만",
"었으면",
"았으면",
"였으면",
],
vec!["VA", "EP", "EC"],
));
rules.push(EndingRule::new(
"VV+EP+ETM",
vec![
"었던", "았던", "였던", "겠을", ],
vec!["VV", "EP", "ETM"],
));
rules.push(EndingRule::new(
"NNG+JKS",
vec!["이", "가", "께서"],
vec!["NNG", "JKS"],
));
rules.push(EndingRule::new(
"NNP+JKS",
vec!["이", "가", "께서"],
vec!["NNP", "JKS"],
));
rules.push(EndingRule::new(
"NP+JKS",
vec!["이", "가", "께서"],
vec!["NP", "JKS"],
));
rules.push(EndingRule::new(
"NNG+JKO",
vec!["을", "를"],
vec!["NNG", "JKO"],
));
rules.push(EndingRule::new(
"NNP+JKO",
vec!["을", "를"],
vec!["NNP", "JKO"],
));
rules.push(EndingRule::new(
"NP+JKO",
vec!["을", "를"],
vec!["NP", "JKO"],
));
rules.push(EndingRule::new(
"NNG+JKB",
vec![
"에", "에서", "에게", "로", "으로", "한테", "보다", "처럼", "같이", "까지", "부터",
"와", "과",
],
vec!["NNG", "JKB"],
));
rules.push(EndingRule::new(
"NNP+JKB",
vec![
"에", "에서", "에게", "로", "으로", "한테", "보다", "처럼", "같이", "까지", "부터",
"와", "과",
],
vec!["NNP", "JKB"],
));
rules.push(EndingRule::new(
"NP+JKB",
vec![
"에", "에서", "에게", "로", "으로", "한테", "보다", "처럼", "같이", "까지", "부터",
"와", "과",
],
vec!["NP", "JKB"],
));
rules.push(EndingRule::new("NNG+JKG", vec!["의"], vec!["NNG", "JKG"]));
rules.push(EndingRule::new("NNP+JKG", vec!["의"], vec!["NNP", "JKG"]));
rules.push(EndingRule::new(
"NNG+JKV",
vec!["아", "야", "여", "이여"],
vec!["NNG", "JKV"],
));
rules.push(EndingRule::new(
"NNP+JKV",
vec!["아", "야", "여", "이여"],
vec!["NNP", "JKV"],
));
rules.push(EndingRule::new(
"NNG+JX",
vec![
"은", "는", "도", "만", "까지", "부터", "마저", "조차", "라도", "밖에", "요",
],
vec!["NNG", "JX"],
));
rules.push(EndingRule::new(
"NNP+JX",
vec![
"은", "는", "도", "만", "까지", "부터", "마저", "조차", "라도", "밖에", "요",
],
vec!["NNP", "JX"],
));
rules.push(EndingRule::new(
"NP+JX",
vec![
"은", "는", "도", "만", "까지", "부터", "마저", "조차", "라도", "밖에", "요",
],
vec!["NP", "JX"],
));
rules.push(EndingRule::new(
"NNG+JC",
vec!["와", "과", "이랑", "랑", "하고"],
vec!["NNG", "JC"],
));
rules
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_init_ending_rules_returns_nonempty_list() {
let rules = init_ending_rules();
assert!(!rules.is_empty(), "ending rules must not be empty");
}
#[test]
fn test_init_ending_rules_vv_ef_contains_key_endings() {
let rules = init_ending_rules();
let vv_ef = rules
.iter()
.find(|r| r.pos_pattern == "VV+EF")
.expect("VV+EF rule must exist");
assert_eq!(vv_ef.target_tags, vec!["VV".to_string(), "EF".to_string()]);
assert!(
vv_ef.endings.contains(&"어요".to_string()),
"VV+EF must include 어요"
);
assert!(
vv_ef.endings.contains(&"다".to_string()),
"VV+EF must include 다"
);
}
#[test]
fn test_init_ending_rules_noun_particle_rules_present() {
let rules = init_ending_rules();
let jks_rule = rules.iter().find(|r| r.pos_pattern == "NNG+JKS");
assert!(jks_rule.is_some(), "NNG+JKS rule must exist");
let jko_rule = rules
.iter()
.find(|r| r.pos_pattern == "NNG+JKO")
.expect("NNG+JKO rule must exist");
assert!(jko_rule.endings.contains(&"을".to_string()));
assert!(jko_rule.endings.contains(&"를".to_string()));
}
}