gorean
gorean copied to clipboard
korean analyzer utility tools
๐ฐ๐ท Gorean
golang native๋ก ์์ฑ๋ ํ๊ธ ๋ถ์ ์ ํธ๋ฆฌํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ruby 'korean-string'๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ golang์ผ๋ก ํฌํ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ด๋ฉฐ, ๊ทธ ์ด์ธ ํ๊ธ ๋ถ์ ์ ํธ๋ฆฌํฐ ๋๊ตฌ๋ค์ ์ค๋นํ์ต๋๋ค. ํด๋น ๋๊ตฌ๋ ํ๊ธ๊ฒ์์ ์ฌ์ฉ๋๋ ํ๊ธ๋ถ์ ์ ํธ๋ฆฌํฐ๋ฅผ ๋ชจ์๋ ์์ ์ ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฝ๋๋ bada-ie ๋์ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ตฌํํ์์ผ๋ฉฐ, ์์ธํ ํ๊ธ ์ธ์ฝ๋ฉ ๊ด๋ จ ์ ๋ณด๋ w3c-hangul-i18n์์ ์ด๋ํ์ค ์ ์์ต๋๋ค.
๐ Speed Cheat Sheet
package main
import (
"fmt"
"strings"
"github.com/daangn/gorean"
)
func main() {
s := " ๋ ๋นต๊ฐํ 5ri๊ตฌ์ด- "
sk, err := gorean.Split(s, gorean.SplitOptBasic)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(sk)
// second parameter[onlyKorean]: gorean.SplitOptBasic
// [[ ] [ ] [ใธ ใ
ใ
] [ใ
ใ
ใ
] [ใฑ ใ
ใฑ] [ใ
ใ
] [ ] [5] [r] [i] [ใฑ ใ
] [ใ
ใ
ฃ] [-] [ ] [ ]]
// second parameter[onlyKorean]: gorean.SplitOptGetOnlyKorean
// [[ใธ ใ
ใ
] [ใ
ใ
ใ
] [ใฑ ใ
ใฑ] [ใ
ใ
] [ใฑ ใ
] [ใ
ใ
ฃ]]
}
var jt1 []string
var jt2 []string
for _, tokens := range sk {
// case: 1
if character, err := gorean.JoinTokens(tokens); err != nil {
fmt.Println(err)
/*
( ) has been out-ranged tokens for JoinKorean
( ) has been out-ranged tokens for JoinKorean
( ) has been out-ranged tokens for JoinKorean
(5) has been out-ranged tokens for JoinKorean
(r) has been out-ranged tokens for JoinKorean
(i) has been out-ranged tokens for JoinKorean
(-) has been out-ranged tokens for JoinKorean
( ) has been out-ranged tokens for JoinKorean
( ) has been out-ranged tokens for JoinKorean
*/
} else {
jt1 = append(jt1, character)
}
// case: 2
if gorean.IsAbleToComposeAlphabetsForSingleCharacter(tokens) {
character, _ := gorean.JoinTokens(tokens)
jt2 = append(jt2, character)
} else {
noneKoreanToken := gorean.FindNoneKoreanAlphabetsForSingleCharacter(tokens)
// you should write to something for exception existing none korean tokens
fmt.Printf("Error! positions [%v] at [%v]\n", tokens, noneKoreanToken)
/*
Error! positions [[ ]] at [[0]]
Error! positions [[ ]] at [[0]]
Error! positions [[ ]] at [[0]]
Error! positions [[5]] at [[0]]
Error! positions [[r]] at [[0]]
Error! positions [[i]] at [[0]]
Error! positions [[-]] at [[0]]
Error! positions [[ ]] at [[0]]
Error! positions [[ ]] at [[0]]
*/
}
}
fmt.Printf("jt1 output => %s\n", strings.Join(jt1, "")) // ๋ ๋นต๊ฐํ๊ตฌ์ด
fmt.Printf("jt2 output => %s\n", strings.Join(jt2, "")) // ๋ ๋นต๊ฐํ๊ตฌ์ด
if edgeNGram, err := gorean.GenerateEdgeNGramTokens(s); err != nil {
fmt.Println(err)
} else {
fmt.Println(edgeNGram)
/*
// Warning: Including whitespace each items at []string, It didn't Trim
[ ใท ใธ ๋ ๋ ๋ ใ
๋ ใ
๋ ๋น ๋ ๋นต ๋ ๋นตใฑ ๋ ๋นต๊ฐ ๋ ๋นต๊ฐ ๋ ๋นต๊ฐใ
๋ ๋นต๊ฐํ ๋ ๋นต๊ฐํ ๋ ๋นต๊ฐํ 5 ๋ ๋นต๊ฐํ 5r ๋ ๋นต๊ฐํ 5ri ๋ ๋นต๊ฐํ 5riใฑ ๋ ๋นต๊ฐํ 5ri๊ตฌ ๋ ๋นต๊ฐํ 5ri๊ถ ๋ ๋นต๊ฐํ 5ri๊ตฌใ
๋ ๋นต๊ฐํ 5ri๊ตฌ์ด ๋ ๋นต๊ฐํ 5ri๊ตฌ์ด- ๋ ๋นต๊ฐํ 5ri๊ตฌ์ด- ๋ ๋นต๊ฐํ 5ri๊ตฌ์ด- ]
*/
}
messKoreanSort := []string{
"ํ๊ธฐ์ค",
"๊น์น๋ณถ์๋ฐฅ",
"์ฌ์์์",
"์๋ฃจ์๋ฐ์ค์ด์",
"์์ด",
"๋ฐฅ์๋จธ๋ฆฌ",
"๊น์น๊พธ์น",
"๋ง์ฅ๋",
"๋๋ฐฑ",
}
gorean.Sort(messKoreanSort, gorean.SortOptAsc)
fmt.Println(messKoreanSort) // [๊น์น๋ณถ์๋ฐฅ ๊น์น๊พธ์น ๋๋ฐฑ ๋ง์ฅ๋ ๋ฐฅ์๋จธ๋ฆฌ ์ฌ์์์ ์์ด ์๋ฃจ์๋ฐ์ค์ด์ ํ๊ธฐ์ค]
koreanWithEnglish := "์ด์ฑํด์ฆ with English"
korean := gorean.Korean(koreanWithEnglish, 10)
fmt.Println(korean) // ์ด์ฑํด์ฆ
chosung, _ := gorean.Chosung(strings.Join(korean, " "))
fmt.Println(strings.Join(chosung, "")) // ใ
ใ
ใ
ใ
}
๐ฑ API Summary
- func gorean.Split([]string, SplitOpt)
- type SplitOpt gorean.SplitOptBasic
- type SplitOpt gorean.SplitOptGetOnlyKorean
- func gorean.JoinTokens([]string) // 2 <= len(ary) <= 3
- func gorean.IsAbleToComposeAlphabetsForSingleCharacter([]string) // 2 <= len(ary) <= 3
- func gorean.FindNoneKoreanAlphabetsForSingleCharacter([]string) // 2 <= len(ary) <= 3
- func gorean.GenerateEdgeNGramTokens(string)
- func gorean.Sort([]string, SortOpt)
- type SortOpt gorean.SortOptAsc
- type SortOpt gorean.SortOptDesc
gorean.Split
- ์ ๋ ฅ๊ฐ์ผ๋ก ์ฅ๋ฌธ์ ๋ฌธ์์ด์ ๋ฐ์ ์ ์์ผ๋ฉฐ, ๊ฐ๊ฐ ํ๊ธ์์ ๋ฐ๋ฅธ 2๊ฐ~3๊ฐ์ elements๋ก ๋์ด์๋ ์๋ชจ ๋ฐฐ์ด์ด ๋์ค๊ฒ ๋๋ฉฐ, ๊ฒฐ๊ณผ๊ฐ์ ์ด์ค๋ฐฐ์ด์ด ๋์ค๊ฒ ๋๋ค.
gorean.JoinTokens
- ์ ๋ ฅ๊ฐ์ผ๋ก ์ฃผ์ด์ง ๋ฐฐ์ด 2๊ฐ~3๊ฐ์ string๋ค์ด ๋์ด์๋ ๋ฐฐ์ด์ ์กฐํฉํด์ ํ๋์ ํ๊ธ ์กฐํฉ๋ฌธ์์ด์ ๋ง๋ ๋ค.
gorean.IsAbleToComposeAlphabetsForSingleCharacter
- ์ ๋ ฅ๊ฐ์ผ๋ก ์ฃผ์ด์ง ๋ฐฐ์ด 2๊ฐ~3๊ฐ์ string๋ค์ด ๋์ด์๋ ๋ฐฐ์ด์ด ํ๊ตญ์ด ์กฐํฉ๊ธ์๊ฐ ๋ ์ ์๋์ง ์ ๋ํ ๊ฒ์ฆ์ฝ๋
- ๋๋ฒ๊น ๋ชฉ์ ์ผ๋ก ๋ง๋ฌ, JoinTokens๋ฅผ ํ๊ธฐ ์ด์ ์ ์ฒดํฌํด๋ณด๊ณ ๋์ด ๊ฐ๋ผ๊ณ ๋ง๋ฌ
gorean.FindNoneKoreanAlphabetsForSingleCharacter
- ์ ๋ ฅ๊ฐ์ผ๋ก ์ฃผ์ด์ง ๋ฐฐ์ด 2๊ฐ~3๊ฐ์ string๋ค์ด ๋์ด์๋ ๋ฐฐ์ด์ ํ๊ธ ์๋ชจ๊ฐ ์๋ ๊ธ์๊ฐ ํฌํจ๋์ด์๋์ง ํ์ธํ๋ ๋๋ฒ๊น ์ฝ๋
- ๋๋ฒ๊น ๋ชฉ์ ์ผ๋ก ๋ง๋ฌ, IsAbleToComposeAlphabetsForSingleCharacter์์ false์ผ ๋์ ์ฌ์ฉํ๋๋ก ์๋
gorean.GenerateEdgeNGramTokens
- ํ๊ธ EdgeNGram ๋ฐ ์ ๋ฐฉ์ผ์น ํ ํฌ๋์ด์ ๋ฅผ ์ป๊ธฐ์ํด ๋ง๋ฌ
- ๊ฐ๋จ์ญ => [ใฑ,๊ฐ,๊ฐ,๊ฐใด,๊ฐ๋,๊ฐ๋จ,๊ฐ๋จใ ,๊ฐ๋จ์ฌ,๊ฐ๋จ์ญ]
gorean.Sort
- ๋ฌธ์์ด ์ ๋ ฌ์ ์ํด ์กด์ฌํจ. ์ ๋ ฌ์ ๋ค์ํ ์ต์ ์ ๊ณต
๐ Release note
-
v0.0.5
[Latest Release]- ๊ธฐ๋ฅ์ถ๊ฐ ์ด์ฑ ์ป๊ธฐ,
Chosung()
- ๊ธฐ๋ฅ์ถ๊ฐ ํ๊ธ ์ฐพ๊ธฐ,
Korean()
- ๊ธฐ๋ฅ์ถ๊ฐ ์ด์ฑ ์ป๊ธฐ,
-
v0.0.6
[ToDo]- ๊ธฐ๋ฅ์ถ๊ฐ ์์ด์ํ to ํ๊ธ
- ๊ธฐ๋ฅ์ถ๊ฐ ํ๊ธ์ํ to ์์ด์ํ
-
v0.0.7
- ๊ธฐ๋ฅ์ ๊ทธ๋ ์ด๋: ํ๊ธ ์ฐพ๊ธฐ, (flash-text)[https://medium.com/@jwyeom63/%EB%B2%88%EC%97%AD-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D%EC%9C%BC%EB%A1%9C-5%EC%9D%BC-%EA%B1%B8%EB%A6%AC%EB%8A%94-%EC%9E%91%EC%97%85-15%EB%B6%84%EB%A7%8C%EC%97%90-%EB%81%9D%EB%82%B4%EA%B8%B0-2e615a907048] ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด ํ๊ธ์ฐพ๊ธฐ ๊ฐ์
-
v0.1.1
[ToDo]- benchmark ๊ฒ์ฆ ๋ฐ ์ฑ๋ฅ ์ต์ ํ
๐ Contribute
- @drakejin ์ ๋ถ์กฑํ๊ฒ ๋ง์ต๋๋ค. ํผ๋๋ฐฑ์ ์ธ์ ๋ ํ์์ด์์.
- ๋ญ๊ฐ ์ถ๊ฐ ํด์คฌ์ผ๋ฉด ํ๋๊ฒ ์๊ฑฐ๋, ๋ณ๊ฒฝํ์ผ๋ฉด ํ๋๊ฒ ์์ผ๋ฉด ์ธ์ ๋ ์ง ์ด์ ๋ฐ PR ๋ณด๋ด์ฃผ์ธ์. ํน๋ณํ ์ผ ์์ผ๋ฉด 2์ผ์์ ๋ฐ์ํด๋๋ฆด๊ฒ์.
๋ง์ฝ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ daangn/gorean์ ์ ์ฌ์ฉํ์ จ๋ค๋ฉด...
- GitHub Star
- ์ด์ง๊ฐ์ ์ฌ๊ณ ๊ณ์๋ค๋ฉด ๐ฅ๋น๊ทผ๋ง์ผ๐ฅ