https://github.com/bab2min/kiwipiepy
Python3 API文檔:https://bab2min.github.io/kiwipiepy
從獼猴桃0.5開始,我們為Python3提供API。您可以構建此項目並在Python中導入模塊,或使用PIP安裝已經建立的Kiwipiepy模塊。
$ pip install --upgrade pip
$ pip install kiwipiepy或者
$ pip3 install --upgrade pip
$ pip3 install kiwipiepy當前,Kiwipiepy軟件包支持Windows OS和Linux,MacOS 10.12或更高版本具有Vista版本。
在未提供二進制分佈(例如MACOS M1 )的環境中,安裝時CMake3.12或更高版本需要進行源代碼編譯。
$ pip install cmake
$ pip install --upgrade pip
$ pip install kiwipiepy 從奇異果的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。
奇異果中使用的-Art標籤的部分基於Sejong Malmachi的各個部分,並且有些標籤得到了改進和使用。有關詳細的標籤系統,請參見此處。
> >> 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軟件包安裝,則在創建軟件包並生成獼猴桃對象時不會發生錯誤。
from kiwipiepy import Kiwi , Match
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個或更多,則可以使用Multicore來分析單詞提取物和正式站,因此您可以以更快的速度進行分析。model_path :指定具有正式分析模型的路徑。省略後,模型路徑將從kiwipiepy_model軟件包加載。load_default_dict :加載其他字典。額外的詞典由Wikipedia的標題組成。在這種情況下,加載和分析時間略有增加,但是您可以更好地捕獲各種專有名詞。為了防止分析結果被捕獲,請將其置於錯誤。integrate_allomorph :在母親中,它會自動集成相同的形式,但語音環境(例如“ ah/eo”,''//'。model_type :指定用於形態分析的語言模型。您可以選擇'knlm'或'sbg'之一。 'sbg'相對較慢,但可以捕獲詞素之間的關係。typos :分析形態時更正簡單的錯字。設置為None 。typo_cost_threshold :設置最大錯字以允許錯別字。獼猴桃對象可以執行三種類型的任務。
這是一項新功能,因為獼猴桃0.5。了解經常出現字符串的模式,並提取應該是單詞的字符串。此功能的基本思想基於https://github.com/lovit/soynlp的單詞提取技術,該技術結合了基於字符串的名詞概率,並提取了預期是名詞的單詞。
獼猴桃提供了兩種未註冊的詞彙提取方法:
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的正式分析。該值必須是一個可觸覺的,該值由(形式,零件)或元組形狀的元組組成(形式,零件,起點,端點)。該值指定的詞素必須存在於當前字典中,否則它們會產生ValueError的例外。score :要添加形狀的形式的重量分數。如果形態學的幾種組合符合形式,那麼高的單詞將更高。如果插入成功,則如果已經存在相同的形式並且失敗, False返回True 。
此方法很容易在分析儀中添加不規則的分析結果。例如,動詞的사귀다兄弟是사귀었다 ,但是它們사겼다是錯誤的。您可以使用此方法來確保您正在사겼다 사귀/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 )在後一種情況下,通過準確指定每個分析結果的位置,相應詞素的start , end和length在獼猴桃分析結果中是準確的。
add_rule(tag, replacer, score)添加規則修改的修改。
tag :要添加的演講的部分replacer :改變形態的規則。必須以可呼叫的形式提供此值,並且必須通過接收原始形式污點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 )當大量註冊這兩種形式時,我們建議將分數設置為-3或更少,以使得在分析結果中沒有比原始形式更高的優先級。
load_user_dictionary(user_dict_path)從文件中讀取用戶字典。用戶字典文件應使用UTF-8編碼,應以如下的形式配置。每個字段應由Tab字符( t)隔開,並且可以省略單詞分數。
#으로 시작하는 줄은 주석 처리됩니다.
# 각 필드는 Tab(t)문자로 구분됩니다.
#
# <단일 형태소를 추가하는 경우>
# (형태) t (품사태그) t (점수)
# * (점수)는 생략시 0으로 처리됩니다.
키위 NNP -5.0
#
# <이미 존재하는 형태소의 이형태를 추가하는 경우>
# (이형태) t (원형태소/품사태그) t (점수)
# * (점수)는 생략시 0으로 처리됩니다.
기위 키위/NNG -3.0
#
# <기분석 형태를 추가하는 경우>
# (형태) t (원형태소/품사태그 + 원형태소/품사태그 + ...) t (점수)
# * (점수)는 생략시 0으로 처리됩니다.
사겼다 사귀/VV + 었/EP + 다/EF -1.0
成功讀取前文件,通過詞典返回新添加的電台的數量。
有關實際示例,請參閱獼猴桃內置的默認前文件。
如果您創建奇異果並將單詞添加到用戶詞典中,則可以使用以下方法執行正式分析,句子分離,間隔校正和句子修復等任務。
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 )
]如果文本是字符串的可觸覺,則並聯幾個輸入。此時的返回值是輸入單個文本時返回值的可觸覺。根據num_workers,在多個線程中同時處理工作,這是生成kiwi()時的參數。返回值與輸入值的順序相同。
>> 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 >
StopIterationFO循環使您可以更簡單,更方便地執行並行性。在分析大量文本數據時,這很有用。
>> for result in kiwi . analyze ( long_list_of_text ):
tokens , score = result [ 0 ]
print ( tokens )如果您將文本作為字符串上的文字作為文明,那麼在分析的呼籲之後,可以閱讀此峰值的時間。因此,如果此參數與其他IO資源(文件I / O)鏈接,則在所有分析結束之前,您不應終止資源。
>> 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 setsplit_into_sents( text, match_options=Match.ALL, normalize_coda=False, z_coda=True, split_complex=False, compatible_jamo=False, saisiot=None, return_tokens=False ) >> 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)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的峰值,則由多重處理。reset_whitespace true,則也可以積極執行。默認值是錯誤的,在這種情況下,它專注於使用所附單詞的更正。該方法的間距校正函數基於形態分析。因此,如果縫隙插入形態的中間,則校正結果可能不准確。在這種情況下,您可以調整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 :如果有一種模棱兩可的恥辱類型可以以兩種或多種形式恢復,請通過語言模型搜索選擇最佳形態,如果此值為真。如果您是錯誤的,則不會搜索搜索,但是可以更快地將其還原。該方法使用的規則與組合表單時在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/ko/3/library/string.html#formtrings)相同的語法。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" )
)
'우리들이 길을 묻 ᄂ이다. 너희들은 길을 안 물었다.' 根據Sejong Partsa標籤,它用於添加和修改某些部分標籤。
| 類別 | 標籤 | 解釋 |
|---|---|---|
| 步驟(n) | nng | 通用名詞 |
| NNP | 名詞 | |
| NNB | 依賴性 | |
| nr | 調查 | |
| NP | 代詞 | |
| (v)節 | VV | 動詞 |
| VA | 形容詞 | |
| VX | 輔助的 | |
| VCP | 積極指導(IDA) | |
| VCN | 負說明(否) | |
| 管狀 | 毫米 | 管狀 |
| 副詞(MA) | 雜誌 | 一般副詞 |
| 少校 | 聯繫 | |
| 欹 | 我知道了 | 欹 |
| 調查(J) | JKS | 主要調查 |
| JKC | 投降 | |
| JKG | 管狀研究 | |
| JKO | 客觀調查 | |
| JKB | 內部人權 | |
| JKV | 集線器調查 | |
| JKQ | 引用 | |
| JX | 助手 | |
| JC | 聯繫 | |
| 母親(E) | EP | 清酒 |
| EF | 結尾 | |
| EC | 連接母親 | |
| etn | 名詞 | |
| etm | 管狀 | |
| 前綴 | XPN | 回火前綴 |
| Tracky(XS) | XSN | 名詞衍生後綴 |
| XSV | 動詞衍生後綴 | |
| XSA | 形容詞衍生物後綴 | |
| XSM | 副詞衍生後綴* | |
| radix | xr | radix |
| 代碼,外語,特殊字符 | SF | 終止代碼(。!?) |
| sp | 分類代碼(, /:;) | |
| SS | 引用代碼和括號('()] <> {} - '''''≫等) | |
| SSO | SS *打開的代碼 | |
| SSC | 接近SS *的代碼* | |
| se | 還原表(…) | |
| 所以 | 附件(-〜) | |
| SW | 其他特殊字符 | |
| SL | 字母(AZ AZ) | |
| sh | 漢字 | |
| sn | 數字(0-9) | |
| SB | 訂購的頭( A。Me。 | |
| 無法分析 | 聯合國 | 無法分析* |
| Web(W) | w_url | URL地址* |
| w_email | 電子郵件地址* | |
| w_hashtag | 標籤(#ABCD) * | |
| w_mention | 提及(@ABCD) * | |
| w_serial | 序列號(電話號碼,帳號,IP地址等) * * | |
| w_emoji | 表情符號* | |
| ETC | z_coda | 添加了支持* |
| z_siot | Sai Shi衣服* | |
| 用戶0〜4 | 自定義標籤* |
*這是一個帶有Sejong Partsa標籤的唯一標籤。
從0.12.0版本中,可以將後綴-R和-I添加到VV , VA , VX和XSA標籤中。 -R表示規則的使用, -I表示不規則使用。
從0.10.3版本中,我們通過實驗支持句子分離功能。從0.11.0版本中,精度得到了顯著提高。請參閱此頁面以獲取句子分離功能的性能。
一個詞可以通過多種方式進行分析,因此,在看到上下文至關重要的情況下,獼猴桃具有很高的精度。請參閱此頁面以減輕歧義性能。
請參閱獼猴桃#引用的引用。