https://github.com/bab2min/kiwipiepy
Python3 API เอกสาร: https://bab2min.github.io/kiwipiepy
เริ่มต้นด้วย Kiwi 0.5 เราเสนอ API สำหรับ Python3 คุณสามารถสร้างโครงการนี้และนำเข้าโมดูลใน Python หรือติดตั้งโมดูล KiwipiePy ที่สร้างไว้แล้วโดยใช้ PIP
$ 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 จาก 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
ส่วนที่ -แท็ก -the -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_modelload_default_dict : โหลดพจนานุกรมเพิ่มเติม พจนานุกรมเพิ่มเติมประกอบด้วยชื่อชื่อของ Wikipedia ในกรณีนี้เวลาในการโหลดและการวิเคราะห์เพิ่มขึ้นเล็กน้อย แต่คุณสามารถจับคำนามที่เหมาะสมได้ดีขึ้น เพื่อป้องกันไม่ให้ผลการวิเคราะห์ถูกจับให้ตั้งค่าเป็นเท็จintegrate_allomorph : ในแม่มันรวมรูปแบบที่เหมือนกัน แต่สภาพแวดล้อมทางเสียงเช่น 'AH/EO', '//' โดยอัตโนมัติmodel_type : ระบุแบบจำลองภาษาที่จะใช้สำหรับการวิเคราะห์ทางสัณฐานวิทยา คุณสามารถเลือกหนึ่งใน 'knlm' หรือ 'sbg' 'sbg' ค่อนข้างช้า แต่สามารถจับความสัมพันธ์ระหว่าง morphemestypos : แก้ไขการพิมพ์ผิดง่าย ๆ เมื่อวิเคราะห์สัณฐานวิทยา อย่าทำการแก้ไขเมื่อตั้งค่าเป็น Nonetypo_cost_threshold : ตั้งค่าการพิมพ์ผิดสูงสุดเพื่ออนุญาตการพิมพ์ผิดวัตถุกีวีสามารถทำงานได้สามประเภท
นี่เป็นคุณสมบัติใหม่ตั้งแต่กีวี 0.5 รู้รูปแบบของสตริงที่ปรากฏบ่อยครั้งและแยกสตริงที่ควรจะเป็นคำ แนวคิดพื้นฐานของคุณลักษณะนี้ขึ้นอยู่กับเทคนิคการแยกคำของ https://github.com/lovit/soynlp ซึ่งรวมความน่าจะเป็นของคำนามตามสตริงและแยกคำที่คาดว่าจะเป็นคำนาม
มีวิธีการสกัดคำศัพท์ที่ไม่ได้ลงทะเบียนสองประเภทโดย 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.25pos_score : นี่คือคะแนนคำนามขั้นต่ำของคำที่จะสกัด ค่าที่ต่ำกว่านั้นมีโอกาสมากขึ้นที่จะสกัดคำที่ไม่ใช่คำนาม ค่าเริ่มต้นคือ -3lm_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 : นี่เป็นส่วนหนึ่งของรูปแบบของรูปแบบของการลงทะเบียน ค่าเริ่มต้นคือ NNPscore : นี่คือคะแนนของแบบฟอร์มที่จะลงทะเบียน หากรูปแบบเดียวกันมีแนวโน้มที่จะวิเคราะห์ในหลายกรณียิ่งค่านี้มีขนาดใหญ่ขึ้นเท่าใดก็ยิ่งลำดับความสำคัญของรูปแบบที่สอดคล้องกันมากขึ้นorig_word : หากมีการเพิ่มแบบฟอร์มเพิ่มเติมเป็นตัวแปรของรูปแบบที่แน่นอนคุณสามารถส่ง Morphemes ดั้งเดิมด้วยปัจจัยนี้ หากไม่มีก็สามารถละเว้นได้ หากได้รับค่านี้จะต้องมีรูปแบบของการรวมกันของ orig_word / tag ในพจนานุกรมปัจจุบันมิฉะนั้นจะสร้างข้อยกเว้นให้กับ ValueError หาก morphemes ดั้งเดิมมีอยู่สามารถระบุ orig_word เพื่อสร้างผลการวิเคราะห์ที่แม่นยำยิ่งขึ้น หากการแทรกอย่างเป็นทางการประสบความสำเร็จ True จะถูกส่งคืนและหากสัณฐานวิทยาเดียวกันนั้นมีอยู่แล้วและล้มเหลวก็จะกลับมา False
add_pre_analyzed_word(form, analyzed, score=0.0)ลงทะเบียนรูปแบบของอารมณ์ในพจนานุกรมผู้ใช้ สิ่งนี้ช่วยให้รูปแบบบางอย่างสามารถชักนำให้ผู้ใช้วิเคราะห์การวิเคราะห์ทางสัณฐานวิทยาในรูปแบบที่ต้องการ
form : มันเป็นรูปแบบของอารมณ์analyzed : การวิเคราะห์อย่างเป็นทางการของ form ค่านี้จะต้องทำซ้ำได้ซึ่งประกอบด้วย tuple ในรูปของ (รูปแบบ, ชิ้นส่วน) หรือรูปทรง tuple (รูปแบบ, ชิ้นส่วน, จุดเริ่มต้น, จุดสิ้นสุด) morphemes ที่ระบุโดยค่านี้จะต้องมีอยู่ในพจนานุกรมปัจจุบันมิฉะนั้นพวกเขาจะสร้างข้อยกเว้นให้กับ ValueErrorscore : คะแนนน้ำหนักของรูปแบบของรูปร่างที่จะเพิ่ม หากมีสัณฐานวิทยาหลายอย่างที่ตรงกับรูปแบบคำที่จะสูงกว่า หากการแทรกสำเร็จ 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 ) ในกรณีหลังโดยการระบุตำแหน่งของผลการวิเคราะห์แต่ละรายการ start end และ length ของ morphemes ที่สอดคล้องกันนั้นแม่นยำในผลการวิเคราะห์กีวี
add_rule(tag, replacer, score)เพิ่มการแก้ไขที่แก้ไขโดยกฎ
tag : ส่วนของสุนทรพจน์ที่จะเพิ่มreplacer : กฎในการแปลงสัณฐานวิทยา ค่านี้จะต้องระบุไว้ในรูปแบบของ callable callable และจะต้องส่งคืนโดยรับแบบฟอร์ม stain stain และส่งคืนแถบของแบบฟอร์มที่แก้ไข หากคุณส่งคืนค่าเดียวกับอินพุตผลลัพธ์การเสียรูปจะถูกละเว้นscore : คะแนนน้ำหนักของ morphemes ดัดแปลงที่จะเพิ่ม หากมีสัณฐานวิทยาหลายอย่างที่ตรงกับรูปแบบคำที่จะสูงกว่า ส่งคืน list ของแบบฟอร์มที่สร้างขึ้นใหม่โดย replacer
add_re_rule(tag, pattern, repl, score) มันมีบทบาทเดียวกันกับวิธี add_rule แต่ใช้นิพจน์ปกติในกฎการเสียรูป
tag : ส่วนของสุนทรพจน์ที่จะเพิ่มpattern : กฎของแม่พิมพ์ที่จะแปลง ค่านี้จะต้องเป็นนิพจน์ทั่วไปที่สามารถรวบรวมได้ด้วย re.compilerepl : รูปแบบที่พบโดย pattern จะถูกแทนที่ด้วยค่านี้ Python3 นี่เหมือนกับปัจจัย repl ของฟังก์ชั่น re.sub ในโมดูลนิพจน์ทั่วไปscore : คะแนนน้ำหนักของ morphemes ดัดแปลงที่จะเพิ่ม หากมีสัณฐานวิทยาหลายอย่างที่ตรงกับรูปแบบคำที่จะสูงกว่า ส่งคืน list ของแบบฟอร์มที่สร้างขึ้นใหม่โดย pattern และ repl
วิธีนี้ง่ายมากที่จะเพิ่ม bullators ที่ถูกแปลงตามกฎ ตัวอย่างเช่น -요 สามารถลงทะเบียน terminators ( 먹어염 , 뛰었구염 , 배불러염 ฯลฯ ) แทนที่ด้วย -염
kiwi . add_re_rule ( 'EF' , r'요$' , r'염' , - 3.0 ) เมื่อลงทะเบียนทั้งสองรูปแบบในปริมาณมากเราขอแนะนำว่าคะแนนถูกตั้งค่าเป็นค่า -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 . 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 >
StopIterationFor Loop ช่วยให้คุณสามารถทำสิ่งคู่ขนานได้ง่ายขึ้นและสะดวกยิ่งขึ้น สิ่งนี้มีประโยชน์เมื่อวิเคราะห์ข้อมูลข้อความจำนวนมาก
>> for result in kiwi . analyze ( long_list_of_text ):
tokens , score = result [ 0 ]
print ( tokens )หากคุณให้ข้อความเป็น iterable บนสตริงเวลาในการอ่านสิ่งนี้สามารถทำซ้ำได้อาจเป็นหลังจากการเรียกของการวิเคราะห์ ดังนั้นหากอาร์กิวเมนต์นี้เชื่อมโยงกับทรัพยากร 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 : จริง, ส่งคืนการแทรกวงโคจรของแต่ละชิ้นไปยัง List[bool] >> kiwi . glue ([
"그러나 알고보니 그 봉" ,
"지 안에 있던 것은 바로" ,
"레몬이었던 것이다." ])
"그러나 알고보니 그 봉지 안에 있던 것은 바로 레몬이었던 것이다."
>> kiwi . glue ([
"그러나 알고보니 그 봉" ,
"지 안에 있던 것은 바로" ,
"레몬이었던 것이다." ], return_space_insertions = True )
( "그러나 알고보니 그 봉지 안에 있던 것은 바로 레몬이었던 것이다." , [ False , True ])space(text, reset_whitespace=False)text : สตริงที่จะวิเคราะห์ หากอาร์กิวเมนต์นี้มอบให้กับ STR เดียวมันจะถูกประมวลผลในเธรดเดียวและได้รับการจัดการโดย Multisred หากมีการให้ซ้ำของ STRreset_whitespace จริงมันก็จะดำเนินการอย่างแข็งขัน ค่าเริ่มต้นเป็นเท็จและในกรณีนี้จะเน้นไปที่การแก้ไขที่ใช้คำที่แนบมา ฟังก์ชั่นการแก้ไขระยะห่างของวิธีนี้ขึ้นอยู่กับการวิเคราะห์ทางสัณฐานวิทยา ดังนั้นหากมีการแทรกช่องว่างตรงกลางของสัณฐานวิทยาผลลัพธ์ที่ได้อาจไม่ถูกต้อง ในกรณีนี้คุณสามารถปรับ 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 : รายการ morphemes ที่จะรวมกัน สัณฐานวิทยาแต่ละชนิดควรเป็น Token ประเภทที่ได้จาก Kiwi.tokenizer หรือประเภท 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 : สตริงเทมเพลต การใช้ไวยากรณ์เดียวกันกับ str.format ของ Python (https://docs.python.org/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 | กริยา |
| เวอร์จิเนีย | คุณศัพท์ | |
| VX | เสริม | |
| VCP | คำสั่งเชิงบวก (IDA) | |
| VCN | คำแนะนำเชิงลบ (ไม่) | |
| เป็นท่อ | มม. | เป็นท่อ |
| Adverb (MA) | อวกาศ | คำวิเศษณ์ทั่วไป |
| พล. ต. | การเชื่อมต่อ | |
| คำอุทาน | ไอซี | คำอุทาน |
| การสำรวจ (J) | JKS | การสอบสวนหลัก |
| JKC | ยอมแพ้ | |
| jkg | การตรวจสอบท่อ | |
| jko | การตรวจสอบวัตถุประสงค์ | |
| jkb | การไม่เชื่อฟัง | |
| JKV | การสำรวจฮับ | |
| JKQ | อ้าง | |
| JX | ผู้ช่วย | |
| JC | การเชื่อมต่อ | |
| แม่ (E) | EP | สาเก |
| EF | จบ | |
| EC | แม่เชื่อมต่อ | |
| ETN | คำนาม | |
| ETM | เป็นท่อ | |
| คำนำหน้า | XPN | คำนำหน้า |
| tracky (xs) | XSN | คำต่อท้ายอนุพันธ์คำนาม |
| XSV | คำต่อท้ายคำกริยา | |
| XSA | คำต่อท้ายคำคุณศัพท์ | |
| XSM | คำต่อท้ายอนุพันธ์ของคำวิเศษณ์ * | |
| รัศมี | XR | รัศมี |
| รหัสภาษาต่างประเทศอักขระพิเศษ | SF | รหัสการเลิกจ้าง (.!?) |
| SP | รหัสการจำแนกประเภท (, /:;) | |
| เอสเอส | รหัสคำพูดและวงเล็บ ('()] <> {} -' '' '' '≫ etc. ฯลฯ ) | |
| SSO | รหัสที่เปิดใน SS * | |
| SSC | รหัสใกล้กับ SS * | |
| SE | ตารางลด (…) | |
| ดังนั้น | ตารางที่แนบมา (- ~) | |
| SW | อักขระพิเศษอื่น ๆ | |
| SL | ตัวอักษร (AZ AZ) | |
| SH | ตัวละครจีน | |
| SN | หมายเลข (0-9) | |
| SB | หัวสั่ง (ก. ฉัน | |
| ไม่สามารถวิเคราะห์ได้ | สหประชาชาติ | ไม่สามารถวิเคราะห์ได้ * |
| เว็บ (W) | w_url | ที่อยู่ URL * |
| w_email | ที่อยู่อีเมล * | |
| w_hashtag | hashtag (#abcd) * | |
| w_mention | พูดถึง (@ABCD) * | |
| w_serial | หมายเลขซีเรียล (หมายเลขโทรศัพท์หมายเลขบัญชีที่อยู่ IP ฯลฯ ) * * | |
| w_emoji | อิโมจิ * | |
| ฯลฯ | z_coda | เพิ่มการสนับสนุน * |
| z_siot | Sai Shi Clothes * | |
| user0 ~ 4 | แท็กที่กำหนดเอง * |
* มันเป็นแท็กที่ไม่ซ้ำกันพร้อมแท็ก Sejong Partsa
จากรุ่น 0.12.0 สามารถเพิ่มคำต่อท้าย -R และ -I ลงในแท็ก VV , VA , VX และ XSA -R บ่งชี้ถึงการใช้กฎ -I บอกถึงการใช้งานที่ผิดปกติ
จากเวอร์ชัน 0.10.3 เราสนับสนุนฟังก์ชั่นการแยกประโยคทดลอง จากรุ่น 0.11.0 ความแม่นยำได้รับการปรับปรุงอย่างมีนัยสำคัญ โปรดดูหน้านี้สำหรับประสิทธิภาพของฟังก์ชั่นการแยกประโยค
คำเดียวสามารถวิเคราะห์ได้หลายวิธีดังนั้นกีวีจึงมีความแม่นยำสูงในสถานการณ์ที่จำเป็นต้องเห็นบริบท โปรดดูที่หน้านี้สำหรับประสิทธิภาพการบรรเทาความคลุมเครือ
โปรดดู Kiwi#การอ้างอิงสำหรับวิธีการเสนอราคา