Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

자소 합치기 기능의 일관성 있는 복합자음 합치기 #9

Open
viiviii opened this issue Mar 20, 2022 · 9 comments
Open

Comments

@viiviii
Copy link
Contributor

viiviii commented Mar 20, 2022

아래 글자의 자소 합치기 결과는 어떻게 예상되시나요?

ㄱㅏㅅㅅㅇㅓ
ㄱㅏㅆㅇㅓ
ㅂㅂㅗㅂㅂㅣ

결과는 갔어, 갔어, ㅂ봅비 입니다.

개요

현재 상태

  • 종성은 쌍받침, 겹받침 모두 합쳐짐 (ㄱㅏㅅㅅ → 갔, ㄱㅏㄴㅎ -> 갆)
  • 초성은 복합 자음이 합쳐지지 않음 (ㅂㅂㅣ → ㅂ비)

제안

  • 자음, 모음 키보드를 두 번 누르는 복합 자모만 합치자
    • 대상: ㅘ ㅙ ㅚ ㅝ ㅞ ㅟ ㅢ, ㄳ ㄵ ㄶ ㄺ ㄻ ㄼ ㄽ ㄾ ㄿ ㅀ ㅄ
  • shift 키를 주로 사용하는 복합 자음(ㄲ, ㄸ, ㅃ, ㅆ, ㅉ)은 제외
    • 제외: ㄲ, ㅆ
    • 기존에 ㄸ, ㅃ, ㅉ는 제외되어 있음

이유

복합 자음을 자소 합치기에서 제외해도 될 것 같다고 생각하는 이유는

  1. 쌍자음이 합쳐질 것 같은데 초성, 종성의 동작이 다르므로 결과가 헷갈릴 수 있다고 생각합니다.
  2. 이 기능을 주로 사용하는 영타 → 한타 기능에서 복합 자음은 영어 대문자로 쓰일 것이기 때문입니다.
  • rkTdj갔어
  • rkttdj갔어보다는 갓ㅅ어를 썼을 가능성이 높음
  1. 맥 OS의 경우 자음을 두 번 눌러 복합 자음을 쓸 수 있지만 초성일 때만 가능합니다.
  • 현재 종성이 되고 초성이 안 되는 것과는 반대됨

예상되는 변경사항

  • ㄱㅏㅅㅅㅇㅓ는 이제 갔어가 아닌 갓ㅅ어로 합쳐짐
  • constant 파일의 상수 MIXED에서 ㄲ, ㅆ 제거됨

주의사항

  • MIXED를 사용하는 다른 곳의 동작이 어떻게 바뀔지 체크 필요
  • 원본 리파지토리와 동작이 달라지게 됨

이 작업으로 기대하는 것

  • 초성, 종성의 일관성 개선
  • assemble()에서 초/중/종성을 한 번 더 합치는데, 초성 로직은 제외할 수 있음
    • 이 작업으로
      • ㄱㄱㅣ → 끼, ㅂㅂㅣ→ ㅂㅂㅣ였던 일관성 개선
      • 초성의 복합 자음을 합치는 로직이 있으나 실제로 합쳐질 일이 없었는데 코드를 명시적으로 제거할 수 있음 (이 메서드를 호출하는 implode()가 초성을 글자 1개만 남긴 후 메서드를 호출하기 때문에)

제가 놓친 부분이나 제외 시 우려되는 부분 등 여러 의견 주세요!👏💪🏽

@jpoh281
Copy link
Owner

jpoh281 commented Mar 21, 2022

제가 생각했을 때도 T를 쌍시옷으로 사용하지 tt를 쌍시옷으로 사용할 일은 없다고 생각해요.
그런데 이게 영 -> 한 기능만을 사용했을 땐 확실하게 맞는데 자소 합치기 자체는 ㅅㅅ 을 ㅆ으로 합쳐주는 기능이기때문에
두 가지 기능을 별개로 봐야할지, 아니면 자소합치기는 영 -> 한 기능을 위한 사전 작업 정도로 봐야할지 고민이됩니다.

어떻게 생각하시나요?

@jpoh281
Copy link
Owner

jpoh281 commented Mar 21, 2022

참고 자료로 구글 검색에서 QhQl와 qqhqql를 검색했을 때 나오는 연관검색어들입니다.
네이버도 동일해요.

스크린샷 2022-03-21 오후 10 37 43

스크린샷 2022-03-21 오후 10 37 53

@jpoh281
Copy link
Owner

jpoh281 commented Mar 21, 2022

  • 놓친 부분이 있어 추가적으로 작성합니다.
    아마 MIXED 자체를 건드리게되면 한-> 영을 포함한 다른 부분에서 에러가 날듯해서 TEMP_MIXED나 IMPLODE_MIXED같은 이름의 상수를 하나 더 만들어야할 것 같습니다.

@viiviii
Copy link
Contributor Author

viiviii commented Mar 22, 2022

오 구글, 네이브 비교 자료 감사드립니다👏
MIXED 상수는 아래와 같이 좀 더 세부적으로 분할해서 사용하는 방식으로 하면 호환성, 변경 둘 다 가능할 것 같아요!

const Map<String, List<String>> MIXED = {
  ...MEDIAL_MIXED,
  ...FINALE_MIXED,
};

@viiviii
Copy link
Contributor Author

viiviii commented Mar 22, 2022

말씀해주신대로 별개로 볼지 등 자소 합치기의 기준을 정해야겠네요!
우선 동작 방식은 크게 3가지로 나눌 수 있을 것 같아요🤔

a) 복합자모를 탐욕적으로 모두 합침

  • 기존 동작과 가장 비슷함
  • 현재 초성은 합쳐지지 않음

b) 자모 키가 2번 눌리는 조합만 합침

  • 구글, 네이버 검색 결과와 가장 비슷함
  • 한 <-> 영 변환에서 적절해보임

c) 복합자모를 정리하지 않음

  • 사용자가 입력한 자모 그대로 음절로만 합침
  • Javascript의 normalize()과 동작이 비슷하고 기본적인 방법이라고 생각됨

image

위의 특징들을 바탕으로 이 패키지의 방향에 따라 선택하면 어떨까요?
(a) 원본 repository의 dart 버전 지원으로 원본과 같은 동작 중시
(b) 같은 기능을 제공하며 타 검색창 동작과 비슷하게 개선
(c) 유니코드 한글 정규화 기능 지원

제 생각에는 주요 기능이 한글 자동완성과 한,영 변환인지 한글 자소분해인지에 따라 다를 것 같은데,
패키지 사용자분들께서 어떤 기능을 어떤 동작으로 예상하고 사용하실 지 아직 잘 모르니 여러 방면으로 천천히 고민해도 될 것 같습니다😄

각 방식별 합쳐지는 대상

image

@jpoh281
Copy link
Owner

jpoh281 commented Mar 23, 2022

기능을 viiviii님께서 만드셔서 질문이 있습니다.
연관검색어 만들 때 여러가지 옵션을 같이 넣어서 받아오게 되어있듯이
자소 합치기도 이런식으로 해서 아래와 같이 사용자의 선택에따라 변경하게 하는게 가능할까요?

enum ImplodeType {
  greedy,
  search,
  normalize
}

String implode(String input, {ImplodeType type = ImplodeType.greedy}) {
  /// 인접한 모음을 하나의 복합 모음으로 합친다.
  final letters = mixMedial(input.split(''));

  /// 모음으로 시작하는 그룹들을 만든다.
  final createdGroups = createGroupsByMedial(letters);

  /// 각 그룹을 순회하면서 복합자음을 정리하고, 앞 그룹에서 종성으로 사용하고 남은 자음들을 초성으로 가져온다.
  final groups =
      mixFinaleAndReplaceTheRemainingFinalesToInitials(createdGroups);

  /// 각 글자에 해당하는 블록 단위로 나눈다.
  final blocks = groups.fold<List<List<String>>>(
      [], (acc, group) => acc..addAll(divideByBlock(group)));

  return blocks.map(assemble).join();
}

이렇게하면 영 -> 한을 위한 자소 합치기와
그냥 자소 합치기가 서로 간섭하는 일이? 없을 것 같아요.

@viiviii
Copy link
Contributor Author

viiviii commented Mar 23, 2022

최종적으로는 저렇게 타입을 받아서 옵셔널하게 제공할 수 있다고 생각합니다.😁
하지만 현재는 절차 지향적이고 복합 자모를 정리하는 부분 등이 중복되어 있어 이 부분은 작업이 좀 더 크지 않을까 생각돼요!
그리고 필요성이 명확하지 않다면 불필요한 옵션이 되어버리진 않을까 고민도 됩니다.🤔
패키지에서 API를 삭제하는 일은 쉽지 않으니까요😂
어느 정도 정리를 하며 한 가지 옵션을 제대로 선택 후 나머지 옵션을 추가하는 건 어떨까요?

@jpoh281
Copy link
Owner

jpoh281 commented Mar 23, 2022

지금 현재 구현되어있는 건
a) 복합자모를 탐욕적으로 모두 합침 << 이거죠?

@viiviii
Copy link
Contributor Author

viiviii commented Mar 23, 2022

네 하지만 위 내용대로 현재 완전 똑같다고 할 순 없습니다😅
모두 합친다는건 초성 복합자음도 합쳐져야된다고 생각해서요!
(이하 본문 발췌)

현재 상태

  • 종성은 쌍받침, 겹받침 모두 합쳐짐 (ㄱㅏㅅㅅ → 갔, ㄱㅏㄴㅎ -> 갆)
  • 초성은 복합 자음이 합쳐지지 않음 (ㅂㅂㅣ → ㅂ비)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants