문서에서 영어로된 문장을 분리하는 nltk sentence tokeninzer 를 이용하면 아주 쉽게 된다고 알려져 있다.( 링크 : nltk sentence tokeninzer )
from nltk.tokenize import sent_tokenize
text = "this's a sent tokenize test. this is sent two. is this sent three? sent 4 is cool! Now it's your turn."
sent_tokenize_list = sent_tokenize(text)
print(str(sent_tokenize_list))
이런 코드를 이용하여 nltk 의 sent_tokenizer 를 이용하면 “. “ 을 기준으로 문서에 있는 문장들이 분리가 된다. 하지만 영어는 Mr., Dr.와 같은 단어를 문장을 분리 하기도 한다.
이런 경우는 어떻게 처리해야 할까? 일일이 Mr., Dr. 단어를 찾아서 문장으로 분리 하지 않도록 해야 할까?
이를 위한 방법이 PunktSentenceTokenizer 다. PunktSentence Tokeninzer 는 NLTK에서 제공되는 기본 문장 토크 나이저의 추상 클래스로 이를 이용하여 기존에 정제된 문장을 학습 시키고, 문장을 나누는 규칙을 추가하여 Custom Sentence Tokeninzer 를 구현 할 수 있다.
다시 말해 PunktSentenceTokenizer 는 학습 가능한 Tokenizer 다. 문장으로 분리되지 않은 문서를 입력값으로 받아 Train 하여 새로운 Tokenizer Model 을 만들어 낼 수 있다는 것이다.
이런 PunktSetenceTokenizer 를 사용 하는 방법은 살펴 보도록 하자
1. PunktSentenceTokenizer 기본 문장 분리기
기본적인 setence tokenizer 로 nltk의 sent_tokenizer 와 동일하게 동작 한다.
from nltk import sent_tokenize
sentence = "My msc. is broken. so that is in the shop."
print(sent_tokenize(sentence))
2. PunktSentenceTokenizer 로 추가 학습한 문장 분리기
2- 1) 추가 학습을 위해서는 학습 데이터가 필요한데, 이 학습 데이터는 nltk 에서 기 본적을 제공하는 gutenberg(구텐베르그) 성경 문서를 이용한고자 한다. 이를 위해서 아래와 같은 코드로 input_text 변수에 gutenberg(구텐베르그) 성경 문서를 할당한다.
from nltk.corpus import gutenberg
input_text = ""
for file_id in gutenberg.fileids():
input_text += gutenberg.raw(file_id)print(input_text)
2-2) gutenberg(구텐베르그) 성경 문서를 이용하여 PunktSentenceTokenizer 학습한 PunktSentenceTokenizer 를 사용하면 Msc. ~~~ 에서 Msc. 가 하나의 문장으로 구분되어 잘못 분리 되는 것을 알 수 있다.
from nltk.tokenize.punkt import PunktSentenceTokenizer, PunktTrainer
from nltk.corpus import gutenberg
input_text = ""
for file_id in gutenberg.fileids():
input_text += gutenberg.raw(file_id)
print(input_text)
trainer = PunktTrainer()
trainer.INCLUDE_ALL_COLLOCS = True
trainer.train(input_text)
tokenizer = PunktSentenceTokenizer(trainer.get_params())
sentences = "My Msc. is broken. so that is in the shop."
print(tokenizer.tokenize(sentences))
이를 해결 하기 위해서는 예외 규칙을 아래와 같이 추가 하면 된다.(주의 :추가하는 예외 규칙 단어는 소문자로 입력해야한다.)
from nltk.tokenize.punkt import PunktSentenceTokenizer, PunktTrainer
from nltk.corpus import gutenberg
input_text = ""
for file_id in gutenberg.fileids():
input_text += gutenberg.raw(file_id)
print(input_text)
trainer = PunktTrainer()
trainer.INCLUDE_ALL_COLLOCS = True
trainer.train(input_text)
tokenizer._params.abbrev_types.add('msc')
tokenizer = PunktSentenceTokenizer(trainer.get_params())
sentences = "My Msc. is broken. so that is in the shop."
print(tokenizer.tokenize(sentences))
'개발' 카테고리의 다른 글
ubuntu snap 에서 proxy 설정 (0) | 2020.06.04 |
---|---|
OSX 에서 make[build] 실행시 Fatal error: ‘openssl/ssl.h’ file not found 해결 방법 (0) | 2020.06.04 |
OFFICE WORD, EXCEL… ADDIN + InstallShield, Setup File Make (0) | 2020.06.04 |
CUDA 10 + TORCH 설치 방법 (0) | 2020.06.04 |
UBUNTU 에서 Unable to find the requested Boost libraries, Could NOT find GTest 에러 해결 방법 (0) | 2020.06.04 |