https://github.com/bab2min/kiwipiepy
Python3 API ๋ฌธ์: https://bab2min.github.io/kiwipiepy
Kiwi 0.5 ๋ฒ์ ๋ถํฐ๋ Python3์ฉ API๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ํ๋ก์ ํธ๋ฅผ ๋น๋ํ์ฌ Python์ ๋ชจ๋์ importํด์ ์ฌ์ฉํ์ ๋ ์ข๊ณ , ํน์ ๋ ๊ฐํธํ๊ฒ pip๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฏธ ๋น๋๋ kiwipiepy ๋ชจ๋์ ์ค์นํ์ ๋ ์ข์ต๋๋ค.
$ pip install --upgrade pip
$ pip install kiwipiepy
๋๋
$ pip3 install --upgrade pip
$ pip3 install kiwipiepy
ํ์ฌ kiwipiepy ํจํค์ง๋ Vista ๋ฒ์ ์ด์์ Windows OS ๋ฐ Linux, macOS 10.12 ์ด์์ ์ง์ํฉ๋๋ค.
macOS M1 ๋ฑ binary distribution์ด ์ ๊ณต๋์ง ์๋ ํ๊ฒฝ์์๋ ์ค์น์ ์์ค ์ฝ๋ ์ปดํ์ผ์ ์ํด cmake3.12 ์ด์์ด ํ์ํฉ๋๋ค.
$ pip install cmake
$ pip install --upgrade pip
$ pip install kiwipiepy
Kiwi 0.6.3 ๋ฒ์ ๋ถํฐ๋ ์ค์น ํ ๋ฐ๋ก ํ ์คํธํ ์ ์๋๋ก ๋ํํ ์ธํฐํ์ด์ค๋ฅผ ์ง์ํฉ๋๋ค. pip๋ฅผ ํตํด ์ค์น๊ฐ ์๋ฃ๋ ํ ๋ค์๊ณผ ๊ฐ์ด ์คํํ์ฌ ํํ์ ๋ถ์๊ธฐ๋ฅผ ์ํํด๋ณผ ์ ์์ต๋๋ค.
$ python -m kiwipiepy
๋๋
$ python3 -m kiwipiepy
๋ํํ ์ธํฐํ์ด์ค๊ฐ ์์๋๋ฉด, ์ํ๋ ๋ฌธ์ฅ์ ์ ๋ ฅํด ๋ฐ๋ก ํํ์ ๋ถ์๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
>> ์๋
?
[Token(form='์๋
', tag='IC', start=0, len=2), Token(form='?', tag='SF', start=2, len=3)]
์ธํฐํ์ด์ค๋ฅผ ์ข ๋ฃํ๋ ค๋ฉด Ctrl + C ๋ฅผ ๋๋ฅด์ญ์์ค.
Kiwi์์ ์ฌ์ฉํ๋ ํ์ฌ ํ๊ทธ๋ ์ธ์ข ๋ง๋ญ์น์ ํ์ฌ ํ๊ทธ๋ฅผ ๊ธฐ์ด๋ก ํ๊ณ ์ผ๋ถ ํ๊ทธ๋ค์ ๊ฐ๋ํ์ฌ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์์ธํ ํ๊ทธ ์ฒด๊ณ์ ๋ํด์๋ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
>>> from kiwipiepy import Kiwi
>>> kiwi = Kiwi()
# tokenize ํจ์๋ก ํํ์ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
>>> kiwi.tokenize("์๋
ํ์ธ์ ํํ์ ๋ถ์๊ธฐ ํค์์
๋๋ค.")
[Token(form='์๋
', tag='NNG', start=0, len=2),
Token(form='ํ', tag='XSA', start=2, len=1),
Token(form='์', tag='EP', start=4, len=1),
Token(form='์ด์', tag='EC', start=3, len=2),
Token(form='ํํ์', tag='NNG', start=6, len=3),
Token(form='๋ถ์', tag='NNG', start=10, len=2),
Token(form='๊ธฐ', tag='NNG', start=12, len=1),
Token(form='ํค์', tag='NNG', start=14, len=2),
Token(form='์ด', tag='VCP', start=16, len=1),
Token(form='แธ๋๋ค', tag='EF', start=17, len=2),
Token(form='.', tag='SF', start=19, len=1)]
# normalize_coda ์ต์
์ ์ฌ์ฉํ๋ฉด
# ๋ง๋ถ์ ๋ฐ์นจ ๋๋ฌธ์ ๋ถ์์ด ๊นจ์ง๋ ๊ฒฝ์ฐ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
>>> kiwi.tokenize("ใ
ใ
ใ
์ด๋ฐ ๊ฒ๋ ๋ถ์์ด ๋ ๊น์ฌใ
ใ
?", normalize_coda=True)
[Token(form='ใ
ใ
ใ
', tag='SW', start=0, len=3),
Token(form='์ด๋ฐ', tag='MM', start=4, len=2),
Token(form='๊ฒ', tag='NNB', start=7, len=1),
Token(form='๋', tag='JX', start=8, len=1),
Token(form='๋ถ์', tag='NNG', start=10, len=2),
Token(form='์ด', tag='JKS', start=12, len=1),
Token(form='๋', tag='VV', start=14, len=1),
Token(form='แฏ๊น์', tag='EC', start=15, len=2),
Token(form='ใ
ใ
ใ
', tag='SW', start=17, len=2),
Token(form='?', tag='SF', start=19, len=1)]
# ๋ถ์ฉ์ด ๊ด๋ฆฌ๋ฅผ ์ํ Stopwords ํด๋์ค๋ ์ ๊ณตํฉ๋๋ค.
>>> from kiwipiepy.utils import Stopwords
>>> stopwords = Stopwords()
>>> kiwi.tokenize("๋ถ์ ๊ฒฐ๊ณผ์์ ๋ถ์ฉ์ด๋ง ์ ์ธํ๊ณ ์ถ๋ ฅํ ์๋ ์๋ค.", stopwords=stopwords)
[Token(form='๋ถ์', tag='NNG', start=0, len=2),
Token(form='๊ฒฐ๊ณผ', tag='NNG', start=3, len=2),
Token(form='๋ถ', tag='XPN', start=8, len=1),
Token(form='์ฉ์ด', tag='NNG', start=9, len=2),
Token(form='์ ์ธ', tag='NNG', start=13, len=2),
Token(form='์ถ๋ ฅ', tag='NNG', start=18, len=2)]
# add, remove ๋ฉ์๋๋ฅผ ์ด์ฉํด ๋ถ์ฉ์ด ๋ชฉ๋ก์ ๋จ์ด๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ์๋ ์์ต๋๋ค.
>>> stopwords.add(('๊ฒฐ๊ณผ', 'NNG'))
>>> kiwi.tokenize("๋ถ์ ๊ฒฐ๊ณผ์์ ๋ถ์ฉ์ด๋ง ์ ์ธํ๊ณ ์ถ๋ ฅํ ์๋ ์๋ค.", stopwords=stopwords)
[Token(form='๋ถ์', tag='NNG', start=0, len=2),
Token(form='๋ถ', tag='XPN', start=8, len=1),
Token(form='์ฉ์ด', tag='NNG', start=9, len=2),
Token(form='์ ์ธ', tag='NNG', start=13, len=2),
Token(form='์ถ๋ ฅ', tag='NNG', start=18, len=2)]
>>> tokens = kiwi.tokenize("๊ฐ ํ ํฐ์ ์ฌ๋ฌ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ต๋๋ค.")
>>> tokens[0]
Token(form='๊ฐ', tag='MM', start=0, len=1)
>>> tokens[0].form # ํํ์์ ํํ ์ ๋ณด
'๊ฐ'
>>> tokens[0].tag # ํํ์์ ํ์ฌ ์ ๋ณด
'MM'
>>> tokens[0].start # ์์ ๋ฐ ๋ ์ง์ (๋ฌธ์ ๋จ์)
0
>>> tokens[0].end
1
>>> tokens[0].word_position # ํ ๋ฌธ์ฅ์์์ ์ด์ ๋ฒํธ
0
>>> tokens[0].sent_position # ํํ์๊ฐ ์ํ ๋ฌธ์ฅ ๋ฒํธ
0
>>> tokens[0].line_number # ํํ์๊ฐ ์ํ ์ค์ ๋ฒํธ
0
# ๋ฌธ์ฅ ๋ถ๋ฆฌ ๊ธฐ๋ฅ๋ ์ง์ํฉ๋๋ค.
>>> kiwi.split_into_sents("์ฌ๋ฌ ๋ฌธ์ฅ์ผ๋ก ๊ตฌ์ฑ๋ ํ
์คํธ๋ค ์ด๊ฑธ ๋ถ๋ฆฌํด์ค")
[Sentence(text='์ฌ๋ฌ ๋ฌธ์ฅ์ผ๋ก ๊ตฌ์ฑ๋ ํ
์คํธ๋ค', start=0, end=16, tokens=None),
Sentence(text='์ด๊ฑธ ๋ถ๋ฆฌํด์ค', start=17, end=24, tokens=None)]
# ๋ฌธ์ฅ ๋ถ๋ฆฌ์ ํํ์ ๋ถ์์ ํจ๊ป ์ํํ ์๋ ์์ต๋๋ค.
>>> kiwi.split_into_sents("์ฌ๋ฌ ๋ฌธ์ฅ์ผ๋ก ๊ตฌ์ฑ๋ ํ
์คํธ๋ค ์ด๊ฑธ ๋ถ๋ฆฌํด์ค", return_tokens=True)
[Sentence(text='์ฌ๋ฌ ๋ฌธ์ฅ์ผ๋ก ๊ตฌ์ฑ๋ ํ
์คํธ๋ค', start=0, end=16, tokens=[
Token(form='์ฌ๋ฌ', tag='MM', start=0, len=2),
Token(form='๋ฌธ์ฅ', tag='NNG', start=3, len=2),
Token(form='์ผ๋ก', tag='JKB', start=5, len=2),
Token(form='๊ตฌ์ฑ', tag='NNG', start=8, len=2),
Token(form='๋', tag='XSV', start=10, len=1),
Token(form='แซ', tag='ETM', start=11, len=0),
Token(form='ํ
์คํธ', tag='NNG', start=12, len=3),
Token(form='์ด', tag='VCP', start=15, len=1),
Token(form='๋ค', tag='EF', start=15, len=1)]),
Sentence(text='์ด๊ฑธ ๋ถ๋ฆฌํด์ค', start=17, end=24, tokens=[
Token(form='์ด๊ฑฐ', tag='NP', start=17, len=2),
Token(form='แฏ', tag='JKO', start=19, len=0),
Token(form='๋ถ๋ฆฌ', tag='NNG', start=20, len=2),
Token(form='ํ', tag='XSV', start=22, len=1),
Token(form='์ด', tag='EC', start=22, len=1),
Token(form='์ฃผ', tag='VX', start=23, len=1),
Token(form='์ด', tag='EF', start=23, len=1)])]
# ์ฌ์ ์ ์๋ก์ด ๋จ์ด๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
>>> kiwi.add_user_word("๊น๊ฐ๊ฐ", "NNP")
True
>>> kiwi.tokenize("๊น๊ฐ๊ฐ์ด ๋๊ตฌ์ผ")
[Token(form='๊น๊ฐ๊ฐ', tag='NNP', start=0, len=3),
Token(form='์ด', tag='JKS', start=3, len=1),
Token(form='๋๊ตฌ', tag='NP', start=5, len=2),
Token(form='์ผ', tag='JKV', start=7, len=1)]
# v0.11.0 ์ ๊ธฐ๋ฅ
# 0.11.0 ๋ฒ์ ๋ถํฐ๋ ์ฌ์ฉ์ ์ฌ์ ์ ๋์ฌ/ํ์ฉ์ฌ๋ฅผ ์ถ๊ฐํ ๋, ๊ทธ ํ์ฉํ๋ ํจ๊ป ๋ฑ์ฌ๋ฉ๋๋ค.
# ์ฌ์ ์ ๋ฑ์ฌ๋์ด ์์ง ์์ ๋์ฌ `ํ
๊ธฐ๋ค`๋ฅผ ๋ถ์ํ๋ฉด, ์๋ฑํ ๊ฒฐ๊ณผ๊ฐ ๋์ต๋๋ค.
>>> kiwi.tokenize('ํ
๊ฒผ๋ค')
[Token(form='ํ
๊ธฐ', tag='NNG', start=0, len=2),
Token(form='ํ', tag='XSA', start=2, len=0),
Token(form='๋ค', tag='EF', start=2, len=1)]
# ํํ์ `ํ
๊ธฐ/VV`๋ฅผ ์ฌ์ ์ ๋ฑ๋กํ๋ฉด, ์ด ํํ์์ ๋ชจ๋ ํ์ฉํ์ด ์๋์ผ๋ก ์ถ๊ฐ๋๊ธฐ์
# `ํ
๊ฒผ๋ค`, `ํ
๊ธธ` ๋ฑ์ ํํ๋ฅผ ๋ชจ๋ ๋ถ์ํด๋ผ ์ ์์ต๋๋ค.
>>> kiwi.add_user_word('ํ
๊ธฐ', 'VV')
True
>>> kiwi.tokenize('ํ
๊ฒผ๋ค')
[Token(form='ํ
๊ธฐ', tag='VV', start=0, len=2),
Token(form='์', tag='EP', start=1, len=1),
Token(form='๋ค', tag='EF', start=2, len=1)]
# ๋ํ ๋ณํ๋ ํํ์๋ฅผ ์ผ๊ด์ ์ผ๋ก ์ถ๊ฐํ์ฌ ๋์ ํ
์คํธ์ ๋ง์ถฐ ๋ถ์ ์ฑ๋ฅ์ ๋์ผ ์ ์์ต๋๋ค.
>>> kiwi.tokenize("์๋
ํ์ธ์, ์ ์ด๋ฆ์ ์ด์ธ์์ด์์. ํ์์ด์ธ์?")
[Token(form='์๋
', tag='NNG', start=0, len=2),
Token(form='ํ', tag='XSA', start=2, len=1),
Token(form='์', tag='EP', start=3, len=1),
Token(form='์ด', tag='EC', start=3, len=1),
Token(form='์', tag='MAG', start=4, len=1), # ์ค๋ถ์
Token(form=',', tag='SP', start=5, len=1),
Token(form='์ ', tag='NP', start=7, len=1),
Token(form='์', tag='JKG', start=7, len=1),
Token(form='์ด๋ฆ', tag='NNG', start=9, len=2),
Token(form='์', tag='JX', start=11, len=1),
Token(form='์ด์ธ์', tag='NNP', start=13, len=3),
Token(form='์ด', tag='JKS', start=16, len=1),
Token(form='์', tag='IC', start=17, len=1),
Token(form='์', tag='NR', start=18, len=1),
Token(form='.', tag='SF', start=19, len=1),
Token(form='๋', tag='NNG', start=21, len=1),
Token(form='๋', tag='JX', start=22, len=1),
Token(form='ํ์', tag='NNG', start=24, len=2),
Token(form='์ด์ธ์', tag='NNP', start=26, len=3), # ์ค๋ถ์
Token(form='?', tag='SF', start=29, len=1)]
# ์ข
๊ฒฐ์ด๋ฏธ(EF) ์ค '์'๋ก ๋๋๋ ๊ฒ๋ค์ '์'์ผ๋ก ๋์ฒดํ์ฌ ์ผ๊ด ์ฝ์
ํฉ๋๋ค.
# ์ด ๋ ๋ณํ๋ ์ข
๊ฒฐ์ด๋ฏธ์๋ -3์ ํ๋ํฐ๋ฅผ ๋ถ์ฌํ์ฌ ์ ํํ์๋ณด๋ค ์ฐ์ ํ์ง ์๋๋ก ํฉ๋๋ค.
# ์๋ก ์ฝ์
๋ ํํ์๋ค์ด ๋ฐํ๋ฉ๋๋ค.
>>> kiwi.add_re_rule('EF', '์$', '์', -3)
['์ด์', '์์', '์ง์', '์์์', '๊ฑฐ๋ ์', 'แฏ๊น์', '๋ค์', '๊ตฌ์', '๋์', '๊ตฐ์', ..., '์ผ๋๊น์']
# ๋์ผํ ๋ฌธ์ฅ์ ์ฌ๋ถ์ํ๋ฉด ๋ถ์ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
>>> kiwi.tokenize("์๋
ํ์ธ์, ์ ์ด๋ฆ์ ์ด์ธ์์ด์์. ๋๋ ํ์์ด์ธ์?")
[Token(form='์๋
', tag='NNG', start=0, len=2),
Token(form='ํ', tag='XSA', start=2, len=1),
Token(form='์', tag='EP', start=3, len=1),
Token(form='์ด์', tag='EF', start=3, len=2), # ๋ถ์ ๊ฒฐ๊ณผ ๊ฐ์
Token(form=',', tag='SP', start=5, len=1),
Token(form='์ ', tag='NP', start=7, len=1),
Token(form='์', tag='JKG', start=7, len=1),
Token(form='์ด๋ฆ', tag='NNG', start=9, len=2),
Token(form='์', tag='JX', start=11, len=1),
Token(form='์ด์ธ์', tag='NNP', start=13, len=3),
Token(form='์ด', tag='VCP', start=16, len=1),
Token(form='์์', tag='EF', start=17, len=2),
Token(form='.', tag='SF', start=19, len=1),
Token(form='๋', tag='NNG', start=21, len=1),
Token(form='๋', tag='JX', start=22, len=1),
Token(form='ํ์', tag='NNG', start=24, len=2),
Token(form='์ด', tag='VCP', start=26, len=1),
Token(form='์', tag='EP', start=27, len=1),
Token(form='์ด์', tag='EF', start=27, len=2), # ๋ถ์ ๊ฒฐ๊ณผ ๊ฐ์
Token(form='?', tag='SF', start=29, len=1)]
# ๊ธฐ๋ถ์ ํํ๋ฅผ ๋ฑ๋กํ์ฌ ์ํ๋ ๋๋ก ๋ถ์๋์ง ์๋ ๋ฌธ์์ด์ ๊ต์ ํ ์๋ ์์ต๋๋ค.
# ๋ค์ ๋ฌธ์ฅ์ `์ฌ๊ฒผ๋`๋ ์คํ๊ฐ ๋ค์ด๊ฐ ํํ๋ผ ์ ๋๋ก ๋ถ์๋์ง ์์ต๋๋ค.
>>> kiwi.tokenize('๊ฑ๋ค ๋์ด ์ฌ๊ฒผ๋')
[Token(form='๊ฑ', tag='NP', start=0, len=1),
Token(form='๋ค', tag='XSN', start=1, len=1),
Token(form='๋', tag='NR', start=3, len=1),
Token(form='์ด', tag='JKS', start=4, len=1),
Token(form='์ฌ', tag='NR', start=6, len=1),
Token(form='๊ธฐ', tag='VV', start=7, len=1),
Token(form='์', tag='EP', start=7, len=1),
Token(form='๋', tag='EF', start=8, len=1)]
# ๋ค์๊ณผ ๊ฐ์ด add_pre_analyzed_word ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ์ด๋ฅผ ๊ต์ ํ ์ ์์ต๋๋ค.
>>> kiwi.add_pre_analyzed_word('์ฌ๊ฒผ๋', ['์ฌ๊ท/VV', '์/EP', '๋/EF'], -3)
True
# ๊ทธ ๋ค ๋์ผํ ๋ฌธ์ฅ์ ๋ค์ ๋ถ์ํด๋ณด๋ฉด ๊ฒฐ๊ณผ๊ฐ ๋ฐ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
>>> kiwi.tokenize('๊ฑ๋ค ๋์ด ์ฌ๊ฒผ๋')
[Token(form='๊ฑ', tag='NP', start=0, len=1),
Token(form='๋ค', tag='XSN', start=1, len=1),
Token(form='๋', tag='NR', start=3, len=1),
Token(form='์ด', tag='JKS', start=4, len=1),
Token(form='์ฌ๊ท', tag='VV', start=6, len=3),
Token(form='์', tag='EP', start=6, len=3),
Token(form='๋', tag='EF', start=6, len=3)]
# ๋จ, ์ฌ๊ท/VV, ์/EP, ๋/EF์ ์์์์น๊ฐ ๋ชจ๋ 6, ๊ธธ์ด๊ฐ ๋ชจ๋ 3์ผ๋ก ์๋ชป ์กํ๋ ๋ฌธ์ ๊ฐ ๋ณด์
๋๋ค.
# ์ด๋ฅผ ๊ณ ์น๊ธฐ ์ํด์๋ add_pre_analyzed_word ์ ๊ฐ ํํ์์ ์์น์ ๋ณด๋ ํจ๊ป ์
๋ ฅํด์ฃผ์ด์ผํฉ๋๋ค.
>>> kiwi = Kiwi()
>>> kiwi.add_pre_analyzed_word('์ฌ๊ฒผ๋', [('์ฌ๊ท', 'VV', 0, 2), ('์', 'EP', 1, 2), ('๋', 'EF', 2, 3)], -3)
True
>>> kiwi.tokenize('๊ฑ๋ค ๋์ด ์ฌ๊ฒผ๋')
[Token(form='๊ฑ', tag='NP', start=0, len=1),
Token(form='๋ค', tag='XSN', start=1, len=1),
Token(form='๋', tag='NR', start=3, len=1),
Token(form='์ด', tag='JKS', start=4, len=1),
Token(form='์ฌ๊ท', tag='VV', start=6, len=2,
Token(form='์', tag='EP', start=7 len=1,
Token(form='๋', tag='EF', start=8 len=1]
# v0.12.0 ์ ๊ธฐ๋ฅ
# 0.12.0 ๋ฒ์ ๋ถํฐ๋ ํํ์๋ฅผ ๊ฒฐํฉํ์ฌ ๋ฌธ์ฅ์ผ๋ก ๋ณต์ํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค.
>>> kiwi.join([('๊ธธ', 'NNG'), ('์', 'JKO'), ('๋ฌป', 'VV'), ('์ด์', 'EF')])
'๊ธธ์ ๋ฌผ์ด์'
>>> kiwi.join([('ํ', 'NNG'), ('์ด', 'JKS'), ('๋ฌป', 'VV'), ('์ด์', 'EF')])
'ํ์ด ๋ฌป์ด์'
# v0.13.0 ์ ๊ธฐ๋ฅ
# ๋ ๊ฐ๋ ฅํ ์ธ์ด ๋ชจ๋ธ์ธ SkipBigram(sbg)์ด ์ถ๊ฐ๋์์ต๋๋ค.
# ๊ธฐ์กด์ knlm๊ณผ ๋ฌ๋ฆฌ ๋จผ ๊ฑฐ๋ฆฌ์ ์๋ ํํ์๋ฅผ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
>>> kiwi = Kiwi(model_type='knlm')
>>> kiwi.tokenize('์ด ๋ฒํธ๋ก ์ ํ๋ฅผ ์ด๋ฐ๊ฐ ๊ผญ ๋ฐ๋์ ๊ฑธ์ด.')
[Token(form='์ด', tag='MM', start=0, len=1),
Token(form='๋ฒํธ', tag='NNG', start=2, len=2),
Token(form='๋ก', tag='JKB', start=4, len=1),
Token(form='์ ํ', tag='NNG', start=6, len=2),
Token(form='๋ฅผ', tag='JKO', start=8, len=1),
Token(form='์ด๋ฐ๊ฐ', tag='MAG', start=10, len=3),
Token(form='๊ผญ', tag='MAG', start=14, len=1),
Token(form='๋ฐ๋์', tag='MAG', start=16, len=3),
Token(form='๊ฑท', tag='VV-I', start=20, len=1), # ๊ฑท๋ค/๊ฑธ๋ค ์ค ํ๋ฆฌ๊ฒ '๊ฑท๋ค'๋ฅผ ์ ํํ์.
Token(form='์ด', tag='EF', start=21, len=1),
Token(form='.', tag='SF', start=22, len=1)]
>>> kiwi = Kiwi(model_type='sbg')
>>> kiwi.tokenize('์ด ๋ฒํธ๋ก ์ ํ๋ฅผ ์ด๋ฐ๊ฐ ๊ผญ ๋ฐ๋์ ๊ฑธ์ด.')
[Token(form='์ด', tag='MM', start=0, len=1),
Token(form='๋ฒํธ', tag='NNG', start=2, len=2),
Token(form='๋ก', tag='JKB', start=4, len=1),
Token(form='์ ํ', tag='NNG', start=6, len=2),
Token(form='๋ฅผ', tag='JKO', start=8, len=1),
Token(form='์ด๋ฐ๊ฐ', tag='MAG', start=10, len=3),
Token(form='๊ผญ', tag='MAG', start=14, len=1),
Token(form='๋ฐ๋์', tag='MAG', start=16, len=3),
Token(form='๊ฑธ', tag='VV', start=20, len=1), # ๊ฑท๋ค/๊ฑธ๋ค ์ค ๋ฐ๋ฅด๊ฒ '๊ฑธ๋ค'๋ฅผ ์ ํํ์.
Token(form='์ด', tag='EC', start=21, len=1),
Token(form='.', tag='SF', start=22, len=1)]
# ๋ํ ์คํ ๊ต์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค.
# ๊ฐ๋จํ ์คํ๋ฅผ ๊ต์ ํ์ฌ, ์ฌ์ํ ์คํ ๋๋ฌธ์ ์ ์ฒด ๋ถ์ ๊ฒฐ๊ณผ๊ฐ ์ด๊ธ๋๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
>>> kiwi = Kiwi(model_type='sbg', typos='basic')
>>> kiwi.tokenize('์ธ์๋๋?') # ์คํ ๊ต์ ์ฌ์ฉ ์ ๋ก๋ฉ ์๊ฐ์ด 5~10์ด ์ ๋ ์์๋จ
[Token(form='์', tag='MAG', start=0, len=1),
Token(form='์', tag='MAG', start=1, len=1),
Token(form='๋', tag='VV', start=2, len=1),
Token(form='แซ๋', tag='EF', start=2, len=2),
Token(form='?', tag='SF', start=4, len=1)]
>>> kiwi.tokenize('์ฅ๋กํฌ๋ง์ด ๋ญ๋๋ ์ ์๋์ ์ง๋ฌธ์ ๋ฒ์ด๋ฆฌ๊ฐ ๋ซ๋ฐ')
[Token(form='์ฅ๋', tag='NNG', start=0, len=2),
Token(form='ํฌ๋ง', tag='NNG', start=2, len=2),
Token(form='์ด', tag='JKS', start=4, len=1),
Token(form='๋ญ', tag='NP', start=6, len=1),
Token(form='์ด', tag='VCP', start=7, len=0),
Token(form='๋๋', tag='ETM', start=7, len=2),
Token(form='์ ์', tag='NNG', start=10, len=2),
Token(form='๋', tag='XSN', start=12, len=1),
Token(form='์', tag='JKG', start=13, len=1),
Token(form='์ง๋ฌธ', tag='NNG', start=15, len=2),
Token(form='์', tag='JKB', start=17, len=1),
Token(form='๋ฒ์ด๋ฆฌ', tag='NNG', start=19, len=3),
Token(form='๊ฐ', tag='JKC', start=22, len=1),
Token(form='๋', tag='VV', start=24, len=1),
Token(form='์', tag='EP', start=24, len=1),
Token(form='๋ค', tag='EF', start=25, len=1)]
# 0.17.1์์๋ ์ฐ์ฒ ์ ๋ํ ์คํ ๊ต์ ์ด ์ถ๊ฐ๋์์ต๋๋ค.
# ๋ฐ์นจ + ์ด์ฑ ใ
/ใ
๊ผด์ ์๋ชป ์ด์ด์ ์ ๊ฒฝ์ฐ์ ๋ํด ๊ต์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
>>> kiwi = Kiwi(typos='continual')
>>> kiwi.tokenize('์ค๋์ฌ๋ฌด์๋ ์')
[Token(form='์ค๋', tag='NNG', start=0, len=2),
Token(form='์ฌ๋ฌด์ค', tag='NNG', start=2, len=4),
Token(form='์์', tag='JKB', start=5, len=2)]
>>> kiwi.tokenize('์ง๊ฐ์บค์ด์')
[Token(form='์ง๊ฐ', tag='NNG', start=0, len=3),
Token(form='ํ', tag='XSV', start=2, len=1),
Token(form='์', tag='EP', start=2, len=1),
Token(form='์ด์', tag='EF', start=3, len=2)]
# ๊ธฐ๋ณธ ์คํ ๊ต์ ์ ์ฐ์ฒ ์คํ ๊ต์ ๊น์ง ํจ๊ป ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
>>> kiwi = Kiwi(typos='basic_with_continual')
>>> kiwi.tokenize('์จ ์ง๊ฐ์บค๋?')
[Token(form='์', tag='MAG', start=0, len=1),
Token(form='์ง๊ฐ', tag='NNG', start=2, len=3),
Token(form='ํ', tag='XSV', start=4, len=1),
Token(form='์', tag='EP', start=4, len=1),
Token(form='๋', tag='EC', start=5, len=1),
Token(form='?', tag='SF', start=6, len=1)]
# 0.19.0 ๋ฒ์ ์์๋ ์ฅ์ํ ์ค๋ฅ(ํ ์์ ์ ์ฌ๋ฌ ์์ ๋ก ๋๋ ค ์ ๋ ์ค๋ฅ)๊ฐ
# ํฌํจ๋ ํ
์คํธ๋ฅผ ๊ต์ ํ๋ ๊ธฐ๋ฅ๋ ์ถ๊ฐ๋์์ต๋๋ค.
>>> kiwi = Kiwi(typos='lengthening')
>>> kiwi.tokenize('์ง์ด์ธ์ง ๊ท์ฌ์์')
[Token(form='์ง์ง', tag='MAG', start=0, len=4),
Token(form='๊ท์ฝ', tag='VA-I', start=5, len=3),
Token(form='์ด์', tag='EF', start=7, len=2)]
# ๊ธฐ๋ณธ ์คํ ๊ต์ + ์ฐ์ฒ ์คํ ๊ต์ + ์ฅ์ํ ์ค๋ฅ ๊ต์ ์ ํจ๊ป ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
>>> kiwi = Kiwi(typos='basic_with_continual_and_lengthening')
>>> kiwi.tokenize('์ง์ด์ธ์ง ๊ธฐ์ฌ์์~ ๋ง๋ ์ข์ํด')
[Token(form='์ง์ง', tag='MAG', start=0, len=4),
Token(form='๊ท์ฝ', tag='VA-I', start=5, len=3),
Token(form='์ด์', tag='EF', start=7, len=2),
Token(form='~', tag='SO', start=9, len=1),
Token(form='๋ง์ด', tag='MAG', start=11, len=2),
Token(form='์ข์ํ', tag='VV', start=14, len=3),
Token(form='์ด', tag='EF', start=16, len=1)]
# 0.17.0 ๋ฒ์ ๋ถํฐ๋ ์ฌ์ฉ์ ์ฌ์ ์ ๊ณต๋ฐฑ์ด ์๋ ๋จ์ด๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
>>> kiwi = Kiwi()
# '๋ํ์ ์ ๊ตํ'๋ผ๋ ๋จ์ด๋ฅผ ๋ฑ๋กํฉ๋๋ค.
>>> kiwi.add_user_word('๋ํ์ ์ ๊ตํ', 'NNP')
True
# ๋ฑ๋กํ ๊ฒ๊ณผ ๋์ผํ ํํ์์๋
# ๋น์ฐํ ์ ๋ถ์๋ฉ๋๋ค.
>>> kiwi.tokenize('๋ํ์ ์ ๊ตํ์์')
[Token(form='๋ํ์ ์ ๊ตํ', tag='NNP', start=0, len=7),
Token(form='์์', tag='JKB', start=7, len=2)]
# ์ถ๊ฐ๋ก ๊ณต๋ฐฑ์ด ์๋ ํํ์๋ ์ผ์น๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
>>> kiwi.tokenize('๋ํ์์ ๊ตํ์์')
kiwi.tokenize('๋ํ์์ ๊ตํ์์')
[Token(form='๋ํ์ ์ ๊ตํ', tag='NNP', start=0, len=6),
Token(form='์์', tag='JKB', start=6, len=2)]
# ํญ ๋ฌธ์๋ ์ค๋ฐ๊ฟ ๋ฌธ์ ๋ฑ์ด ๋ค์ด๊ฐ๋ ์ผ์น๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
# ์ฐ์ํ ๊ณต๋ฐฑ ๋ฌธ์๋ ๊ณต๋ฐฑ 1๋ฒ๊ณผ ๋์ผํ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.
>>> kiwi.tokenize('๋ํ์ \t \n ์ ๊ตํ์์')
[Token(form='๋ํ์ ์ ๊ตํ', tag='NNP', start=0, len=11),
Token(form='์์', tag='JKB', start=11, len=2)]
# ๊ทธ๋ฌ๋ ์ฌ์ ๋ฑ์ฌ ์ ๊ณต๋ฐฑ์ด ์๋ ์ง์ ์
# ๊ณต๋ฐฑ์ด ์๋ ๊ฒฝ์ฐ์๋ ์ผ์น๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
>>> kiwi.tokenize('๋ํ ์์ ๊ตํ์์')
[Token(form='๋ํ', tag='NNG', start=0, len=2),
Token(form='์์ ', tag='NNG', start=3, len=2),
Token(form='๊ตํ', tag='NNG', start=6, len=2),
Token(form='์์', tag='JKB', start=8, len=2)]
# space_tolerance๋ฅผ 2๋ก ์ค์ ํ์ฌ
# ๊ณต๋ฐฑ์ด ๋ ๊ฐ๊น์ง ํ๋ฆฐ ๊ฒฝ์ฐ๋ฅผ ํ์ฉํ๋๋ก ํ๋ฉด
# '๋ํ ์์ ๊ตํ'์๋ '๋ํ์ ์ ๊ตํ'๊ฐ ์ผ์นํ๊ฒ ๋ฉ๋๋ค.
>>> kiwi.space_tolerance = 2
>>> kiwi.tokenize('๋ํ ์์ ๊ตํ์์')
[Token(form='๋ํ์ ์ ๊ตํ', tag='NNP', start=0, len=8),
Token(form='์์', tag='JKB', start=8, len=2)]
# 0.18.0 ๋ฒ์ ์์๋ ์ธ๊ตญ์ด ๋ฌธ์, ์ด๋ชจ์ง์ ๋ํ ์ง์์ด ๊ฐํ๋์์ต๋๋ค.
# ํ๋ฉด์ ํ์๋๋ ๊ธ์ ๋จ์๋ก ํ ํฐ์ด ๋ถํ ๋ฉ๋๋ค.
>>> kiwi.tokenize('๐โ๐ปโ๐ฟ')
[Token(form='๐', tag='W_EMOJI', start=0, len=1),
Token(form='โ๐ป', tag='W_EMOJI', start=1, len=2),
Token(form='โ๐ฟ', tag='W_EMOJI', start=3, len=2)]
# ์ฐธ๊ณ : v0.17์ ๊ฒฐ๊ณผ
# [Token(form='๐โ๐ปโ๐ฟ', tag='SW', start=0, len=5)]
# script ํ๋๊ฐ ์ถ๊ฐ๋์ด ํด๋น ๋ฌธ์๊ฐ
# ์ ๋์ฝ๋ ์์์ ์ด๋ค ์์ญ์ ์ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
# SW, SH, SL, W_EMOJI ํ๊ทธ์ ๋ํด์๋ง script๊ฐ์ด ๋ถ์ฌ๋ฉ๋๋ค.
>>> tokens = kiwi.tokenize('ใฒใใใชใซใฟใซใ')
>>> tokens
[Token(form='ใฒใใใชใซใฟใซใ', tag='SW', start=0, len=8)]
>>> tokens[0].script
'Kana'
>>> tokens = kiwi.tokenize('rรฉsumรฉ')
>>> tokens
[Token(form='rรฉsumรฉ', tag='SL', start=0, len=6)]
# ์ฐธ๊ณ v0.17๊น์ง์ ๊ฒฐ๊ณผ
# [Token(form='r', tag='SL', start=0, len=1),
# Token(form='รฉ', tag='SW', start=1, len=1),
# Token(form='sum', tag='SL', start=2, len=3),
# Token(form='รฉ', tag='SW', start=5, len=1)]
>>> tokens[0].script
'Latin'
>>> tokens = kiwi.tokenize('แผฅฯฯฯ')
>>> tokens
[Token(form='แผฅฯฯฯ', tag='SW', start=0, len=4)]
>>> tokens[0].script
'Greek and Coptic'
>>> tokens = kiwi.tokenize('เธเธฑเธเธเธญเธเธเธดเธเธเนเธฒเธงเธเธฑเธ')
>>> tokens
[Token(form='เธเธฑเธเธเธญเธเธเธดเธเธเนเธฒเธงเธเธฑเธ', tag='SW', start=0, len=16)]
>>> tokens[0].script
'Thai'
# 0.18.1๋ฒ์ ๋ถํฐ๋ ๋ฐ์นจ๋ง์ผ๋ก ๊ตฌ์ฑ๋ ํํ์ ์ถ๋ ฅ์
# ํธํ์ฉ ์๋ชจ๋ฅผ ์ฌ์ฉํ๋ ์ต์
์ ์ ๊ณตํฉ๋๋ค.
>>> kiwi.tokenize('์์๋ฐ')
[Token(form='์์', tag='VA', start=0, len=2),
Token(form='แซ๋ฐ', tag='EF', start=1, len=2)]
>>> kiwi.tokenize('์์๋ฐ', compatible_jamo=True)
[Token(form='์์', tag='VA', start=0, len=2),
Token(form='ใด๋ฐ', tag='EF', start=1, len=2)]
# ๋ฐ์นจ แซ์ด ํธํ์ฉ ์๋ชจ์ธ ใด์ผ๋ก ๋ณํ๋์ด ์ถ๋ ฅ๋จ
# 0.20.0๋ฒ์ ์์๋ ์ฌ์ด์์ท ๋ถ์์ ์ํํ๋ ์ต์
์ด ์ถ๊ฐ๋์์ต๋๋ค.
# ์ฌ์ ์ ๋ฑ์ฌ๋์ด ์์ง ์์, ์ฌ์ด์์ท์ด ๋ค์ด๊ฐ ํฉ์ฑ๋ช
์ฌ๋
# ๋ค์๊ณผ ๊ฐ์ด ์๋ชป ๋ถ์๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
>>> kiwi.tokenize('์๊ณ๋ฐ๋')
[Token(form='์๊ณ', tag='NNG', start=0, len=2),
Token(form='๋ฐ๋', tag='NNG', start=2, len=2)]
# saisiot=True ์ต์
์ ์ฃผ๋ฉด ์ฌ์ด์์ท์ ํํ์๋ก ๊ฐ์ฃผํ์ฌ
# ๋ค์๊ณผ ๊ฐ์ด ๋ถ๋ฆฌํด์ค๋๋ค.
>>> kiwi.tokenize('์๊ณ๋ฐ๋', saisiot=True)
[Token(form='์๊ณ', tag='NNG', start=0, len=2),
Token(form='แบ', tag='Z_SIOT', start=1, len=1),
Token(form='๋ฐ๋', tag='NNG', start=2, len=2)]
# saisiot=False ์ต์
์ ์ฃผ๋ฉด ์ฌ์ด์์ท์ด ๋ค์ด๊ฐ ํฉ์ฑ ๋ช
์ฌ ์ ์ฒด๋ฅผ
# ํ๋์ ํํ์๋ก ํฉ์ณ์ ์ถ๋ ฅํฉ๋๋ค.
>>> kiwi.tokenize('์๊ณ๋ฐ๋', saisiot=False)
[Token(form='์๊ณ๋ฐ๋', tag='NNG', start=0, len=4)]
kiwipiepy ํจํค์ง ์ค์น๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ํจํค์ง๋ฅผ importํ Kiwi ๊ฐ์ฒด๋ฅผ ์์ฑํ์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
from kiwipiepy import Kiwi, Match
kiwi = Kiwi()
Kiwi ์์ฑ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Kiwi(num_workers=0, model_path=None, load_default_dict=True, integrate_allomorph=True, model_type='knlm', typos=None, typo_cost_threshold=2.5)
num_workers
: 2 ์ด์์ด๋ฉด ๋จ์ด ์ถ์ถ ๋ฐ ํํ์ ๋ถ์์ ๋ฉํฐ ์ฝ์ด๋ฅผ ํ์ฉํ์ฌ ์กฐ๊ธ ๋ ๋น ๋ฅธ ์๋๋ก ๋ถ์์ ์งํํ ์ ์์ต๋๋ค.
1์ธ ๊ฒฝ์ฐ ๋จ์ผ ์ฝ์ด๋ง ํ์ฉํฉ๋๋ค. num_workers๊ฐ 0์ด๋ฉด ํ์ฌ ํ๊ฒฝ์์ ์ฌ์ฉ๊ฐ๋ฅํ ๋ชจ๋ ์ฝ์ด๋ฅผ ํ์ฉํฉ๋๋ค.
์๋ต ์ ๊ธฐ๋ณธ๊ฐ์ 0์ ๋๋ค.model_path
: ํํ์ ๋ถ์ ๋ชจ๋ธ์ด ์๋ ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค. ์๋ต์kiwipiepy_model
ํจํค์ง๋ก๋ถํฐ ๋ชจ๋ธ ๊ฒฝ๋ก๋ฅผ ๋ถ๋ฌ์ต๋๋ค.load_default_dict
: ์ถ๊ฐ ์ฌ์ ์ ๋ก๋ํฉ๋๋ค. ์ถ๊ฐ ์ฌ์ ์ ์ํค๋ฐฑ๊ณผ์ ํ์ ์ด ํ์ดํ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋ก๋ฉ ๋ฐ ๋ถ์ ์๊ฐ์ด ์ฝ๊ฐ ์ฆ๊ฐํ์ง๋ง ๋ค์ํ ๊ณ ์ ๋ช ์ฌ๋ฅผ ์ข ๋ ์ ์ก์๋ผ ์ ์์ต๋๋ค. ๋ถ์ ๊ฒฐ๊ณผ์ ์์น ์๋ ๊ณ ์ ๋ช ์ฌ๊ฐ ์กํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ค๋ฉด ์ด๋ฅผ False๋ก ์ค์ ํ์ญ์์ค.integrate_allomorph
: ์ด๋ฏธ ์ค, '์/์ด', '์/์'๊ณผ ๊ฐ์ด ๋์ผํ์ง๋ง ์์ด ํ๊ฒฝ์ ๋ฐ๋ผ ํํ๊ฐ ๋ฌ๋ผ์ง๋ ์ดํํ๋ค์ ์๋์ผ๋ก ํตํฉํฉ๋๋ค.model_type
: ํํ์ ๋ถ์์ ์ฌ์ฉํ ์ธ์ด ๋ชจ๋ธ์ ์ง์ ํฉ๋๋ค.'knlm'
,'sbg'
์ค ํ๋๋ฅผ ์ ํํ ์ ์์ต๋๋ค.'sbg'
๋ ์๋์ ์ผ๋ก ๋๋ฆฌ์ง๋ง ๋จผ ๊ฑฐ๋ฆฌ์ ์๋ ํํ์ ๊ฐ์ ๊ด๊ณ๋ฅผ ํฌ์ฐฉํ ์ ์์ต๋๋ค.typos
: ํํ์ ๋ถ์ ์ ๊ฐ๋จํ ์คํ๋ฅผ ๊ต์ ํฉ๋๋ค.None
์ผ๋ก ์ค์ ์ ๊ต์ ์ ์ํํ์ง ์์ต๋๋ค.typo_cost_threshold
: ์คํ ๊ต์ ์ ํ์ฉํ ์ต๋ ์คํ ๋น์ฉ์ ์ค์ ํฉ๋๋ค.
kiwi ๊ฐ์ฒด๋ ํฌ๊ฒ ๋ค์ ์ธ ์ข ๋ฅ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
- ์ฝํผ์ค๋ก๋ถํฐ ๋ฏธ๋ฑ๋ก ๋จ์ด ์ถ์ถ
- ์ฌ์ฉ์ ์ฌ์ ๊ด๋ฆฌ
- ํํ์ ๋ถ์
Kiwi 0.5๋ถํฐ ์๋ก ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์์ฃผ ๋ฑ์ฅํ๋ ๋ฌธ์์ด์ ํจํด์ ํ์ ํ์ฌ ๋จ์ด๋ก ์ถ์ ๋๋ ๋ฌธ์์ด์ ์ถ์ถํด์ค๋๋ค. ์ด ๊ธฐ๋ฅ์ ๊ธฐ์ด์ ์ธ ์์ด๋์ด๋ https://github.com/lovit/soynlp ์ Word Extraction ๊ธฐ๋ฒ์ ๋ฐํ์ผ๋ก ํ๊ณ ์์ผ๋ฉฐ, ์ด์ ๋ฌธ์์ด ๊ธฐ๋ฐ์ ๋ช ์ฌ ํ๋ฅ ์ ์กฐํฉํ์ฌ ๋ช ์ฌ์ผ ๊ฒ์ผ๋ก ์์ธก๋๋ ๋จ์ด๋ง ์ถ์ถํฉ๋๋ค.
Kiwi๊ฐ ์ ๊ณตํ๋ ๋ฏธ๋ฑ๋ก ๋จ์ด ์ถ์ถ ๊ด๋ จ ๋ฉ์๋๋ ๋ค์ ๋ ๊ฐ์ง์ ๋๋ค.
Kiwi.extract_words(texts, min_cnt, max_word_len, min_score)
Kiwi.extract_add_words(texts, min_cnt, max_word_len, min_score, pos_score)
extract_words(texts, min_cnt=10, max_word_len=10, min_score=0.25, pos_score=-3.0, lm_filter=True)
texts
: ๋ถ์ํ ํ ์คํธ๋ฅผIterable[str]
ํํ๋ก ๋ฃ์ด์ค๋๋ค. ์์ธํ ๊ฑด ์๋์ ์์ ๋ฅผ ์ฐธ์กฐํด์ฃผ์ธ์.min_cnt
: ์ถ์ถํ ๋จ์ด๊ฐ ์ ๋ ฅ ํ ์คํธ ๋ด์์ ์ต์ ๋ช ๋ฒ ์ด์ ๋ฑ์ฅํ๋ ์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ ๋ ฅ ํ ์คํธ๊ฐ ํด ์๋ก ๊ทธ ๊ฐ์ ๋์ฌ์ฃผ์๋๊ฒ ์ข์ต๋๋ค.max_word_len
: ์ถ์ถํ ๋จ์ด์ ์ต๋ ๊ธธ์ด์ ๋๋ค. ์ด ๊ฐ์ ๋๋ฌด ํฌ๊ฒ ์ค์ ํ ๊ฒฝ์ฐ ๋จ์ด๋ฅผ ์ค์บํ๋ ์๊ฐ์ด ๊ธธ์ด์ง๋ฏ๋ก ์ ์ ํ๊ฒ ์กฐ์ ํด์ฃผ์๋ ๊ฒ ์ข์ต๋๋ค.min_score
: ์ถ์ถํ ๋จ์ด์ ์ต์ ๋จ์ด ์ ์์ ๋๋ค. ์ด ๊ฐ์ ๋ฎ์ถ์๋ก ๋จ์ด๊ฐ ์๋ ํํ๊ฐ ์ถ์ถ๋ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๊ณ , ๋ฐ๋๋ก ์ด ๊ฐ์ ๋์ผ ์๋ก ์ถ์ถ๋๋ ๋จ์ด์ ๊ฐ์๊ฐ ์ค์ด๋ค๋ฏ๋ก ์ ์ ํ ์์น๋ก ์ค์ ํ์ค ํ์๊ฐ ์์ต๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 0.25์ ๋๋ค.pos_score
: ์ถ์ถํ ๋จ์ด์ ์ต์ ๋ช ์ฌ ์ ์์ ๋๋ค. ์ด ๊ฐ์ ๋ฎ์ถ์๋ก ๋ช ์ฌ๊ฐ ์๋ ๋จ์ด๋ค์ด ์ถ์ถ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฉฐ, ๋ฐ๋๋ก ๋์ผ์๋ก ์ถ์ถ๋๋ ๋ช ์ฌ์ ๊ฐ์๊ฐ ์ค์ด๋ญ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ -3์ ๋๋ค.lm_filter
: ํ์ฌ ๋ฐ ์ธ์ด ๋ชจ๋ธ์ ์ด์ฉํ ํํฐ๋ง์ ์ฌ์ฉํ ์ง ๊ฒฐ์ ํฉ๋๋ค.
# ์
๋ ฅ์ผ๋ก str์ list๋ฅผ ์ค ๊ฒฝ์ฐ
inputs = list(open('test.txt', encoding='utf-8'))
kiwi.extract_words(inputs, min_cnt=10, max_word_len=10, min_score=0.25)
'''
์์ ์ฝ๋์์๋ ๋ชจ๋ ์
๋ ฅ์ ๋ฏธ๋ฆฌ list๋ก ์ ์ฅํด๋๋ฏ๋ก
test.txt ํ์ผ์ด ํด ๊ฒฝ์ฐ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ชจํ ์ ์์ต๋๋ค.
๊ทธ ๋์ ํ์ผ์์ ํ์ํ ๋ถ๋ถ๋ง ๊ฐ์ ธ์ ์ฌ์ฉํ๋ ค๋ฉด(streaming)
์๋์ ๊ฐ์ด ์ฌ์ฉํด์ผ ํฉ๋๋ค.
'''
class IterableTextFile:
def __init__(self, path):
self.path = path
def __iter__(self):
yield from open(path, encoding='utf-8')
kiwi.extract_words(IterableTextFile('test.txt'), min_cnt=10, max_word_len=10, min_score=0.25)
extract_add_words(texts, min_cnt=10, max_word_len=10, min_score=0.25, pos_score=-3, lm_filter=True)
extract_words
์ ๋์ผํ๊ฒ ๋ช
์ฌ์ธ ๋จ์ด๋ง ์ถ์ถํด์ค๋๋ค.
๋ค๋ง ์ด ๋ฉ์๋๋ ์ถ์ถ๋ ๋ช
์ฌ ํ๋ณด๋ฅผ ์๋์ผ๋ก ์ฌ์ฉ์ ์ฌ์ ์ NNP
๋ก ๋ฑ๋กํ์ฌ ํํ์ ๋ถ์์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค. ๋ง์ฝ ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด add_user_word ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ถ์ถ๋ ๋ฏธ๋ฑ๋ก ๋จ์ด๋ฅผ ์ง์ ์ฌ์ฉ์ ์ฌ์ ์ ๋ฑ๋กํด์ผ ํฉ๋๋ค.
๊ธฐ์กด์ ์ฌ์ ์ ๋ฑ๋ก๋์ง ์์ ๋จ์ด๋ฅผ ์ ๋๋ก ๋ถ์ํ๊ธฐ ์ํด์๋ ์ฌ์ฉ์ ์ฌ์ ์ ํด๋น ๋จ์ด๋ฅผ ๋ฑ๋กํด์ฃผ์ด์ผ ํฉ๋๋ค. ์ด๋ extract_add_words๋ฅผ ํตํด์ ์๋์ผ๋ก ์ด๋ค์ง ์๋ ์๊ณ , ์์์ ์ผ๋ก ์ง์ ์ถ๊ฐ๋ ์๋ ์์ต๋๋ค. ๋ค์ ๋ฉ์๋๋ค์ ์ฌ์ฉ์ ์ฌ์ ์ ๊ด๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋๋ ๋ฉ์๋๋ค์ ๋๋ค.
Kiwi.add_user_word(word, tag, score, orig_word=None)
Kiwi.add_pre_analyzed_word(form, analyzed, score)
Kiwi.add_rule(tag, replacer, score)
Kiwi.add_re_rule(tag, pattern, repl, score)
Kiwi.load_user_dictionary(user_dict_path)
add_user_word(word, tag='NNP', score=0.0, orig_word=None)
์ฌ์ฉ์ ์ฌ์ ์ ์ ํํ์๋ฅผ ๋ฑ๋กํฉ๋๋ค.
word
: ๋ฑ๋กํ ํํ์์ ํํ์ ๋๋ค. ํ์ฌ๋ ๋์ด์ฐ๊ธฐ(๊ณต๋ฐฑ๋ฌธ์)๊ฐ ํฌํจ๋์ง ์๋ ๋ฌธ์์ด๋ง ๋จ์ด๋ก ๋ฑ๋กํ ์ ์์ต๋๋ค.tag
: ๋ฑ๋กํ ํํ์์ ํ์ฌ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ NNP(๊ณ ์ ๋ช ์ฌ)์ ๋๋ค.score
: ๋ฑ๋กํ ํํ์์ ์ ์์ ๋๋ค. ๋์ผํ ํํ๋ผ๋ ์ฌ๋ฌ ๊ฒฝ์ฐ๋ก ๋ถ์๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ์, ์ด ๊ฐ์ด ํด์๋ก ํด๋น ํํ์๊ฐ ๋ ์ฐ์ ๊ถ์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.orig_word
: ์ถ๊ฐํ ํํ์๊ฐ ํน์ ํํ์์ ๋ณ์ดํ์ธ ๊ฒฝ์ฐ ์ด ์ธ์๋ก ์๋ณธ ํํ์๋ฅผ ๋๊ฒจ์ค ์ ์์ต๋๋ค. ์๋ ๊ฒฝ์ฐ ์๋ตํ ์ ์์ต๋๋ค. ์ด ๊ฐ์ ์ค ๊ฒฝ์ฐ, ํ์ฌ ์ฌ์ ๋ด์orig_word
/tag
์กฐํฉ์ ํํ์๊ฐ ๋ฐ๋์ ์กด์ฌํด์ผ ํ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉดValueError
์์ธ๋ฅผ ๋ฐ์์ํต๋๋ค. ์๋ณธ ํํ์๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐorig_word
๋ฅผ ๋ช ์ํ๋ฉด ๋ ์ ํํ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋ผ ์ ์์ต๋๋ค.
ํํ์ ์ฝ์
์ด ์ฑ๊ณตํ๋ฉด True
๋ฅผ, ๋์ผํ ํํ์๊ฐ ์ด๋ฏธ ์กด์ฌํ์ฌ ์คํจํ๋ฉด False
๋ฅผ ๋ฐํํฉ๋๋ค.
add_pre_analyzed_word(form, analyzed, score=0.0)
์ฌ์ฉ์ ์ฌ์ ์ ๊ธฐ๋ถ์ ํํ๋ฅผ ๋ฑ๋กํฉ๋๋ค. ์ด๋ฅผ ํตํด ํน์ ํํ๊ฐ ์ฌ์ฉ์๊ฐ ์ํ๋ ํํ๋ก ํํ์ ๋ถ์์ด ๋๋๋ก ์ ๋ํ ์ ์์ต๋๋ค.
form
: ๊ธฐ๋ถ์์ ํํ์ ๋๋ค.analyzed
:form
์ ํํ์ ๋ถ์ ๊ฒฐ๊ณผ. ์ด ๊ฐ์ (ํํ, ํ์ฌ) ๋ชจ์์ tuple, ํน์ (ํํ, ํ์ฌ, ์์์ง์ , ๋์ง์ ) ๋ชจ์์ tuple๋ก ๊ตฌ์ฑ๋ Iterable์ด์ด์ผํฉ๋๋ค. ์ด ๊ฐ์ผ๋ก ์ง์ ๋๋ ํํ์๋ ํ์ฌ ์ฌ์ ๋ด์ ๋ฐ๋์ ์กด์ฌํด์ผ ํ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉดValueError
์์ธ๋ฅผ ๋ฐ์์ํต๋๋ค.score
: ์ถ๊ฐํ ํํ์์ด์ ๊ฐ์ค์น ์ ์. ํด๋น ํํ์ ๋ถํฉํ๋ ํํ์ ์กฐํฉ์ด ์ฌ๋ฌ ๊ฐ๊ฐ ์๋ ๊ฒฝ์ฐ, ์ด ์ ์๊ฐ ๋์ ๋จ์ด๊ฐ ๋ ์ฐ์ ๊ถ์ ๊ฐ์ง๋๋ค.
์ฝ์
์ด ์ฑ๊ณตํ๋ฉด True
๋ฅผ, ๋์ผํ ํํ๊ฐ ์ด๋ฏธ ์กด์ฌํ์ฌ ์คํจํ๋ฉด False
๋ฅผ ๋ฐํํฉ๋๋ค.
์ด ๋ฉ์๋๋ ๋ถ๊ท์น์ ์ธ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋ถ์๊ธฐ์ ์ถ๊ฐํ๋ ๋ฐ์ ์ฉ์ดํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ฌ๊ท๋ค
๋์ฌ์ ๊ณผ๊ฑฐํ์ ์ฌ๊ท์๋ค
๊ฐ ๋ง์ง๋ง, ํํ ์ฌ๊ฒผ๋ค
๋ก ์๋ชป ์ฐ์ด๊ธฐ๋ ํฉ๋๋ค.
์ฌ๊ฒผ๋ค
๊ฐ ์ฌ๊ท/VV + ์/EP + ๋ค/EF
๋ก ๋ฐ๋ฅด๊ฒ ๋ถ์๋๋๋ก ํ๋๋ฐ์ ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
kiwi.add_pre_analyzed_word('์ฌ๊ฒผ๋ค', ['์ฌ๊ท/VV', '์/EP', '๋ค/EF'], -3)`
kiwi.add_pre_analyzed_word('์ฌ๊ฒผ๋ค', [('์ฌ๊ท', 'VV', 0, 2), ('์', 'EP', 1, 2), ('๋ค', 'EF', 2, 3)], -3)
ํ์์ ๊ฒฝ์ฐ ๋ถ์ ๊ฒฐ๊ณผ์ ๊ฐ ํํ์๊ฐ ์๋ณธ ๋ฌธ์์ด์์ ์ฐจ์งํ๋ ์์น๋ฅผ ์ ํํ๊ฒ ์ง์ ํด์ค์ผ๋ก์จ,
Kiwi ๋ถ์ ๊ฒฐ๊ณผ์์ ํด๋น ํํ์์ start
, end
, length
๊ฐ ์ ํํ๊ฒ ๋์ค๋๋ก ํฉ๋๋ค.
add_rule(tag, replacer, score)
๊ท์น์ ์ํด ๋ณํ๋ ํํ์๋ฅผ ์ผ๊ด์ ์ผ๋ก ์ถ๊ฐํฉ๋๋ค.
tag
: ์ถ๊ฐํ ํํ์๋ค์ ํ์ฌreplacer
: ํํ์๋ฅผ ๋ณํ์ํฌ ๊ท์น. ์ด ๊ฐ์ ํธ์ถ๊ฐ๋ฅํ Callable ํํ๋ก ์ ๊ณต๋์ด์ผ ํ๋ฉฐ, ์๋ณธ ํํ์ str๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ๋ณํ๋ ํํ์์ str์ ๋ฐํํด์ผํฉ๋๋ค. ๋ง์ฝ ์ ๋ ฅ๊ณผ ๋์ผํ ๊ฐ์ ๋ฐํํ๋ฉด ํด๋น ๋ณํ ๊ฒฐ๊ณผ๋ ๋ฌด์๋ฉ๋๋ค.score
: ์ถ๊ฐํ ๋ณํ๋ ํํ์์ ๊ฐ์ค์น ์ ์. ํด๋น ํํ์ ๋ถํฉํ๋ ํํ์ ์กฐํฉ์ด ์ฌ๋ฌ ๊ฐ๊ฐ ์๋ ๊ฒฝ์ฐ, ์ด ์ ์๊ฐ ๋์ ๋จ์ด๊ฐ ๋ ์ฐ์ ๊ถ์ ๊ฐ์ง๋๋ค.
replacer
์ ์ํด ์๋ก ์์ฑ๋ ํํ์์ list
๋ฅผ ๋ฐํํฉ๋๋ค.
add_re_rule(tag, pattern, repl, score)
add_rule
๋ฉ์๋์ ๋์ผํ ์ญํ ์ ์ํํ๋, ๋ณํ ๊ท์น์ ์ ๊ทํํ์์ ์ฌ์ฉํฉ๋๋ค.
tag
: ์ถ๊ฐํ ํํ์๋ค์ ํ์ฌpattern
: ๋ณํ์ํฌ ํํ์์ ๊ท์น. ์ด ๊ฐ์re.compile
๋ก ์ปดํ์ผ๊ฐ๋ฅํ ์ ๊ทํํ์์ด์ด์ผ ํฉ๋๋ค.repl
:pattern
์ ์ํด ๋ฐ๊ฒฌ๋ ํจํด์ ์ด ๊ฐ์ผ๋ก ๊ต์ฒด๋ฉ๋๋ค. Python3 ์ ๊ทํํ์ ๋ชจ๋ ๋ด์re.sub
ํจ์์repl
์ธ์์ ๋์ผํฉ๋๋ค.score
: ์ถ๊ฐํ ๋ณํ๋ ํํ์์ ๊ฐ์ค์น ์ ์. ํด๋น ํํ์ ๋ถํฉํ๋ ํํ์ ์กฐํฉ์ด ์ฌ๋ฌ ๊ฐ๊ฐ ์๋ ๊ฒฝ์ฐ, ์ด ์ ์๊ฐ ๋์ ๋จ์ด๊ฐ ๋ ์ฐ์ ๊ถ์ ๊ฐ์ง๋๋ค.
pattern
๊ณผ repl
์ ์ํด ์๋ก ์์ฑ๋ ํํ์์ list
๋ฅผ ๋ฐํํฉ๋๋ค.
์ด ๋ฉ์๋๋ ๊ท์น์ ์ํด ๋ณํ๋๋ ์ดํํ๋ค์ ์ผ๊ด์ ์ผ๋ก ์ถ๊ฐํ ๋ ๊ต์ฅํ ์ฉ์ดํฉ๋๋ค.
์๋ฅผ ๋ค์ด -์
๊ฐ -์ผ
์ผ๋ก ๊ต์ฒด๋ ์ข
๊ฒฐ์ด๋ฏธ๋ค(๋จน์ด์ผ
, ๋ฐ์๊ตฌ์ผ
, ๋ฐฐ๋ถ๋ฌ์ผ
๋ฑ)์ ์ผ๊ด ๋ฑ๋กํ๊ธฐ ์ํด์๋
๋ค์์ ์ํํ๋ฉด ๋ฉ๋๋ค.
kiwi.add_re_rule('EF', r'์$', r'์ผ', -3.0)
์ด๋ฐ ์ดํํ๋ค์ ๋๋์ผ๋ก ๋ฑ๋กํ ๊ฒฝ์ฐ ์ดํํ๊ฐ ์๋ณธ ํํ๋ณด๋ค ๋ถ์๊ฒฐ๊ณผ์์ ๋์ ์ฐ์ ๊ถ์ ๊ฐ์ง์ง ์๋๋ก
score๋ฅผ -3
์ดํ์ ๊ฐ์ผ๋ก ์ค์ ํ๋๊ฑธ ๊ถ์ฅํฉ๋๋ค.
load_user_dictionary(user_dict_path)
ํ์ผ๋ก๋ถํฐ ์ฌ์ฉ์ ์ฌ์ ์ ์ฝ์ด๋ค์ ๋๋ค. ์ฌ์ฉ์ ์ฌ์ ํ์ผ์ UTF-8๋ก ์ธ์ฝ๋ฉ๋์ด ์์ด์ผํ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ๊ตฌ์ฑ๋์ด์ผ ํฉ๋๋ค. ํญ ๋ฌธ์(\t)๋ก ๊ฐ๊ฐ์ ํ๋๋ ๋ถ๋ฆฌ๋์ด์ผ ํ๋ฉฐ, ๋จ์ด ์ ์๋ ์๋ต ๊ฐ๋ฅํฉ๋๋ค.
#์ผ๋ก ์์ํ๋ ์ค์ ์ฃผ์ ์ฒ๋ฆฌ๋ฉ๋๋ค.
# ๊ฐ ํ๋๋ Tab(\t)๋ฌธ์๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
#
# <๋จ์ผ ํํ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ>
# (ํํ) \t (ํ์ฌํ๊ทธ) \t (์ ์)
# * (์ ์)๋ ์๋ต์ 0์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
ํค์ NNP -5.0
#
# <์ด๋ฏธ ์กด์ฌํ๋ ํํ์์ ์ดํํ๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ>
# (์ดํํ) \t (์ํํ์/ํ์ฌํ๊ทธ) \t (์ ์)
# * (์ ์)๋ ์๋ต์ 0์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
๊ธฐ์ ํค์/NNG -3.0
#
# <๊ธฐ๋ถ์ ํํ๋ฅผ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ>
# (ํํ) \t (์ํํ์/ํ์ฌํ๊ทธ + ์ํํ์/ํ์ฌํ๊ทธ + ...) \t (์ ์)
# * (์ ์)๋ ์๋ต์ 0์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
์ฌ๊ฒผ๋ค ์ฌ๊ท/VV + ์/EP + ๋ค/EF -1.0
์ฌ์ ํ์ผ์ ์ฑ๊ณต์ ์ผ๋ก ์ฝ์ด๋ค์ด๋ฉด, ์ฌ์ ์ ํตํด ์๋ก ์ถ๊ฐ๋ ํํ์์ ๊ฐ์๋ฅผ ๋ฐํํฉ๋๋ค.
์ค์ ์์์ ๋ํด์๋ Kiwi์ ๋ด์ฅ๋ ๊ธฐ๋ณธ ์ฌ์ ํ์ผ์ ์ฐธ์กฐํด์ฃผ์ธ์.
kiwi์ ์์ฑํ๊ณ , ์ฌ์ฉ์ ์ฌ์ ์ ๋จ์ด๋ฅผ ์ถ๊ฐํ๋ ์์ ์ด ์๋ฃ๋์์ผ๋ฉด ๋ค์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํํ์ ๋ถ์, ๋ฌธ์ฅ ๋ถ๋ฆฌ, ๋์ด์ฐ๊ธฐ ๊ต์ , ๋ฌธ์ฅ ๋ณต์ ๋ฑ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
Kiwi.tokenize(text, match_option, normalize_coda=False, z_coda=True, split_complex=False, compatible_jamo=False, saisiot=None, blocklist=None)
Kiwi.analyze(text, top_n, match_option, normalize_coda=False, z_coda=True, split_complex=False, compatible_jamo=False, saisiot=None, blocklist=None)
Kiwi.split_into_sents(text, match_options=Match.ALL, normalize_coda=False, z_coda=True, split_complex=False, compatible_jamo=False, saisiot=None, blocklist=None, return_tokens=False)
Kiwi.glue(text_chunks, insert_new_lines=None, return_space_insertions=False)
Kiwi.space(text, reset_whitespace=False)
Kiwi.join(morphs, lm_search=True)
Kiwi.template(format_str, cache=True)
tokenize(text, match_option=Match.ALL, normalize_coda=False, z_coda=True, split_complex=False, compatible_jamo=False, saisiot=None, blocklist=None)
์
๋ ฅ๋ text
๋ฅผ ํํ์ ๋ถ์ํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๋จํ๊ฒ ๋ฐํํฉ๋๋ค. ๋ถ์๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ด Token
์ ๋ฆฌ์คํธ ํํ๋ก ๋ฐํ๋ฉ๋๋ค.
>> kiwi.tokenize('ํ
์คํธ์
๋๋ค.')
[Token(form='ํ
์คํธ', tag='NNG', start=0, len=3), Token(form='์ด', tag='VCP', start=3, len=1), Token(form='แธ๋๋ค', tag='EF', start=4, len=2)]
normalize_coda
๋ ใ
ใ
ใ
,ใ
ใ
ใ
์ ๊ฐ์ ์ด์ฑ์ฒด๊ฐ ๋ค๋ฐ๋ผ์์ ๋ฐ์นจ์ผ๋ก ๋ค์ด๊ฐ์๋ ๋ถ์์ ์คํจํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ค๋๋ค.
>> kiwi.tokenize("์ ๋จน์์ใ
ใ
", normalize_coda=False)
[Token(form='์', tag='NNP', start=0, len=1),
Token(form='๋จน์์', tag='NNP', start=2, len=3),
Token(form='ใ
ใ
', tag='SW', start=5, len=2)]
>> kiwi.tokenize("์ ๋จน์์ใ
ใ
", normalize_coda=True)
[Token(form='์', tag='MAG', start=0, len=1),
Token(form='๋จน', tag='VV', start=2, len=1),
Token(form='์', tag='EP', start=3, len=1),
Token(form='์ด', tag='EF', start=4, len=1),
Token(form='ใ
ใ
ใ
', tag='SW', start=5, len=2)]
analyze(text, top_n=1, match_option=Match.ALL, normalize_coda=False, z_coda=True, split_complex=False, compatible_jamo=False, saisiot=None, blocklist=None)
์
๋ ฅ๋ text
๋ฅผ ํํ์ ๋ถ์ํ์ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ์ด top_n๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์์ธํ๊ฒ ์ถ๋ ฅํฉ๋๋ค. ๋ฐํ๊ฐ์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋ฉ๋๋ค.
[(๋ถ์๊ฒฐ๊ณผ1, ์ ์), (๋ถ์๊ฒฐ๊ณผ2, ์ ์), ... ]
๋ถ์๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ด Token
์ ๋ฆฌ์คํธ ํํ๋ก ๋ฐํ๋ฉ๋๋ค.
์ค์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
>> kiwi.analyze('ํ
์คํธ์
๋๋ค.', top_n=5)
[([Token(form='ํ
์คํธ', tag='NNG', start=0, len=3), Token(form='์ด', tag='VCP', start=3, len=1), Token(form='แธ๋๋ค', tag='EF', start=4, len=2)], -25.217018127441406),
([Token(form='ํ
์คํธ์
๋', tag='NNG', start=0, len=5), Token(form='๋ค', tag='EC', start=5, len=1)], -40.741905212402344),
([Token(form='ํ
์คํธ์
๋', tag='NNG', start=0, len=5), Token(form='๋ค', tag='MAG', start=5, len=1)], -41.81024932861328),
([Token(form='ํ
์คํธ์
๋', tag='NNG', start=0, len=5), Token(form='๋ค', tag='EF', start=5, len=1)], -42.300254821777344),
([Token(form='ํ
์คํธ', tag='NNG', start=0, len=3), Token(form='์
', tag='NNG', start=3, len=1), Token(form='๋๋ค', tag='EF', start=4, len=2)], -45.86524200439453)
]
๋ง์ฝ text๊ฐ str์ iterable์ธ ๊ฒฝ์ฐ ์ฌ๋ฌ ๊ฐ์ ์ ๋ ฅ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋์ ๋ฐํ๊ฐ์ ๋จ์ผ text๋ฅผ ์ ๋ ฅํ ๊ฒฝ์ฐ์ ๋ฐํ๊ฐ์ iterable์ ๋๋ค. Kiwi() ์์ฑ์ ์ธ์๋ก ์ค num_workers์ ๋ฐ๋ผ ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋์์ ์์ ์ด ๋์์ ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ฐํ๋๋ ๊ฐ์ ์ ๋ ฅ๋๋ ๊ฐ์ ์์์ ๋์ผํฉ๋๋ค.
>> result_iter = kiwi.analyze(['ํ
์คํธ์
๋๋ค.', 'ํ
์คํธ๊ฐ ์๋๋๋ค.', '์ฌ์ค ๋ง์ต๋๋ค.'])
>> next(result_iter)
[([Token(form='ํ
์คํธ', tag='NNG', start=0, len=3), Token(form='์ด', tag='VCP', start=3, len=1), Token(form='แธ๋๋ค', tag='EF', start=4, len=2), Token(form='.', tag='SF', start=6, len=1)], -20.441545486450195)]
>> next(result_iter)
[([Token(form='ํ
์คํธ', tag='NNG', start=0, len=3), Token(form='๊ฐ', tag='JKC', start=3, len=1), Token(form='์๋', tag='VCN', start=5, len=2), Token(form='แธ๋๋ค', tag='EF', start=7, len=2), Token(form='.', tag='SF', start=9, len=1)], -30.23870277404785)]
>> next(result_iter)
[([Token(form='์ฌ์ค', tag='MAG', start=0, len=2), Token(form='๋ง', tag='VV', start=3, len=1), Token(form='์ต๋๋ค', tag='EF', start=4, len=3), Token(form='.', tag='SF', start=7, len=1)], -22.232769012451172)]
>> next(result_iter)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
for ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ฉด ์ข๋ ๊ฐ๋จํ๊ณ ํธ๋ฆฌํ๊ฒ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํํ ์ ์์ต๋๋ค. ์ด๋ ๋๋์ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํ ๋ ์ ์ฉํฉ๋๋ค.
>> for result in kiwi.analyze(long_list_of_text):
tokens, score = result[0]
print(tokens)
text๋ฅผ str์ iterable๋ก ์ค ๊ฒฝ์ฐ ์ด iterable์ ์ฝ์ด๋ค์ด๋ ์์ ์ analyze ํธ์ถ ์ดํ์ผ ์๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ์ธ์๊ฐ ๋ค๋ฅธ IO ์์(ํ์ผ ์ ์ถ๋ ฅ ๋ฑ)๊ณผ ์ฐ๋๋์ด ์๋ค๋ฉด ๋ชจ๋ ๋ถ์์ด ๋๋๊ธฐ ์ ๊น์ง ํด๋น ์์์ ์ข ๋ฃํ๋ฉด ์๋ฉ๋๋ค.
>> file = open('long_text.txt', encoding='utf-8')
>> result_iter = kiwi.analyze(file)
>> file.close() # ํ์ผ์ด ์ข
๋ฃ๋จ
>> next(result_iter) # ์ข
๋ฃ๋ ํ์ผ์์ ๋ถ์ํด์ผํ ๋ค์ ํ
์คํธ๋ฅผ ์ฝ์ด๋ค์ด๋ ค๊ณ ์๋ํจ
ValueError: I/O operation on closed file.
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
SystemError: <built-in function next> returned a result with an error set
split_into_sents(
text,
match_options=Match.ALL,
normalize_coda=False,
z_coda=True,
split_complex=False,
compatible_jamo=False,
saisiot=None,
return_tokens=False
)
์
๋ ฅ ํ
์คํธ๋ฅผ ๋ฌธ์ฅ ๋จ์๋ก ๋ถํ ํ์ฌ ๋ฐํํฉ๋๋ค.
์ด ๋ฉ์๋๋ ๋ฌธ์ฅ ๋ถํ ๊ณผ์ ์์ ๋ด๋ถ์ ์ผ๋ก ํํ์ ๋ถ์์ ์ฌ์ฉํ๋ฏ๋ก ๋ฌธ์ฅ ๋ถํ ๊ณผ ๋์์ ํํ์ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๋ฐ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. `return_tokens`๋ฅผ `True`๋ก ์ค์ ํ๋ฉด ๋ฌธ์ฅ ๋ถ๋ฆฌ์ ํจ๊ป ํํ์ ๋ถ์ ๊ฒฐ๊ณผ๋ ์ถ๋ ฅํฉ๋๋ค.
>> kiwi.split_into_sents("์ฌ๋ฌ ๋ฌธ์ฅ์ผ๋ก ๊ตฌ์ฑ๋ ํ
์คํธ๋ค ์ด๊ฑธ ๋ถ๋ฆฌํด์ค")
[Sentence(text='์ฌ๋ฌ ๋ฌธ์ฅ์ผ๋ก ๊ตฌ์ฑ๋ ํ
์คํธ๋ค', start=0, end=16, tokens=None),
Sentence(text='์ด๊ฑธ ๋ถ๋ฆฌํด์ค', start=17, end=24, tokens=None)]
>> kiwi.split_into_sents("์ฌ๋ฌ ๋ฌธ์ฅ์ผ๋ก ๊ตฌ์ฑ๋ ํ
์คํธ๋ค ์ด๊ฑธ ๋ถ๋ฆฌํด์ค", return_tokens=True)
[Sentence(text='์ฌ๋ฌ ๋ฌธ์ฅ์ผ๋ก ๊ตฌ์ฑ๋ ํ
์คํธ๋ค', start=0, end=16, tokens=[
Token(form='์ฌ๋ฌ', tag='MM', start=0, len=2),
Token(form='๋ฌธ์ฅ', tag='NNG', start=3, len=2),
Token(form='์ผ๋ก', tag='JKB', start=5, len=2),
Token(form='๊ตฌ์ฑ', tag='NNG', start=8, len=2),
Token(form='๋', tag='XSV', start=10, len=1),
Token(form='แซ', tag='ETM', start=11, len=0),
Token(form='ํ
์คํธ', tag='NNG', start=12, len=3),
Token(form='์ด', tag='VCP', start=15, len=1),
Token(form='๋ค', tag='EF', start=15, len=1)
]),
Sentence(text='์ด๊ฑธ ๋ถ๋ฆฌํด์ค', start=17, end=24, tokens=[
Token(form='์ด๊ฑฐ', tag='NP', start=17, len=2),
Token(form='แฏ', tag='JKO', start=19, len=0),
Token(form='๋ถ๋ฆฌ', tag='NNG', start=20, len=2),
Token(form='ํ', tag='XSV', start=22, len=1),
Token(form='์ด', tag='EC', start=22, len=1),
Token(form='์ฃผ', tag='VX', start=23, len=1),
Token(form='์ด', tag='EF', start=23, len=1)
])]
glue(text_chunks, return_space_insertions=False)
์ฌ๋ฌ ํ
์คํธ ์กฐ๊ฐ์ ํ๋๋ก ํฉ์น๋, ๋ฌธ๋งฅ์ ๊ณ ๋ คํด ์ ์ ํ ๊ณต๋ฐฑ์ ์ฌ์ด์ ์ฝ์
ํฉ๋๋ค.
์ด ๊ธฐ๋ฅ์ OCR๋ก ์์ฑ๋๊ฑฐ๋ PDF ๋ฑ์์ ๋ณต์ฌํ์ฌ ๊ฐ์ ๊ฐํ์ด ํฌํจ๋ ํ
์คํธ๋ฅผ ์ด์ด ๋ถ์ด๋๋ฐ์ ์ฉ์ดํฉ๋๋ค.
text_chunks
: ํฉ์น ํ ์คํธ ์กฐ๊ฐ๋ค์ ๋ชฉ๋ก์ ๋๋ค.return_space_insertions
: True์ธ ๊ฒฝ์ฐ, ๊ฐ ์กฐ๊ฐ๋ณ ๊ณต๋ฐฑ ์ฝ์ ์ ๋ฌด๋ฅผList[bool]
๋ก ๋ฐํํฉ๋๋ค.
>> kiwi.glue([
"๊ทธ๋ฌ๋ ์๊ณ ๋ณด๋ ๊ทธ ๋ด",
"์ง ์์ ์๋ ๊ฒ์ ๋ฐ๋ก",
"๋ ๋ชฌ์ด์๋ ๊ฒ์ด๋ค."])
"๊ทธ๋ฌ๋ ์๊ณ ๋ณด๋ ๊ทธ ๋ด์ง ์์ ์๋ ๊ฒ์ ๋ฐ๋ก ๋ ๋ชฌ์ด์๋ ๊ฒ์ด๋ค."
>> kiwi.glue([
"๊ทธ๋ฌ๋ ์๊ณ ๋ณด๋ ๊ทธ ๋ด",
"์ง ์์ ์๋ ๊ฒ์ ๋ฐ๋ก",
"๋ ๋ชฌ์ด์๋ ๊ฒ์ด๋ค."], return_space_insertions=True)
("๊ทธ๋ฌ๋ ์๊ณ ๋ณด๋ ๊ทธ ๋ด์ง ์์ ์๋ ๊ฒ์ ๋ฐ๋ก ๋ ๋ชฌ์ด์๋ ๊ฒ์ด๋ค.", [False, True])
space(text, reset_whitespace=False)
์
๋ ฅ ํ
์คํธ์์ ๋์ด์ฐ๊ธฐ๋ฅผ ๊ต์ ํ์ฌ ๋ฐํํฉ๋๋ค.
text
: ๋ถ์ํ ๋ฌธ์์ด์ ๋๋ค. ์ด ์ธ์๋ฅผ ๋จ์ผ str๋ก ์ค ๊ฒฝ์ฐ, ์ฑ๊ธ์ค๋ ๋์์ ์ฒ๋ฆฌํ๋ฉฐ str์ Iterable๋ก ์ค ๊ฒฝ์ฐ, ๋ฉํฐ์ค๋ ๋๋ก ๋ถ๋ฐฐํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค.reset_whitespace
True์ธ ๊ฒฝ์ฐ ์ด๋ฏธ ๋์ด์ฐ๊ธฐ๋ ๋ถ๋ถ์ ๋ถ์ด๋ ๊ต์ ๋ ์ ๊ทน์ ์ผ๋ก ์ํํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ False๋ก, ์ด ๊ฒฝ์ฐ์๋ ๋ถ์ด ์๋ ๋จ์ด๋ฅผ ๋์ด์ฐ๋ ๊ต์ ์์ฃผ๋ก ์ํํฉ๋๋ค.
์ด ๋ฉ์๋์ ๋์ด์ฐ๊ธฐ ๊ต์ ๊ธฐ๋ฅ์ ํํ์ ๋ถ์์ ๊ธฐ๋ฐํฉ๋๋ค.
๋ฐ๋ผ์ ํํ์ ์ค๊ฐ์ ๊ณต๋ฐฑ์ด ์ฝ์
๋ ๊ฒฝ์ฐ ๊ต์ ๊ฒฐ๊ณผ๊ฐ ๋ถ์ ํํ ์ ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ Kiwi.space_tolerance
๋ฅผ ์กฐ์ ํ์ฌ ํํ์ ๋ด ๊ณต๋ฐฑ์ ๋ฌด์ํ๊ฑฐ๋,
reset_whitespace=True
๋ก ์ค์ ํ์ฌ ์์ ๊ธฐ์กด ๊ณต๋ฐฑ์ ๋ฌด์ํ๊ณ ๋์ด์ฐ๊ธฐ๋ฅผ ํ๋๋ก ํ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค.
>> kiwi.space("๋์ด์ฐ๊ธฐ์์ด์์ฑ๋ํ
์คํธ๋ค์ด๊ฑธ๊ต์ ํด์ค")
"๋์ด์ฐ๊ธฐ ์์ด ์์ฑ๋ ํ
์คํธ๋ค ์ด๊ฑธ ๊ต์ ํด ์ค."
>> kiwi.space("๋ ์ด ์ฐ ๊ธฐ ๋ฌธ ์ ๊ฐ ์ ์ต ๋ ๋ค")
"๋์ด ์ฐ๊ธฐ ๋ฌธ ์ ๊ฐ ์ ์ต ๋ ๋ค"
>> kiwi.space_tolerance = 2 # ํํ์ ๋ด ๊ณต๋ฐฑ์ ์ต๋ 2๊ฐ๊น์ง ํ์ฉ
>> kiwi.space("๋ ์ด ์ฐ ๊ธฐ ๋ฌธ ์ ๊ฐ ์ ์ต ๋ ๋ค")
"๋์ด ์ฐ๊ธฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค"
>> kiwi.space("๋ ์ด ์ฐ ๊ธฐ ๋ฌธ ์ ๊ฐ ์ ์ต ๋ ๋ค", reset_whitespace=True) # ๊ธฐ์กด ๊ณต๋ฐฑ ์ ๋ถ ๋ฌด์
"๋์ด์ฐ๊ธฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค"
join(morphs, lm_search=True)
ํํ์๋ค์ ๊ฒฐํฉํ์ฌ ๋ฌธ์ฅ์ผ๋ก ๋ณต์ํฉ๋๋ค. ์กฐ์ฌ๋ ์ด๋ฏธ๋ ์ ํํ์์ ๋ง์ถฐ ์ ์ ํ ํํ๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.
morphs
: ๊ฒฐํฉํ ํํ์์ ๋ชฉ๋ก์ ๋๋ค. ๊ฐ ํํ์๋Kiwi.tokenizer
์์ ์ป์ด์งToken
ํ์ ์ด๊ฑฐ๋, (ํํ, ํ์ฌ)๋ก ๊ตฌ์ฑ๋tuple
ํ์ ์ด์ด์ผ ํฉ๋๋ค.lm_search
: ๋ ์ด์์ ํํ๋ก ๋ณต์ ๊ฐ๋ฅํ ๋ชจํธํ ํํ์๊ฐ ์๋ ๊ฒฝ์ฐ, ์ด ๊ฐ์ด True๋ฉด ์ธ์ด ๋ชจ๋ธ ํ์์ ํตํด ์ต์ ์ ํํ์๋ฅผ ์ ํํฉ๋๋ค. False์ผ ๊ฒฝ์ฐ ํ์์ ์ค์ํ์ง ์์ง๋ง ๋ ๋น ๋ฅธ ์๋๋ก ๋ณต์์ด ๊ฐ๋ฅํฉ๋๋ค.
์ด ๋ฉ์๋๋ ํํ์๋ฅผ ๊ฒฐํฉํ ๋ space
์์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ์ ์ฌํ ๊ท์น์ ์ฌ์ฉํ์ฌ ๊ณต๋ฐฑ์ ์ ์ ํ ์ฝ์
ํฉ๋๋ค.
ํํ์ ๊ทธ ์์ฒด์๋ ๊ณต๋ฐฑ ๊ด๋ จ ์ ๋ณด๊ฐ ํฌํจ๋์ง ์์ผ๋ฏ๋ก
ํน์ ํ
์คํธ๋ฅผ tokenize
๋ก ๋ถ์ ํ ๋ค์ join
์ผ๋ก ๊ฒฐํฉํ์ฌ๋ ์๋ณธ ํ
์คํธ๊ฐ ๊ทธ๋๋ก ๋ณต์๋์ง๋ ์์ต๋๋ค.
>> kiwi.join([('๋ฅ', 'VA'), ('์ด', 'EC')])
'๋์'
>> tokens = kiwi.tokenize("๋ถ์๋๊ฒฐ๊ณผ๋ฅผ ๋ค์ํฉ์น ์์๋ค!")
# ํํ์ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณต์.
# ๋ณต์ ์ ๊ณต๋ฐฑ์ ๊ท์น์ ์ํด ์ฝ์
๋๋ฏ๋ก ์๋ฌธ ํ
์คํธ๊ฐ ๊ทธ๋๋ก ๋ณต์๋์ง๋ ์์.
>> kiwi.join(tokens)
'๋ถ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ํฉ์น ์ ์๋ค!'
>> tokens[3]
Token(form='๊ฒฐ๊ณผ', tag='NNG', start=4, len=2)
>> tokens[3] = ('๋ด์ฉ', 'NNG') # 4๋ฒ์งธ ํํ์๋ฅผ ๊ฒฐ๊ณผ->๋ด์ฉ์ผ๋ก ๊ต์ฒด
>> kiwi.join(tokens) # ๋ค์ joinํ๋ฉด ๊ฒฐ๊ณผ๋ฅผ->๋ด์ฉ์ ๋ก ๊ต์ฒด๋ ๊ฑธ ํ์ธ ๊ฐ๋ฅ
'๋ถ์๋ ๋ด์ฉ์ ๋ค์ ํฉ์น ์ ์๋ค!'
# ๋ถ๊ท์น ํ์ฉ์ฌ๋ถ๊ฐ ๋ชจํธํ ๊ฒฝ์ฐ lm_search=True์ธ ๊ฒฝ์ฐ ๋งฅ๋ฝ์ ๊ณ ๋ คํด ์ต์ ์ ํ๋ณด๋ฅผ ์ ํํฉ๋๋ค.
>> kiwi.join([('๊ธธ', 'NNG'), ('์', 'JKO'), ('๋ฌป', 'VV'), ('์ด์', 'EF')])
'๊ธธ์ ๋ฌผ์ด์'
>> kiwi.join([('ํ', 'NNG'), ('์ด', 'JKS'), ('๋ฌป', 'VV'), ('์ด์', 'EF')])
'ํ์ด ๋ฌป์ด์'
# lm_search=False์ด๋ฉด ํ์์ ์ค์ํ์ง ์์ต๋๋ค.
>> kiwi.join([('๊ธธ', 'NNG'), ('์', 'JKO'), ('๋ฌป', 'VV'), ('์ด์', 'EF')], lm_search=False)
'๊ธธ์ ๋ฌป์ด์'
>> kiwi.join([('ํ', 'NNG'), ('์ด', 'JKS'), ('๋ฌป', 'VV'), ('์ด์', 'EF')], lm_search=False)
'ํ์ด ๋ฌป์ด์'
# ๋์ฌ/ํ์ฉ์ฌ ํ์ฌ ํ๊ทธ ๋ค์ -R(๊ท์น ํ์ฉ), -I(๋ถ๊ท์น ํ์ฉ)์ ๋ง๋ถ์ฌ ํ์ฉ๋ฒ์ ์ง์ ๋ช
์ํ ์ ์์ต๋๋ค.
>> kiwi.join([('๋ฌป', 'VV-R'), ('์ด์', 'EF')])
'๋ฌป์ด์'
>> kiwi.join([('๋ฌป', 'VV-I'), ('์ด์', 'EF')])
'๋ฌผ์ด์'
# 0.15.2๋ฒ์ ๋ถํฐ๋ Tuple์ ์ธ๋ฒ์งธ ์์๋ก ๋์ด์ฐ๊ธฐ ์ ๋ฌด๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
# True์ผ ๊ฒฝ์ฐ ๊ฐ์ ๋ก ๋์ด์ฐ๊ธฐ, False์ผ ๊ฒฝ์ฐ ๊ฐ์ ๋ก ๋ถ์ฌ์ฐ๊ธฐ๋ฅผ ์ํํฉ๋๋ค.
>> kiwi.join([('๊ธธ', 'NNG'), ('์', 'JKO', True), ('๋ฌป', 'VV'), ('์ด์', 'EF')])
'๊ธธ ์ ๋ฌผ์ด์'
>> kiwi.join([('๊ธธ', 'NNG'), ('์', 'JKO'), ('๋ฌป', 'VV', False), ('์ด์', 'EF')])
'๊ธธ์๋ฌผ์ด์'
# ๊ณผ๊ฑฐํ ์ ์ด๋ง์ด๋ฏธ๋ฅผ ์ ๊ฑฐํ๋ ์์
>> remove_past = lambda s: kiwi.join(t for t in kiwi.tokenize(s) if t.tagged_form != '์/EP')
>> remove_past('๋จน์๋ค')
'๋จน๋ค'
>> remove_past('๋จผ ๊ธธ์ ๊ฑธ์๋ค')
'๋จผ ๊ธธ์ ๊ฑท๋ค'
>> remove_past('์ ํ๋ฅผ ๊ฑธ์๋ค.')
'์ ํ๋ฅผ ๊ฑธ๋ค.'
template(format_str, cache=True)
ํํ์๋ค์ ๊ฒฐํฉํ์ฌ ๋ฌธ์ฅ์ผ๋ก ๋ณต์ํฉ๋๋ค. ์กฐ์ฌ๋ ์ด๋ฏธ๋ ์ ํํ์์ ๋ง์ถฐ ์ ์ ํ ํํ๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.
format_str
: ํ ํ๋ฆฟ ๋ฌธ์์ด์ ๋๋ค. Python์str.format
(https://docs.python.org/ko/3/library/string.html#formatstrings )๊ณผ ๋์ผํ ๋ฌธ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.cache
: ํ ํ๋ฆฟ์ ์บ์ ์ฌ๋ถ์ ๋๋ค.
์ด ๋ฉ์๋๋ ๋ค์๊ณผ ๊ฐ์ด Kiwi.join
์ ํํ์ ๊ฒฐํฉ ๊ธฐ๋ฅ์ ๋์ฑ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ค๋๋ค.
# ๋น์นธ์ {}๋ก ํ์ํฉ๋๋ค.
# ์ด ์๋ฆฌ์ ํํ์ ํน์ ๊ธฐํ Python ๊ฐ์ฒด๊ฐ ๋ค์ด๊ฐ์ ๋ฌธ์์ด์ ์์ฑ์ํค๊ฒ ๋ฉ๋๋ค.
>>> tpl = kiwi.template("{}๊ฐ {}์ {}์๋ค.")
# template ๊ฐ์ฒด๋ format ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
# ์ด ๋ฉ์๋๋ฅผ ํตํด ๋น ์นธ์ ์ฑ์ธ ์ ์์ต๋๋ค.
# ํํ์๋ `kiwipiepy.Token` ํ์
์ด๊ฑฐ๋
# (ํํ, ํ์ฌ) ํน์ (ํํ, ํ์ฌ, ์ผ์ชฝ ๋์ด์ฐ๊ธฐ ์ ๋ฌด)๋ก ๊ตฌ์ฑ๋ tuple ํ์
์ด์ด์ผ ํฉ๋๋ค.
>>> tpl.format(("๋", "NP"), ("๊ณต๋ถ", "NNG"), ("ํ", "VV"))
'๋ด๊ฐ ๊ณต๋ถ๋ฅผ ํ๋ค.'
>>> tpl.format(("๋", "NP"), ("๋ฐฅ", "NNG"), ("๋จน", "VV"))
'๋ค๊ฐ ๋ฐฅ์ ๋จน์๋ค.'
>>> tpl.format(("์ฐ๋ฆฌ", "NP"), ("๊ธธ", "NNG"), ("๋ฌป", "VV-I"))
'์ฐ๋ฆฌ๊ฐ ๊ธธ์ ๋ฌผ์๋ค.'
# ํํ์๊ฐ ์๋ Python ๊ฐ์ฒด๊ฐ ์
๋ ฅ๋๋ ๊ฒฝ์ฐ `str.format`๊ณผ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค.
>>> tpl.format(5, "str", {"dict":"dict"})
"5๊ฐ str๋ฅผ {'dict': 'dict'}์๋ค."
# ์
๋ ฅํ ๊ฐ์ฒด๊ฐ ํํ์๊ฐ ์๋ Python ๊ฐ์ฒด๋ก ์ฒ๋ฆฌ๋๊ธธ ์ํ๋ ๊ฒฝ์ฐ !s ๋ณํ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
>>> tpl = kiwi.template("{!s}๊ฐ {}์ {}์๋ค.")
>>> tpl.format(("๋", "NP"), ("๊ณต๋ถ", "NNG"), ("ํ", "VV"))
"('๋', 'NP')๊ฐ ๊ณต๋ถ๋ฅผ ํ๋ค."
# Python ๊ฐ์ฒด์ ๋ํด์๋ `str.format`๊ณผ ๋์ผํ ์์ ์ง์ ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
>>> tpl = kiwi.template("{:.5f}๊ฐ {!r}์ {}์๋ค.")
>>> tpl.format(5, "str", {"dict":"dict"})
"5.00000๊ฐ 'str'๋ฅผ {'dict': 'dict'}์๋ค."
# ์์ ์ง์ ์๊ฐ ์ฃผ์ด์ง ์นธ์ ํํ์๋ฅผ ๋์
ํ ๊ฒฝ์ฐ ValueError๊ฐ ๋ฐ์ํฉ๋๋ค.
>>> tpl.format(("์ฐ๋ฆฌ", "NP"), "str", ("๋ฌป", "VV-I"))
ValueError: cannot specify format specifier for Kiwi Token
# ์นํ ํ๋์ index๋ name์ ์ง์ ํ์ฌ ๋์
์์๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
>>> tpl = kiwi.template("{0}๊ฐ {obj}๋ฅผ {verb}\ใด๋ค. {1}๋ {obj}๋ฅผ ์ {verb}์๋ค.")
>>> tpl.format(
[("์ฐ๋ฆฌ", "NP"), ("๋ค", "XSN")],
[("๋ํฌ", "NP"), ("๋ค", "XSN")],
obj=("๊ธธ", "NNG"),
verb=("๋ฌป", "VV-I")
)
'์ฐ๋ฆฌ๋ค์ด ๊ธธ์ ๋ฌป๋๋ค. ๋ํฌ๋ค์ ๊ธธ์ ์ ๋ฌผ์๋ค.'
# ์์ ์์์ฒ๋ผ ์ข
์ฑ ์์์ ํธํ์ฉ ์๋ชจ ์ฝ๋ ์์ \\๋ก ์ด์ค์ผ์ดํ๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.
# ๊ทธ๋ ์ง ์์ผ๋ฉด ์ข
์ฑ์ด ์๋ ์ด์ฑ์ผ๋ก ์ธ์๋ฉ๋๋ค.
>>> tpl = kiwi.template("{0}๊ฐ {obj}๋ฅผ {verb}ใด๋ค. {1}๋ {obj}๋ฅผ ์ {verb}์๋ค.")
>>> tpl.format(
[("์ฐ๋ฆฌ", "NP"), ("๋ค", "XSN")],
[("๋ํฌ", "NP"), ("๋ค", "XSN")],
obj=("๊ธธ", "NNG"),
verb=("๋ฌป", "VV-I")
)
'์ฐ๋ฆฌ๋ค์ด ๊ธธ์ ๋ฌป แ์ด๋ค. ๋ํฌ๋ค์ ๊ธธ์ ์ ๋ฌผ์๋ค.'
์ธ์ข ํ์ฌ ํ๊ทธ๋ฅผ ๊ธฐ์ด๋ก ํ๋, ์ผ๋ถ ํ์ฌ ํ๊ทธ๋ฅผ ์ถ๊ฐ/์์ ํ์ฌ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋๋ถ๋ฅ | ํ๊ทธ | ์ค๋ช |
---|---|---|
์ฒด์ธ(N) | NNG | ์ผ๋ฐ ๋ช ์ฌ |
NNP | ๊ณ ์ ๋ช ์ฌ | |
NNB | ์์กด ๋ช ์ฌ | |
NR | ์์ฌ | |
NP | ๋๋ช ์ฌ | |
์ฉ์ธ(V) | VV | ๋์ฌ |
VA | ํ์ฉ์ฌ | |
VX | ๋ณด์กฐ ์ฉ์ธ | |
VCP | ๊ธ์ ์ง์์ฌ(์ด๋ค) | |
VCN | ๋ถ์ ์ง์์ฌ(์๋๋ค) | |
๊ดํ์ฌ | MM | ๊ดํ์ฌ |
๋ถ์ฌ(MA) | MAG | ์ผ๋ฐ ๋ถ์ฌ |
MAJ | ์ ์ ๋ถ์ฌ | |
๊ฐํ์ฌ | IC | ๊ฐํ์ฌ |
์กฐ์ฌ(J) | JKS | ์ฃผ๊ฒฉ ์กฐ์ฌ |
JKC | ๋ณด๊ฒฉ ์กฐ์ฌ | |
JKG | ๊ดํ๊ฒฉ ์กฐ์ฌ | |
JKO | ๋ชฉ์ ๊ฒฉ ์กฐ์ฌ | |
JKB | ๋ถ์ฌ๊ฒฉ ์กฐ์ฌ | |
JKV | ํธ๊ฒฉ ์กฐ์ฌ | |
JKQ | ์ธ์ฉ๊ฒฉ ์กฐ์ฌ | |
JX | ๋ณด์กฐ์ฌ | |
JC | ์ ์ ์กฐ์ฌ | |
์ด๋ฏธ(E) | EP | ์ ์ด๋ง ์ด๋ฏธ |
EF | ์ข ๊ฒฐ ์ด๋ฏธ | |
EC | ์ฐ๊ฒฐ ์ด๋ฏธ | |
ETN | ๋ช ์ฌํ ์ ์ฑ ์ด๋ฏธ | |
ETM | ๊ดํํ ์ ์ฑ ์ด๋ฏธ | |
์ ๋์ฌ | XPN | ์ฒด์ธ ์ ๋์ฌ |
์ ๋ฏธ์ฌ(XS) | XSN | ๋ช ์ฌ ํ์ ์ ๋ฏธ์ฌ |
XSV | ๋์ฌ ํ์ ์ ๋ฏธ์ฌ | |
XSA | ํ์ฉ์ฌ ํ์ ์ ๋ฏธ์ฌ | |
XSM | ๋ถ์ฌ ํ์ ์ ๋ฏธ์ฌ* | |
์ด๊ทผ | XR | ์ด๊ทผ |
๋ถํธ, ์ธ๊ตญ์ด, ํน์๋ฌธ์(S) | SF | ์ข ๊ฒฐ ๋ถํธ(. ! ?) |
SP | ๊ตฌ๋ถ ๋ถํธ(, / : ;) | |
SS | ์ธ์ฉ ๋ถํธ ๋ฐ ๊ดํธ(' " ( ) [ ] < > { } โ โ โ โ โ โช โซ ๋ฑ) | |
SSO | SS ์ค ์ฌ๋ ๋ถํธ* | |
SSC | SS ์ค ๋ซ๋ ๋ถํธ* | |
SE | ์ค์ํ(โฆ) | |
SO | ๋ถ์ํ(- ~) | |
SW | ๊ธฐํ ํน์ ๋ฌธ์ | |
SL | ์ํ๋ฒณ(A-Z a-z) | |
SH | ํ์ | |
SN | ์ซ์(0-9) | |
SB | ์์ ์๋ ๊ธ๋จธ๋ฆฌ(๊ฐ. ๋. 1. 2. ๊ฐ) ๋) ๋ฑ)* | |
๋ถ์ ๋ถ๋ฅ | UN | ๋ถ์ ๋ถ๋ฅ* |
์น(W) | W_URL | URL ์ฃผ์* |
W_EMAIL | ์ด๋ฉ์ผ ์ฃผ์* | |
W_HASHTAG | ํด์ํ๊ทธ(#abcd)* | |
W_MENTION | ๋ฉ์ (@abcd)* | |
W_SERIAL | ์ผ๋ จ๋ฒํธ(์ ํ๋ฒํธ, ํต์ฅ๋ฒํธ, IP์ฃผ์ ๋ฑ)* | |
W_EMOJI | ์ด๋ชจ์ง* | |
๊ธฐํ | Z_CODA | ๋ง๋ถ์ ๋ฐ์นจ* |
Z_SIOT | ์ฌ์ด์์ท* | |
USER0~4 | ์ฌ์ฉ์ ์ ์ ํ๊ทธ* |
* ์ธ์ข ํ์ฌ ํ๊ทธ์ ๋ค๋ฅธ ๋ ์์ ์ธ ํ๊ทธ์ ๋๋ค.
0.12.0 ๋ฒ์ ๋ถํฐ VV
, VA
, VX
, XSA
ํ๊ทธ์ ๋ถ๊ท์น ํ์ฉ์ฌ๋ถ๋ฅผ ๋ช
์ํ๋ ์ ๋ฏธ์ฌ -R
์ -I
์ด ๋ง๋ถ์ ์ ์์ต๋๋ค.
-R
์ ๊ท์น ํ์ฉ,-I
์ ๋ถ๊ท์น ํ์ฉ์ ๋ํ๋
๋๋ค.
0.10.3 ๋ฒ์ ๋ถํฐ ๋ฌธ์ฅ ๋ถ๋ฆฌ ๊ธฐ๋ฅ์ ์คํ์ ์ผ๋ก ์ง์ํฉ๋๋ค. 0.11.0 ๋ฒ์ ๋ถํฐ๋ ์ ํ๋๊ฐ ์ ๋ฒ ํฅ์๋์์ต๋๋ค. ๋ฌธ์ฅ ๋ถ๋ฆฌ ๊ธฐ๋ฅ์ ์ฑ๋ฅ์ ๋ํด์๋ ์ด ํ์ด์ง๋ฅผ ์ฐธ์กฐํด์ฃผ์ธ์.
ํ ๋จ์ด๊ฐ ์ฌ๋ฌ ๊ฐ์ง๋ก ํํ์ ๋ถ์์ด ๊ฐ๋ฅํ์ฌ ๋งฅ๋ฝ์ ๋ณด๋ ๊ฒ ํ์์ ์ธ ์ํฉ์์ Kiwi๊ฐ ๋์ ์ ํ๋๋ฅผ ๋ณด์ด๋ ๊ฒ์ด ํ์ธ๋์์ต๋๋ค. ๋ชจํธ์ฑ ํด์ ์ฑ๋ฅ์ ๋ํด์๋ ์ด ํ์ด์ง๋ฅผ ์ฐธ์กฐํด์ฃผ์ธ์.
์ธ์ฉ ๋ฐฉ๋ฒ์ ๋ํด์๋ Kiwi#์ธ์ฉํ๊ธฐ๋ฅผ ์ฐธ์กฐํด์ฃผ์ธ์.