-
Notifications
You must be signed in to change notification settings - Fork 0
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
한글 쪼개기 중 초성만 추출하여 검색에서 사용할 수 있을까요? #1
Comments
안녕하세요, 제 코드에 관심을 가져주셔서 정말 기쁩니다. 본 프로젝트 문제에 대한 제 의견으론, function chosung(input) {
const LIST_CHOSUNG = [
"ㄱ", "ㄲ", "ㄴ", "ㄷ",
"ㄸ", "ㄹ", "ㅁ", "ㅂ",
"ㅃ", "ㅅ", "ㅆ", "ㅇ",
"ㅈ", "ㅉ", "ㅊ", "ㅋ",
"ㅌ", "ㅍ", "ㅎ",
];
let res = "";
for (let i = 0; i < input.length; i++) {
// 현재 문자의 유니코드 포인트를 구함
const currentChar = input.charCodeAt(i);
// 한글 유니코드 범위 확인 (가-힣: 0xAC00-0xD7A3)
if (currentChar >= 0xac00 && currentChar <= 0xd7a3) {
const idx = Math.floor((currentChar - 0xac00) / (21 * 28));
res += LIST_CHOSUNG[idx];
} else {
// 한글이 아닌 문자는 그대로 추가
res += input[i];
}
}
return res;
}
console.log(chosung("구글")); // "ㄱㄱ"
console.log(chosung("빵끗")); // "ㅃㄲ"
console.log(chosung("직ㅀ")); // "ㅈㅀ" 위 코드에서 초성으로 사용하지 않는 겹받침(ㄳ · ㄵ · ㄶ · ㄺ · ㄻ · ㄼ · ㄽ · ㄾ · ㄿ · ㅀ · ㅄ)을 예외처리하면, 말씀하신 문제를 해결하시는데 도움이 되지 않을까 생각됩니다. function chosungImprovement(input) {
const LIST_CHOSUNG = [
"ㄱ", "ㄲ", "ㄴ", "ㄷ",
"ㄸ", "ㄹ", "ㅁ", "ㅂ",
"ㅃ", "ㅅ", "ㅆ", "ㅇ",
"ㅈ", "ㅉ", "ㅊ", "ㅋ",
"ㅌ", "ㅍ", "ㅎ",
];
const MAP_DOUBLE_CONSONANT = {
ㄳ: "ㄱㅅ",
ㄵ: "ㄴㅈ",
ㄶ: "ㄴㅎ",
ㄺ: "ㄹㄱ",
ㄻ: "ㄹㅁ",
ㄼ: "ㄹㅂ",
ㄽ: "ㄹㅅ",
ㄾ: "ㄹㅌ",
ㄿ: "ㄹㅍ",
ㅀ: "ㄹㅎ",
ㅄ: "ㅂㅅ",
};
let res = "";
for (let i = 0; i < input.length; i++) {
// 현재 문자의 유니코드 포인트를 구함
const currentChar = input.charCodeAt(i);
// 한글 유니코드 범위 확인 (가-힣: 0xAC00-0xD7A3)
if (currentChar >= 0xac00 && currentChar <= 0xd7a3) {
const idx = Math.floor((currentChar - 0xac00) / (21 * 28));
res += LIST_CHOSUNG[idx];
} else {
// 한글이 아닌 문자는 그대로 추가
res += input[i];
}
}
Object.keys(MAP_DOUBLE_CONSONANT).forEach((doubleConsonant) => {
const splitConsonants = MAP_DOUBLE_CONSONANT[doubleConsonant];
while (res.includes(doubleConsonant)) {
res = res.replace(doubleConsonant, splitConsonants);
}
});
return res;
}
console.log(chosungImprovement("구글")); // "ㄱㄱ"
console.log(chosungImprovement("빵끗")); // "ㅃㄲ"
console.log(chosungImprovement("직ㅀ")); // "ㅈㄹㅎ" 모쪼록 제 코드가 프로젝트에 유용하게 쓰일 수 있기를 바랍니다. 감사합니다. |
정성스런 코멘트에 감사 드립니다. "국" 을 입력한 경우 아래와 같이 세가지 케이스에 대해 검색을 수행합니다.(홑받침인 경우)
"많" 을 입력한 경우 아래와 같이 검색을 수행합니다. (겹받침인 경우)
위와 같이 하는 이유는 앞부분의 문자는 이미 사용자의 의도에 따라 완성이 된 문자열이기 때문에 별도로 초성만 분리해서 검색할 필요성은 없었습니다. 즉 "직ㅀ" 를 검색하려 하였을 때 "직"은 그대로 이용하고 맨 마지막 문자만 분해하여 초성 검색을 수행하면 불필요한 결과물이 도출되지 않게 됩니다. 마지막 문자에 받침이 없는 경우에는 입력된 그대로 검색을 수행하도록 처리했습니다. 소스코드가 많은 참고가 되었으며 원하는 결과를 달성하는데 큰 도움이 되었습니다. 감사합니다. |
@hwantage 프로젝트에 도움이 되었다니 정말 다행입니다. |
https://www.npmjs.com/package/hangul-search
hwantage/hansearch#1
위 라이브러리에 관심 가져 주시고 훌륭한 제안을 주신점에 대해 감사드립니다.
제안해 주신 의견은 즉시 코드에 추가 되었으며 package.json 에 아래와 같은 내용을 추가하였습니다.
hwahyeon 님의 레파지토리에 흥미로운 코드가 발견되어 코드를 활용할 수 있을까 싶어 의견을 여쭙고자 합니다.
hansearch 라이브러리의 사용성은 hwahyeon 님의 제안으로 인해 향상 되었습니다.
다만, 사용성 측면에서 보완이 필요한 부분을 느끼고 있었는데 다음과 같은 부분입니다.
"구글" 이라는 키워드를 검색하기 위해서는 다음과 같은 순서에 따라 검색어를 입력하게 됩니다.
ㄱ => 구 => 국 => 구그 => 구글
사용자의 의도는 "구글" 이었으나 "국" 까지만 입력되었을 경우 의도한 검색결과를 얻지 못합니다.
사용자는 "국"을 입력한 경우에 아마도 "구ㄱ"을 입력한 케이스로 검색을 수행한 결과를 원했을 수 있습니다.
하지만 위와 같은 검색을 하기 위해서는 "구" 입력후 오른쪽 방향키를 눌러 초성 분리를 시도해야 합니다.
또한 "직력화"를 검색하기 위해 "직ㄹㅎ" 를 입력하려 하였으나, 초성 결합에 의해 "직ㅀ"와 같이 입력되어 의도한 결과를 얻지 못하는 경우가 발생하게 됩니다.
hwahyeon 님의 한글 쪼개기 소스를 알게되어 위와 같은 문제를 해결할 수 있는 가능성을 확인하였습니다.
제 생각에는 사용자가 어떤 입력을 하던지 상관없이 초성만을 추출하여 검색에 활용하게 되면 좀 더 나은 검색 결과를 얻을 수 있을 것 같습니다.
hwahyeon님의 코드를 일부 사용하거나 dependency로 활용하도록 허락해 주실수 있을지 의견을 여쭙습니다.
관련된 피드백이나 논의를 기대합니다. 감사합니다!
The text was updated successfully, but these errors were encountered: