use std::collections::HashMap;
use super::types::SejongToken;
#[allow(clippy::too_many_lines)]
pub(super) fn apply_lexicon_overrides(tokens: &mut [SejongToken]) {
let lexicon: HashMap<&str, &str> = [
("나", "NP"),
("너", "NP"),
("우리", "NP"),
("그녀", "NP"),
("그것", "NP"),
("이것", "NP"),
("저것", "NP"),
("무엇", "NP"),
("뭐", "NP"), ("누구", "NP"),
("자기", "NP"),
("자신", "NP"),
("당신", "NP"),
("여러분", "NP"),
("너희", "NP"),
("저희", "NP"),
("이분", "NP"),
("그분", "NP"),
("저분", "NP"),
("어디", "NP"),
("언제", "NP"),
("어느", "NP"),
("어떤", "NP"),
("왜", "MAG"),
("어찌", "MAG"),
("어떻게", "MAG"),
("것", "NNB"),
("줄", "NNB"),
("듯", "NNB"),
("데", "NNB"),
("바", "NNB"),
("만큼", "NNB"),
("대로", "NNB"),
("뿐", "NNB"),
("터", "NNB"),
("척", "NNB"),
("체", "NNB"),
("수", "NNB"), ("등", "NNB"), ("지", "NNB"), ("양", "NNB"), ("따라", "NNB"), ("중", "NNB"), ("년", "NNB"), ("잔", "NNB"), ("원", "NNB"), ("분", "NNB"), ("시", "NNB"), ("때", "NNG"),
("곳", "NNG"),
("오늘", "NNG"),
("내일", "NNG"),
("어제", "NNG"),
("모레", "NNG"),
("올해", "NNG"),
("작년", "NNG"),
("내년", "NNG"),
("아침", "NNG"),
("점심", "NNG"),
("저녁", "NNG"),
("새벽", "NNG"),
("사람", "NNG"),
("남자", "NNG"),
("여자", "NNG"),
("아이", "NNG"),
("어른", "NNG"),
("친구", "NNG"),
("가족", "NNG"),
("부모", "NNG"),
("아버지", "NNG"),
("어머니", "NNG"),
("동생", "NNG"),
("언니", "NNG"),
("오빠", "NNG"),
("선생", "NNG"),
("학생", "NNG"),
("회사원", "NNG"),
("책", "NNG"),
("음식", "NNG"),
("옷", "NNG"),
("문제", "NNG"),
("생각", "NNG"),
("마음", "NNG"),
("느낌", "NNG"),
("정보", "NNG"),
("기술", "NNG"),
("방법", "NNG"),
("이유", "NNG"),
("결과", "NNG"),
("상황", "NNG"),
("경우", "NNG"),
("부분", "NNG"),
("전체", "NNG"),
("세계", "NNG"),
("나라", "NNG"),
("사회", "NNG"),
("정부", "NNG"),
("경제", "NNG"),
("문화", "NNG"),
("역사", "NNG"),
("과학", "NNG"),
("교육", "NNG"),
("날씨", "NNG"),
("매우", "MAG"),
("아주", "MAG"),
("너무", "MAG"),
("정말", "MAG"),
("진짜", "MAG"),
("꽤", "MAG"),
("좀", "MAG"),
("조금", "MAG"),
("많이", "MAG"),
("적게", "MAG"),
("더", "MAG"),
("덜", "MAG"),
("가장", "MAG"),
("제일", "MAG"),
("특히", "MAG"),
("항상", "MAG"),
("늘", "MAG"),
("자주", "MAG"),
("가끔", "MAG"),
("때때로", "MAG"),
("종종", "MAG"),
("별로", "MAG"),
("전혀", "MAG"),
("결코", "MAG"),
("이미", "MAG"),
("벌써", "MAG"),
("아직", "MAG"),
("곧", "MAG"),
("바로", "MAG"),
("즉시", "MAG"),
("먼저", "MAG"),
("나중에", "MAG"),
("드디어", "MAG"),
("마침내", "MAG"),
("잘", "MAG"),
("못", "MAG"),
("안", "MAG"),
("빨리", "MAG"),
("천천히", "MAG"),
("갑자기", "MAG"),
("서서히", "MAG"),
("점점", "MAG"),
("차츰", "MAG"),
("함께", "MAG"),
("따로", "MAG"),
("혼자", "MAG"),
("직접", "MAG"),
("그래서", "MAJ"),
("그러나", "MAJ"),
("그런데", "MAJ"),
("그리고", "MAJ"),
("또한", "MAJ"),
("하지만", "MAJ"),
("따라서", "MAJ"),
("그러므로", "MAJ"),
("왜냐하면", "MAJ"),
("만약", "MAG"),
("혹시", "MAG"),
("아마", "MAG"),
("분명히", "MAG"),
("확실히", "MAG"),
("물론", "MAG"),
("역시", "MAG"),
("새", "MM"),
("헌", "MM"),
("옛", "MM"),
("첫", "MM"),
("모든", "MM"),
("어떤", "MM"),
("무슨", "MM"),
("어느", "MM"),
("여러", "MM"),
("아니요", "IC"),
("글쎄", "IC"),
("여보세요", "IC"),
("서울", "NNP"),
("부산", "NNP"),
("대구", "NNP"),
("인천", "NNP"),
("광주", "NNP"),
("대전", "NNP"),
("울산", "NNP"),
("세종", "NNP"),
("경기", "NNP"),
("강원", "NNP"),
("충북", "NNP"),
("충남", "NNP"),
("전북", "NNP"),
("전남", "NNP"),
("경북", "NNP"),
("경남", "NNP"),
("제주", "NNP"),
("수원", "NNP"),
("성남", "NNP"),
("고양", "NNP"),
("용인", "NNP"),
("청주", "NNP"),
("천안", "NNP"),
("전주", "NNP"),
("포항", "NNP"),
("창원", "NNP"),
("안양", "NNP"),
("안산", "NNP"),
("파주", "NNP"),
("김해", "NNP"),
("구미", "NNP"),
("진주", "NNP"),
("익산", "NNP"),
("군산", "NNP"),
("여수", "NNP"),
("순천", "NNP"),
("목포", "NNP"),
("강릉", "NNP"),
("춘천", "NNP"),
("원주", "NNP"),
("속초", "NNP"),
("제천", "NNP"),
("충주", "NNP"),
("안동", "NNP"),
("경주", "NNP"),
("거제", "NNP"),
("통영", "NNP"),
("양산", "NNP"),
("김포", "NNP"),
("시흥", "NNP"),
("화성", "NNP"),
("평택", "NNP"),
("의정부", "NNP"),
("부천", "NNP"),
("강남", "NNP"),
("강북", "NNP"),
("강서", "NNP"),
("강동", "NNP"),
("서초", "NNP"),
("송파", "NNP"),
("영등포", "NNP"),
("마포", "NNP"),
("종로", "NNP"),
("동대문", "NNP"),
("성동", "NNP"),
("광진", "NNP"),
("노원", "NNP"),
("도봉", "NNP"),
("중랑", "NNP"),
("성북", "NNP"),
("관악", "NNP"),
("동작", "NNP"),
("금천", "NNP"),
("구로", "NNP"),
("양천", "NNP"),
("명동", "NNP"),
("이태원", "NNP"),
("홍대", "NNP"),
("신촌", "NNP"),
("압구정", "NNP"),
("잠실", "NNP"),
("여의도", "NNP"),
("한국", "NNP"),
("대한민국", "NNP"),
("일본", "NNP"),
("중국", "NNP"),
("미국", "NNP"),
("영국", "NNP"),
("프랑스", "NNP"),
("독일", "NNP"),
("이탈리아", "NNP"),
("스페인", "NNP"),
("러시아", "NNP"),
("캐나다", "NNP"),
("호주", "NNP"),
("베트남", "NNP"),
("태국", "NNP"),
("인도", "NNP"),
("브라질", "NNP"),
("멕시코", "NNP"),
("아르헨티나", "NNP"),
("네덜란드", "NNP"),
("벨기에", "NNP"),
("스위스", "NNP"),
("오스트리아", "NNP"),
("폴란드", "NNP"),
("체코", "NNP"),
("헝가리", "NNP"),
("그리스", "NNP"),
("터키", "NNP"),
("이집트", "NNP"),
("남아공", "NNP"),
("사우디", "NNP"),
("이란", "NNP"),
("이라크", "NNP"),
("파키스탄", "NNP"),
("방글라데시", "NNP"),
("인도네시아", "NNP"),
("필리핀", "NNP"),
("말레이시아", "NNP"),
("싱가포르", "NNP"),
("대만", "NNP"),
("홍콩", "NNP"),
("북한", "NNP"),
("몽골", "NNP"),
("뉴질랜드", "NNP"),
("스웨덴", "NNP"),
("노르웨이", "NNP"),
("덴마크", "NNP"),
("핀란드", "NNP"),
("아이슬란드", "NNP"),
("포르투갈", "NNP"),
("우크라이나", "NNP"),
("삼성", "NNP"),
("현대", "NNP"),
("네이버", "NNP"),
("카카오", "NNP"),
("구글", "NNP"),
("애플", "NNP"),
("마이크로소프트", "NNP"),
("아마존", "NNP"),
("페이스북", "NNP"),
("트위터", "NNP"),
("인스타그램", "NNP"),
("유튜브", "NNP"),
("틱톡", "NNP"),
("텔레그램", "NNP"),
("디스코드", "NNP"),
("넷플릭스", "NNP"),
("디즈니", "NNP"),
("스포티파이", "NNP"),
("테슬라", "NNP"),
("엔비디아", "NNP"),
("인텔", "NNP"),
("소니", "NNP"),
("도요타", "NNP"),
("혼다", "NNP"),
("닌텐도", "NNP"),
("엘지", "NNP"),
("에스케이", "NNP"),
("롯데", "NNP"),
("신세계", "NNP"),
("쿠팡", "NNP"),
("배달의민족", "NNP"),
("당근마켓", "NNP"),
("토스", "NNP"),
("야놀자", "NNP"),
("무신사", "NNP"),
("마켓컬리", "NNP"),
("오늘의집", "NNP"),
("직방", "NNP"),
("리디", "NNP"),
("서울대", "NNP"),
("연세대", "NNP"),
("고려대", "NNP"),
("카이스트", "NNP"),
("포스텍", "NNP"),
("성균관대", "NNP"),
("한양대", "NNP"),
("이화여대", "NNP"),
("경희대", "NNP"),
("서강대", "NNP"),
("중앙대", "NNP"),
("한국외대", "NNP"),
("건국대", "NNP"),
("동국대", "NNP"),
("홍익대", "NNP"),
("부산대", "NNP"),
("경북대", "NNP"),
("전남대", "NNP"),
("충남대", "NNP"),
("전북대", "NNP"),
("이순신", "NNP"),
("세종대왕", "NNP"),
("정조", "NNP"),
("안중근", "NNP"),
("김구", "NNP"),
("유관순", "NNP"),
("반기문", "NNP"),
("손흥민", "NNP"),
("김연아", "NNP"),
("방탄소년단", "NNP"),
("하나", "SN"),
("둘", "SN"),
("셋", "SN"),
("넷", "SN"),
("다섯", "SN"),
("여섯", "SN"),
("일곱", "SN"),
("여덟", "SN"),
("아홉", "SN"),
("스물", "SN"),
("서른", "SN"),
("마흔", "SN"),
("쉰", "SN"),
("예순", "SN"),
("일흔", "SN"),
("여든", "SN"),
("아흔", "SN"),
("첫째", "MM"),
("둘째", "MM"),
("셋째", "MM"),
("넷째", "MM"),
("학교", "NNG"),
("병원", "NNG"),
("은행", "NNG"),
("회사", "NNG"),
("공원", "NNG"),
("시장", "NNG"),
("백화점", "NNG"),
("편의점", "NNG"),
("카페", "NNG"),
("식당", "NNG"),
("호텔", "NNG"),
("도서관", "NNG"),
("공항", "NNG"),
("항구", "NNG"),
("바다", "NNG"),
("호수", "NNG"),
("나무", "NNG"),
("꽃", "NNG"),
("하늘", "NNG"),
("구름", "NNG"),
("바람", "NNG"),
("머리", "NNG"),
("얼굴", "NNG"),
("가슴", "NNG"),
("미세먼지", "NNG"),
("경제", "NNG"),
("정치", "NNG"),
("사회", "NNG"),
("문화", "NNG"),
("환경", "NNG"),
("교육", "NNG"),
("과학", "NNG"),
("기술", "NNG"),
("의료", "NNG"),
("덥", "VA"),
("춥", "VA"),
("좁", "VA"),
("넓", "VA"),
("깊", "VA"),
("얕", "VA"),
]
.into_iter()
.collect();
let overridable_poses: std::collections::HashSet<&str> = [
"EF", "EC", "VV", "VA", "NNG", "NNP", "IC", "MAG", "JX", "MM",
]
.into_iter()
.collect();
for token in tokens.iter_mut() {
if overridable_poses.contains(token.pos.as_str()) {
if let Some(&correct_pos) = lexicon.get(token.surface.as_str()) {
token.pos = correct_pos.to_string();
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
fn make_token(surface: &str, pos: &str) -> SejongToken {
SejongToken::new(surface, pos, 0, surface.chars().count())
}
#[test]
fn test_apply_lexicon_overrides_pronoun_np() {
let mut tokens = vec![make_token("나", "VV")];
apply_lexicon_overrides(&mut tokens);
assert_eq!(tokens[0].pos, "NP");
}
#[test]
fn test_apply_lexicon_overrides_adverb_mag() {
let mut tokens = vec![make_token("매우", "NNG")];
apply_lexicon_overrides(&mut tokens);
assert_eq!(tokens[0].pos, "MAG");
let mut tokens2 = vec![make_token("항상", "VV")];
apply_lexicon_overrides(&mut tokens2);
assert_eq!(tokens2[0].pos, "MAG");
}
#[test]
fn test_apply_lexicon_overrides_skips_ep_pos() {
let mut tokens = vec![make_token("시", "EP")];
apply_lexicon_overrides(&mut tokens);
assert_eq!(tokens[0].pos, "EP", "EP tokens must not be overridden");
}
#[test]
fn test_apply_lexicon_overrides_nnp_city() {
let mut tokens = vec![make_token("서울", "NNG")];
apply_lexicon_overrides(&mut tokens);
assert_eq!(tokens[0].pos, "NNP");
}
}